From: Christian Brauner Date: Mon, 10 Dec 2018 14:14:07 +0000 (+0100) Subject: log: thread-safety backports X-Git-Tag: lxc-2.0.10~55 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c619ba29a4f58291fa33f346a040923195e4076d;p=thirdparty%2Flxc.git log: thread-safety backports Signed-off-by: Christian Brauner --- diff --git a/configure.ac b/configure.ac index 649b57afd..3cbaddf26 100644 --- a/configure.ac +++ b/configure.ac @@ -654,6 +654,12 @@ AC_HEADER_MAJOR # Check for some syscalls functions AC_CHECK_FUNCS([setns pivot_root sethostname unshare rand_r confstr faccessat gettid memfd_create]) +# Check for strerror_r() support. Defines: +# - HAVE_STRERROR_R if available +# - HAVE_DECL_STRERROR_R if defined +# - STRERROR_R_CHAR_P if it returns char * +AC_FUNC_STRERROR_R + # Check for some functions AC_CHECK_LIB(pthread, main) AC_CHECK_FUNCS(pthread_atfork) diff --git a/src/lxc/console.c b/src/lxc/console.c index 6cc3aad08..d9f5b7ecc 100644 --- a/src/lxc/console.c +++ b/src/lxc/console.c @@ -21,15 +21,17 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "config.h" + #include #include #include #include #include -#include -#include #include #include +#include +#include #include @@ -37,12 +39,11 @@ #include "caps.h" #include "commands.h" #include "conf.h" -#include "config.h" #include "console.h" #include "log.h" #include "lxclock.h" #include "mainloop.h" -#include "start.h" /* for struct lxc_handler */ +#include "start.h" /* for struct lxc_handler */ #include "utils.h" #if HAVE_PTY_H diff --git a/src/lxc/log.h b/src/lxc/log.h index 6030809f7..d114f1f44 100644 --- a/src/lxc/log.h +++ b/src/lxc/log.h @@ -276,22 +276,44 @@ ATTR_UNUSED static inline void LXC_##LEVEL(struct lxc_log_locinfo* locinfo, \ /* * Helper macro to define errno string. */ -#if (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && !defined(_GNU_SOURCE) || IS_BIONIC -#define lxc_log_strerror_r \ - char errno_buf[MAXPATHLEN / 2] = {"Failed to get errno string"}; \ - char *ptr = errno_buf; \ - { \ - (void)strerror_r(errno, errno_buf, sizeof(errno_buf)); \ - } +#if HAVE_STRERROR_R + #ifndef HAVE_DECL_STRERROR_R + #ifdef STRERROR_R_CHAR_P + char *strerror_r(int errnum, char *buf, size_t buflen); + #else + int strerror_r(int errnum, char *buf, size_t buflen); + #endif + #endif + + #ifdef STRERROR_R_CHAR_P + #define lxc_log_strerror_r \ + char errno_buf[PATH_MAX / 2] = {"Failed to get errno string"}; \ + char *ptr = NULL; \ + { \ + int saved_errno = errno; \ + ptr = strerror_r(errno, errno_buf, sizeof(errno_buf)); \ + errno = saved_errno; \ + if (!ptr) \ + ptr = errno_buf; \ + } + #else + #define lxc_log_strerror_r \ + char errno_buf[PATH_MAX / 2] = {"Failed to get errno string"}; \ + char *ptr = errno_buf; \ + { \ + int saved_errno = errno; \ + (void)strerror_r(errno, errno_buf, sizeof(errno_buf)); \ + errno = saved_errno; \ + } + #endif +#elif ENFORCE_THREAD_SAFETY + #error ENFORCE_THREAD_SAFETY was set but cannot be guaranteed #else -#define lxc_log_strerror_r \ - char errno_buf[MAXPATHLEN / 2] = {"Failed to get errno string"}; \ - char *ptr; \ - { \ - ptr = strerror_r(errno, errno_buf, sizeof(errno_buf)); \ - if (!ptr) \ - ptr = errno_buf; \ - } + #define lxc_log_strerror_r \ + char *ptr = NULL; \ + { \ + ptr = strerror(errno); \ + } #endif /*