diff options
author | Miklos Szeredi <mszeredi@redhat.com> | 2018-10-15 15:43:06 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2020-04-13 10:45:05 +0200 |
commit | 442d7668a54d27b60033e5c4bc73303c21b0f52e (patch) | |
tree | 3d91bfc08f3ef0035a1f95334c2e9c74dc77265f /include | |
parent | bf498d6b8d6017c7e1c7908190fa57508f823268 (diff) | |
download | linux-stable-442d7668a54d27b60033e5c4bc73303c21b0f52e.tar.gz linux-stable-442d7668a54d27b60033e5c4bc73303c21b0f52e.tar.bz2 linux-stable-442d7668a54d27b60033e5c4bc73303c21b0f52e.zip |
bitops: protect variables in set_mask_bits() macro
commit 18127429a854e7607b859484880b8e26cee9ddab upstream.
Unprotected naming of local variables within the set_mask_bits() can easily
lead to using the wrong scope.
Noticed this when "set_mask_bits(&foo->bar, 0, mask)" behaved as no-op.
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Fixes: 00a1a053ebe5 ("ext4: atomically set inode->i_flags in ext4_set_inode_flags()")
Cc: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/bitops.h | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/include/linux/bitops.h b/include/linux/bitops.h index 7ac2e46112b7..e02cbca3cfaf 100644 --- a/include/linux/bitops.h +++ b/include/linux/bitops.h @@ -236,17 +236,17 @@ static __always_inline void __assign_bit(long nr, volatile unsigned long *addr, #ifdef __KERNEL__ #ifndef set_mask_bits -#define set_mask_bits(ptr, _mask, _bits) \ +#define set_mask_bits(ptr, mask, bits) \ ({ \ - const typeof(*ptr) mask = (_mask), bits = (_bits); \ - typeof(*ptr) old, new; \ + const typeof(*(ptr)) mask__ = (mask), bits__ = (bits); \ + typeof(*(ptr)) old__, new__; \ \ do { \ - old = READ_ONCE(*ptr); \ - new = (old & ~mask) | bits; \ - } while (cmpxchg(ptr, old, new) != old); \ + old__ = READ_ONCE(*(ptr)); \ + new__ = (old__ & ~mask__) | bits__; \ + } while (cmpxchg(ptr, old__, new__) != old__); \ \ - new; \ + new__; \ }) #endif |