]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Linux 6.8 compat: implement strlcpy fallback
authorRob Norris <robn@despairlabs.com>
Tue, 23 Jan 2024 05:34:49 +0000 (16:34 +1100)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 29 Jan 2024 19:36:07 +0000 (11:36 -0800)
Linux has removed strlcpy in favour of strscpy. This implements a
fallback implementation of strlcpy for this case.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Rob Norris <robn@despairlabs.com>
Sponsored-by: https://despairlabs.com/sponsor/
Closes #15805

config/kernel-strlcpy.m4 [new file with mode: 0644]
config/kernel.m4
include/os/linux/spl/sys/string.h
module/os/linux/spl/spl-kmem-cache.c
module/os/linux/spl/spl-kstat.c
module/os/linux/spl/spl-thread.c
module/os/linux/spl/spl-zone.c

diff --git a/config/kernel-strlcpy.m4 b/config/kernel-strlcpy.m4
new file mode 100644 (file)
index 0000000..c31cf52
--- /dev/null
@@ -0,0 +1,47 @@
+dnl #
+dnl # 6.8.x replaced strlcpy with strscpy. Check for both so we can provide
+dnl # appropriate fallbacks.
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_SRC_STRLCPY], [
+       ZFS_LINUX_TEST_SRC([kernel_has_strlcpy], [
+               #include <linux/string.h>
+       ], [
+               const char *src = "goodbye";
+               char dst[32];
+               size_t len;
+               len = strlcpy(dst, src, sizeof (dst));
+       ])
+])
+
+AC_DEFUN([ZFS_AC_KERNEL_SRC_STRSCPY], [
+       ZFS_LINUX_TEST_SRC([kernel_has_strscpy], [
+               #include <linux/string.h>
+       ], [
+               const char *src = "goodbye";
+               char dst[32];
+               ssize_t len;
+               len = strscpy(dst, src, sizeof (dst));
+       ])
+])
+
+AC_DEFUN([ZFS_AC_KERNEL_STRLCPY], [
+       AC_MSG_CHECKING([whether strlcpy() exists])
+       ZFS_LINUX_TEST_RESULT([kernel_has_strlcpy], [
+               AC_MSG_RESULT([yes])
+               AC_DEFINE(HAVE_KERNEL_STRLCPY, 1,
+                       [strlcpy() exists])
+       ], [
+               AC_MSG_RESULT([no])
+       ])
+])
+
+AC_DEFUN([ZFS_AC_KERNEL_STRSCPY], [
+       AC_MSG_CHECKING([whether strscpy() exists])
+       ZFS_LINUX_TEST_RESULT([kernel_has_strscpy], [
+               AC_MSG_RESULT([yes])
+               AC_DEFINE(HAVE_KERNEL_STRSCPY, 1,
+                       [strscpy() exists])
+       ], [
+               AC_MSG_RESULT([no])
+       ])
+])
index d25b65994f6f1892e595afc9c2994e52aa5f80dc..30bdd6579523ff27646614a5a43ec395f0200dc3 100644 (file)
@@ -149,6 +149,8 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
        ZFS_AC_KERNEL_SRC_SYSFS
        ZFS_AC_KERNEL_SRC_SET_SPECIAL_STATE
        ZFS_AC_KERNEL_SRC_STANDALONE_LINUX_STDARG
+       ZFS_AC_KERNEL_SRC_STRLCPY
+       ZFS_AC_KERNEL_SRC_STRSCPY
        ZFS_AC_KERNEL_SRC_PAGEMAP_FOLIO_WAIT_BIT
        ZFS_AC_KERNEL_SRC_ADD_DISK
        ZFS_AC_KERNEL_SRC_KTHREAD
@@ -294,6 +296,8 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
        ZFS_AC_KERNEL_SYSFS
        ZFS_AC_KERNEL_SET_SPECIAL_STATE
        ZFS_AC_KERNEL_STANDALONE_LINUX_STDARG
+       ZFS_AC_KERNEL_STRLCPY
+       ZFS_AC_KERNEL_STRSCPY
        ZFS_AC_KERNEL_PAGEMAP_FOLIO_WAIT_BIT
        ZFS_AC_KERNEL_ADD_DISK
        ZFS_AC_KERNEL_KTHREAD
index 38134dcf4c762893787bf98fe7e4a8ea8c15e87a..f44bf23eb326cbe708578ff363df144bbc26f3d4 100644 (file)
@@ -1 +1,50 @@
+/*
+ *  Copyright (C) 2007-2010 Lawrence Livermore National Security, LLC.
+ *  Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
+ *  Written by Brian Behlendorf <behlendorf1@llnl.gov>.
+ *  UCRL-CODE-235197
+ *
+ *  This file is part of the SPL, Solaris Porting Layer.
+ *
+ *  The SPL is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License as published by the
+ *  Free Software Foundation; either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ *  The SPL is distributed in the hope that it will be useful, but WITHOUT
+ *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ *  for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with the SPL.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _SPL_STRING_H
+#define        _SPL_STRING_H
+
 #include <linux/string.h>
+
+/* Fallbacks for kernel missing strlcpy */
+#ifndef HAVE_KERNEL_STRLCPY
+
+#if defined(HAVE_KERNEL_STRSCPY)
+/*
+ * strscpy is strlcpy, but returns an error on truncation. strlcpy is defined
+ * to return strlen(src), so detect error and override it.
+ */
+static inline size_t
+strlcpy(char *dest, const char *src, size_t size)
+{
+       ssize_t ret = strscpy(dest, src, size);
+       if (likely(ret > 0))
+               return ((size_t)ret);
+       return (strlen(src));
+}
+#else
+#error "no strlcpy fallback available"
+#endif
+
+#endif /* HAVE_KERNEL_STRLCPY */
+
+#endif /* _SPL_STRING_H */
index 4b15081715ac1f4e3c25340fd1bbd95f650c8ddb..42821ad602561a12026c5e275afe9daa242a19b0 100644 (file)
@@ -28,6 +28,7 @@
 #include <sys/timer.h>
 #include <sys/vmem.h>
 #include <sys/wait.h>
+#include <sys/string.h>
 #include <linux/slab.h>
 #include <linux/swap.h>
 #include <linux/prefetch.h>
index 4308581147a9799e6c1c9d5357ee1605fb3e60aa..ad553a73a69ea6bae1398500429b6502314aef77 100644 (file)
@@ -32,6 +32,7 @@
 #include <sys/vmem.h>
 #include <sys/cmn_err.h>
 #include <sys/sysmacros.h>
+#include <sys/string.h>
 
 static kmutex_t kstat_module_lock;
 static struct list_head kstat_module_list;
index b4ef86a5e4a6f93d2167be6a42ca9a590231144e..ee3eb4690c3a7dc8bb62e80d8ff3e9af55b195de 100644 (file)
@@ -26,6 +26,7 @@
 #include <sys/thread.h>
 #include <sys/kmem.h>
 #include <sys/tsd.h>
+#include <sys/string.h>
 
 /*
  * Thread interfaces
index e821fbb4f3a124777194c04a88360cba2355c1f6..d0d0cca154a72c159e5dde480aa4e013f19b13a6 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/file.h>
 #include <linux/magic.h>
 #include <sys/zone.h>
+#include <sys/string.h>
 
 #if defined(CONFIG_USER_NS)
 #include <linux/statfs.h>