From 62ade6fb240494f8133ede65129d1fd5c2c862a9 Mon Sep 17 00:00:00 2001 From: Richard Kojedzinszky Date: Fri, 3 Jan 2025 17:36:35 +0100 Subject: [PATCH] Fixes to zfs_strerror(), use strerror_r() if available. 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 badd920d2b8a..352a18f1e815 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 strlcat strlcpy gettid]) + AC_CHECK_FUNCS([execvpe issetugid mlockall strlcat strlcpy strerror_r gettid]) AC_SUBST(RM) ]) diff --git a/include/libzutil.h b/include/libzutil.h index d05d082a44f7..68d95abb7c84 100644 --- a/include/libzutil.h +++ b/include/libzutil.h @@ -276,13 +276,17 @@ _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]; - pthread_mutex_lock(&zfs_strerror_lock); - strlcpy(errbuf, strerror(errnum), sizeof(errbuf)); - pthread_mutex_unlock(&zfs_strerror_lock); +#if defined(HAVE_STRERROR_R) + (void) strerror_r(errnum, errbuf, sizeof(errbuf)); +#else + static pthread_mutex_t zfs_strerror_lock = PTHREAD_MUTEX_INITIALIZER; + + (void) pthread_mutex_lock(&zfs_strerror_lock); + (void) strlcpy(errbuf, strerror(errnum), sizeof(errbuf)); + (void) pthread_mutex_unlock(&zfs_strerror_lock); +#endif return errbuf; }