From 318158206e408796bd8c90fce28aa6e51eb32a6a Mon Sep 17 00:00:00 2001 From: Michael Jeanson Date: Tue, 16 Jul 2024 15:16:18 -0400 Subject: [PATCH] fix: copy_struct_from_user() wrapper * Add 'static inline' to lttng_check_zeroed_user() * Add missing parenthesis in lttng_check_zeroed_user() * Add wrapper for aligned_byte_mask() Change-Id: I92f3bce14ac91e896148d455de2ae0634b4d7972 Signed-off-by: Michael Jeanson Signed-off-by: Mathieu Desnoyers --- include/wrapper/bitops.h | 22 ++++++++++++++++++++++ include/wrapper/uaccess.h | 8 +++++--- 2 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 include/wrapper/bitops.h diff --git a/include/wrapper/bitops.h b/include/wrapper/bitops.h new file mode 100644 index 00000000..01f63262 --- /dev/null +++ b/include/wrapper/bitops.h @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: 2024 Michael Jeanson +// SPDX-License-Identifier: GPL-2.0-only + +#ifndef _LTTNG_WRAPPER_BITOPS_H +#define _LTTNG_WRAPPER_BITOPS_H + +#include +#include +#include + +#if LTTNG_LINUX_VERSION_CODE < LTTNG_KERNEL_VERSION(5,4,0) + +/* Set bits in the first 'n' bytes when loaded from memory */ +# ifdef __LITTLE_ENDIAN +# define lttng_aligned_byte_mask(n) ((1UL << 8*(n))-1) +# else +# define lttng_aligned_byte_mask(n) (~0xffUL << (BITS_PER_LONG - 8 - 8*(n))) +# endif + +#endif + +#endif /* _LTTNG_WRAPPER_BITOPS_H */ diff --git a/include/wrapper/uaccess.h b/include/wrapper/uaccess.h index eb1e4b20..e7163687 100644 --- a/include/wrapper/uaccess.h +++ b/include/wrapper/uaccess.h @@ -11,6 +11,7 @@ #define _LTTNG_WRAPPER_UACCESS_H #include +#include #include #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,0,0) || \ @@ -48,6 +49,7 @@ lttng_copy_struct_from_user(void *dst, size_t ksize, const void __user *src, * * 1: The buffer was full of zero bytes. * * -EFAULT: access to userspace failed. */ +static inline int lttng_check_zeroed_user(const void __user *from, size_t size) { unsigned long val; @@ -60,14 +62,14 @@ int lttng_check_zeroed_user(const void __user *from, size_t size) from -= align; size += align; - if (!lttng_access_ok(VERIFY_READ, from, size) + if (!lttng_access_ok(VERIFY_READ, from, size)) return -EFAULT; ret = get_user(val, (unsigned long __user *) from); if (ret) return ret; if (align) - val &= ~aligned_byte_mask(align); + val &= ~lttng_aligned_byte_mask(align); while (size > sizeof(unsigned long)) { if (unlikely(val)) @@ -82,7 +84,7 @@ int lttng_check_zeroed_user(const void __user *from, size_t size) } if (size < sizeof(unsigned long)) - val &= aligned_byte_mask(size); + val &= lttng_aligned_byte_mask(size); done: return (val == 0); -- 2.34.1