Whamcloud - gitweb
LU-16118 build: Workaround __write_overflow_field errors 64/53264/2
authorShaun Tancheff <shaun.tancheff@hpe.com>
Tue, 28 Nov 2023 07:02:25 +0000 (23:02 -0800)
committerOleg Drokin <green@whamcloud.com>
Tue, 27 Feb 2024 05:40:40 +0000 (05:40 +0000)
Linux commit v5.17-rc3-1-gf68f2ff91512
   fortify: Detect struct member overflows in memcpy() at compile-time

memcpy and memset of collections of struct members
will trigger:

error: call to '__write_overflow_field' declared with attribute
   warning: detected write beyond size of field (1st parameter);
   maybe use struct_group()?
   [-Werror] __write_overflow_field(p_size_field, size);

Lustre-change: https://review.whamcloud.com/48364
Lustre-commit: a3a51806ef361f55421a1bc07f64c78730ae50d5

Test-Parameters: trivial
HPE-bug-id: LUS-11194
Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com>
Change-Id: Iacd1ab03d1b90ce62b5d7b65e1cd518a5f7981f2
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/53264
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
libcfs/include/libcfs/linux/linux-misc.h
lustre/include/cl_object.h
lustre/obdclass/md_attrs.c

index 9cab436..c271dc0 100644 (file)
@@ -183,4 +183,16 @@ static inline int kstrtoul(const char *s, unsigned int base, unsigned long *res)
 
 int kstrtobool_from_user(const char __user *s, size_t count, bool *res);
 #endif
+
+#ifndef memset_startat
+/** from linux 5.19 include/linux/string.h: */
+#define memset_startat(obj, v, member)                                 \
+({                                                                     \
+       u8 *__ptr = (u8 *)(obj);                                        \
+       typeof(v) __val = (v);                                          \
+       memset(__ptr + offsetof(typeof(*(obj)), member), __val,         \
+              sizeof(*(obj)) - offsetof(typeof(*(obj)), member));      \
+})
+#endif /* memset_startat() */
+
 #endif
index f0c8a5b..f9fc2a5 100644 (file)
@@ -99,6 +99,7 @@
 #include <linux/spinlock.h>
 #include <linux/wait.h>
 #include <linux/pagevec.h>
+#include <libcfs/linux/linux-misc.h>
 #include <lustre_dlm.h>
 
 struct obd_info;
@@ -2396,13 +2397,7 @@ struct cl_io *cl_io_top(struct cl_io *io);
 void cl_io_print(const struct lu_env *env, void *cookie,
                  lu_printer_t printer, const struct cl_io *io);
 
-#define CL_IO_SLICE_CLEAN(foo_io, base)                                        \
-do {                                                                   \
-       typeof(foo_io) __foo_io = (foo_io);                             \
-                                                                       \
-       memset(&__foo_io->base, 0,                                      \
-              sizeof(*__foo_io) - offsetof(typeof(*__foo_io), base));  \
-} while (0)
+#define CL_IO_SLICE_CLEAN(obj, base) memset_startat(obj, 0, base)
 
 /** @} cl_io */
 
index d0ca4f1..12c86e2 100644 (file)
@@ -73,8 +73,7 @@ void lustre_loa_init(struct lustre_ost_attrs *loa, const struct lu_fid *fid,
 {
        CLASSERT(sizeof(*loa) == LMA_OLD_SIZE);
 
-       memset(&loa->loa_parent_fid, 0,
-              sizeof(*loa) - offsetof(typeof(*loa), loa_parent_fid));
+       memset_startat(loa, 0, loa_parent_fid);
        lustre_lma_init(&loa->loa_lma, fid, compat, incompat);
 }
 EXPORT_SYMBOL(lustre_loa_init);