Use parentheses around uses of the argument in u64_to_user_ptr() to ensure that the cast doesn't apply to part of the argument.
There are existing uses of the macro of the form `u64_to_user_ptr(A + B)`, which expands to `(void __user *)(uintptr_t)A + B` (the cast applies to the first operand of the addition, the addition is a pointer addition). This happens to still work as intended, the semantic difference doesn't cause a difference in behavior. But I want to use u64_to_user_ptr() with a ternary operator in the argument, like so: `u64_to_user_ptr(A ? B : C)`. This currently doesn't work as intended. Fixes: f09174c501f8 ("x86: add user_atomic_cmpxchg_inatomic at uaccess.h") Signed-off-by: Jann Horn <ja...@google.com> --- Can we take this patch through the x86 tree with the following one, or do we need to get this one through akpm's tree first? include/linux/kernel.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 34a5036debd3..2d14e21c16c0 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -47,8 +47,8 @@ #define u64_to_user_ptr(x) ( \ { \ - typecheck(u64, x); \ - (void __user *)(uintptr_t)x; \ + typecheck(u64, (x)); \ + (void __user *)(uintptr_t)(x); \ } \ ) -- 2.21.0.392.gf8f6787159e-goog