From cfb5106fd770a4e4a4999453f8b2e2d2594f236c Mon Sep 17 00:00:00 2001 From: Richard Kojedzinszky Date: Fri, 3 Jan 2025 17:04:15 +0100 Subject: [PATCH 1/2] fix: make zfs_strerror really thread-safe and portable Fixes https://github.com/openzfs/zfs/pull/15793 Fixes https://github.com/openzfs/zfs/pull/16640 Signed-off-by: Richard Kojedzinszky --- config/user.m4 | 2 +- include/libzutil.h | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/config/user.m4 b/config/user.m4 index 4e31745a2abc..badd920d2b8a 100644 --- a/config/user.m4 +++ b/config/user.m4 @@ -33,7 +33,7 @@ AC_DEFUN([ZFS_AC_CONFIG_USER], [ ZFS_AC_CONFIG_USER_MAKEDEV_IN_MKDEV ZFS_AC_CONFIG_USER_ZFSEXEC - AC_CHECK_FUNCS([execvpe issetugid mlockall strerror_l strlcat strlcpy gettid]) + AC_CHECK_FUNCS([execvpe issetugid mlockall strlcat strlcpy gettid]) AC_SUBST(RM) ]) diff --git a/include/libzutil.h b/include/libzutil.h index f8712340cc5e..d05d082a44f7 100644 --- a/include/libzutil.h +++ b/include/libzutil.h @@ -27,7 +27,7 @@ #define _LIBZUTIL_H extern __attribute__((visibility("default"))) #include -#include +#include #include #include @@ -276,11 +276,15 @@ _LIBZUTIL_H void update_vdev_config_dev_sysfs_path(nvlist_t *nv, * Thread-safe strerror() for use in ZFS libraries */ static inline char *zfs_strerror(int errnum) { -#ifdef HAVE_STRERROR_L - return (strerror_l(errnum, uselocale(0))); -#else - return (strerror(errnum)); -#endif + static __thread char errbuf[2048]; + static __thread pthread_mutex_t zfs_strerror_lock = + PTHREAD_MUTEX_INITIALIZER; + + pthread_mutex_lock(&zfs_strerror_lock); + strlcpy(errbuf, strerror(errnum), sizeof(errbuf)); + pthread_mutex_unlock(&zfs_strerror_lock); + + return errbuf; } #ifdef __cplusplus From af53b7d9123ff1e650e13d644052eb9a6c9f3bed Mon Sep 17 00:00:00 2001 From: Richard Kojedzinszky Date: Fri, 3 Jan 2025 17:36:35 +0100 Subject: [PATCH 2/2] Fixes to zfs_strerror() Signed-off-by: Richard Kojedzinszky --- include/libzutil.h | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/include/libzutil.h b/include/libzutil.h index d05d082a44f7..bcfe2fcf7960 100644 --- a/include/libzutil.h +++ b/include/libzutil.h @@ -276,15 +276,14 @@ _LIBZUTIL_H void update_vdev_config_dev_sysfs_path(nvlist_t *nv, * Thread-safe strerror() for use in ZFS libraries */ static inline char *zfs_strerror(int errnum) { - static __thread char errbuf[2048]; - static __thread pthread_mutex_t zfs_strerror_lock = - PTHREAD_MUTEX_INITIALIZER; + static __thread char errbuf[512]; + static pthread_mutex_t zfs_strerror_lock = PTHREAD_MUTEX_INITIALIZER; - pthread_mutex_lock(&zfs_strerror_lock); - strlcpy(errbuf, strerror(errnum), sizeof(errbuf)); - pthread_mutex_unlock(&zfs_strerror_lock); + (void) pthread_mutex_lock(&zfs_strerror_lock); + (void) strlcpy(errbuf, strerror(errnum), sizeof (errbuf)); + (void) pthread_mutex_unlock(&zfs_strerror_lock); - return errbuf; + return (errbuf); } #ifdef __cplusplus