summarylogtreecommitdiffstats
path: root/0028-Linux-6.8-Use-roken-s-strlcpy-in-kernel-module.patch
diff options
context:
space:
mode:
Diffstat (limited to '0028-Linux-6.8-Use-roken-s-strlcpy-in-kernel-module.patch')
-rw-r--r--0028-Linux-6.8-Use-roken-s-strlcpy-in-kernel-module.patch156
1 files changed, 156 insertions, 0 deletions
diff --git a/0028-Linux-6.8-Use-roken-s-strlcpy-in-kernel-module.patch b/0028-Linux-6.8-Use-roken-s-strlcpy-in-kernel-module.patch
new file mode 100644
index 000000000000..16b7091a1d7e
--- /dev/null
+++ b/0028-Linux-6.8-Use-roken-s-strlcpy-in-kernel-module.patch
@@ -0,0 +1,156 @@
+From b6458796f2deef285fd0ad06480b5fc35cd8acb3 Mon Sep 17 00:00:00 2001
+From: Cheyenne Wills <cwills@sinenomine.net>
+Date: Mon, 11 Mar 2024 09:05:33 -0600
+Subject: [PATCH 28/29] Linux 6.8: Use roken's strlcpy() in kernel module
+
+The Linux 6.8 commit 'string: Remove strlcpy()' (d26270061a) removed the
+the strlcpy function from the Linux kernel. The replacement function,
+strscpy(), cannot be used as a drop-in replacement as its currently a
+Linux kernel specific function and there are differences in the returned
+value.
+
+We can use roken's strlcpy() (provided in roken/strlcpy.c).
+
+Create a configure test to that defines its own strlcpy() to test
+if the kernel doesn't provide one itself. Note, we need to use a
+different function signature for strlcpy() from what the kernel might
+have otherwise the test build succeeds when the kernel does provide a
+strlcpy().
+
+Update the OpenAFS kernel specific roken.h to define the prototype for
+strlcpy when it's not present in the Linux kernel. We need to match the
+defines used in the 'real' roken.h so the roken/strlcpy.c can build
+properly. Add defines for ROKEN_LIB_FUNCTION, ROKEN_LIB_CALL and
+ROKEN_LIB_VARIABLE to the kernel roken.h
+
+Update Linux's osi_machdep.h to include roken.h so the strlcpy protoype
+is available.
+
+Update the Linux MakefileProto to include the strcpy-kernel object
+when building the kernel module.
+
+Reviewed-on: https://gerrit.openafs.org/15646
+Tested-by: BuildBot <buildbot@rampaginggeek.com>
+Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
+(cherry picked from commit 30b18c165752e6d0ce7b6daa6a90453f5e5e6d17)
+
+Change-Id: I8013623e8f735d15bb7d4ac84ed0867f12b77783
+---
+ src/afs/LINUX/osi_machdep.h | 1 +
+ src/cf/linux-kernel-func.m4 | 11 +++++++++++
+ src/crypto/hcrypto/kernel/roken.h | 29 +++++++++++++++++++++++++++++
+ src/external/libafsdep | 1 +
+ src/libafs/MakefileProto.LINUX.in | 6 ++++--
+ 5 files changed, 46 insertions(+), 2 deletions(-)
+
+diff --git a/src/afs/LINUX/osi_machdep.h b/src/afs/LINUX/osi_machdep.h
+index 916a1dfed..263c8633c 100644
+--- a/src/afs/LINUX/osi_machdep.h
++++ b/src/afs/LINUX/osi_machdep.h
+@@ -77,6 +77,7 @@
+ #endif
+
+ #include "afs/sysincludes.h"
++#include "roken.h"
+
+ #if !defined(HAVE_LINUX_TIME_T)
+ typedef time64_t time_t;
+diff --git a/src/cf/linux-kernel-func.m4 b/src/cf/linux-kernel-func.m4
+index 7f3000fc1..6f9d35022 100644
+--- a/src/cf/linux-kernel-func.m4
++++ b/src/cf/linux-kernel-func.m4
+@@ -252,6 +252,17 @@ AC_CHECK_LINUX_FUNC([inode_atime_mtime_accessors],
+ [inode_set_atime(NULL, 0, 0);
+ inode_set_mtime(NULL, 0, 0);])
+
++dnl Linux 6.8 removed the strlcpy() function. We test to see if we can redefine
++dnl a strlcpy() function. We use a totally different function signature to
++dnl to ensure that this fails when the kernel does provide strlcpy().
++AC_CHECK_LINUX_FUNC([no_strlcpy],
++ [[#include <linux/string.h>
++ size_t strlcpy(char *d);
++ size_t strlcpy(char *d) { return strlen(d); }]],
++ [[static char buff[10];
++ size_t s;
++ s = strlcpy(buff);]])
++
+ dnl Consequences - things which get set as a result of the
+ dnl above tests
+ AS_IF([test "x$ac_cv_linux_func_d_alloc_anon" = "xno"],
+diff --git a/src/crypto/hcrypto/kernel/roken.h b/src/crypto/hcrypto/kernel/roken.h
+index f8c233468..6cb060131 100644
+--- a/src/crypto/hcrypto/kernel/roken.h
++++ b/src/crypto/hcrypto/kernel/roken.h
+@@ -11,6 +11,35 @@
+ # error "This header is for kernel code only"
+ #endif
+
++/*
++ * The following function annotations are not needed when building for kernel
++ * space
++ */
++#define ROKEN_LIB_FUNCTION
++#define ROKEN_LIB_CALL
++#define ROKEN_LIB_VARIABLE
++
++/*
++ * Our HAVE_STRLCPY from autoconf refers to whether strlcpy() is available in
++ * userspace. Whether it's available in the kernel is another question, so
++ * override HAVE_STRLCPY here. Usually it is available (only a few cases lack
++ * it), so turn it on by default, and turn it off for a few cases below.
++ */
++#undef HAVE_STRLCPY
++#define HAVE_STRLCPY 1
++
++#ifdef AFS_AIX_ENV
++# undef HAVE_STRLCPY
++#elif defined(AFS_LINUX_ENV) && defined(HAVE_LINUX_NO_STRLCPY)
++# undef HAVE_STRLCPY
++#endif
++
++/* strlcpy.c */
++#if defined (AFS_LINUX_ENV) && !defined(HAVE_STRLCPY)
++# define strlcpy rk_strlcpy
++ROKEN_LIB_FUNCTION size_t ROKEN_LIB_CALL strlcpy (char *, const char *, size_t);
++#endif
++
+ /* ct.c */
+ int ct_memcmp(const void *p1, const void *p2, size_t len);
+
+diff --git a/src/external/libafsdep b/src/external/libafsdep
+index fb365df2d..9d36a30c0 100644
+--- a/src/external/libafsdep
++++ b/src/external/libafsdep
+@@ -24,3 +24,4 @@ heimdal/krb5/crypto-evp.c
+ heimdal/krb5/keyblock.c
+ heimdal/krb5/store-int.c
+ heimdal/roken/ct.c
++heimdal/roken/strlcpy.c
+\ No newline at end of file
+diff --git a/src/libafs/MakefileProto.LINUX.in b/src/libafs/MakefileProto.LINUX.in
+index 8744ab8b6..6e62c8c97 100644
+--- a/src/libafs/MakefileProto.LINUX.in
++++ b/src/libafs/MakefileProto.LINUX.in
+@@ -42,7 +42,8 @@ AFS_OS_OBJS = \
+ osi_ioctl.o \
+ osi_proc.o \
+ osi_vnodeops.o \
+- osi_pagecopy.o
++ osi_pagecopy.o \
++ strlcpy-kernel.o
+
+ AFS_OS_PAGOBJS = \
+ osi_alloc.o \
+@@ -59,7 +60,8 @@ AFS_OS_PAGOBJS = \
+ osi_flush.o \
+ <all>
+ osi_ioctl.o \
+- osi_pag_module.o
++ osi_pag_module.o \
++ strlcpy-kernel.o
+
+ AFS_OS_NFSOBJS =
+
+--
+2.44.0
+