fix: copy_struct_from_user() wrapper
authorMichael Jeanson <mjeanson@efficios.com>
Tue, 16 Jul 2024 19:16:18 +0000 (15:16 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 16 Jul 2024 19:53:36 +0000 (15:53 -0400)
* 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 <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/wrapper/bitops.h [new file with mode: 0644]
include/wrapper/uaccess.h

diff --git a/include/wrapper/bitops.h b/include/wrapper/bitops.h
new file mode 100644 (file)
index 0000000..01f6326
--- /dev/null
@@ -0,0 +1,22 @@
+// SPDX-FileCopyrightText: 2024 Michael Jeanson <mjeanson@efficios.com>
+// SPDX-License-Identifier: GPL-2.0-only
+
+#ifndef _LTTNG_WRAPPER_BITOPS_H
+#define _LTTNG_WRAPPER_BITOPS_H
+
+#include <linux/bitops.h>
+#include <linux/bits.h>
+#include <lttng/kernel-version.h>
+
+#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 */
index eb1e4b20f0771d1d653b812e5de15a33660cb213..e716368765ab749d052d5f069e9fe42ee6a264dc 100644 (file)
@@ -11,6 +11,7 @@
 #define _LTTNG_WRAPPER_UACCESS_H
 
 #include <linux/uaccess.h>
+#include <wrapper/bitops.h>
 #include <lttng/kernel-version.h>
 
 #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);
This page took 0.028722 seconds and 4 git commands to generate.