From: Matt Caswell Date: Wed, 21 Nov 2018 11:44:42 +0000 (+0000) Subject: Make sure build_SYS_str_reasons() preserves errno X-Git-Tag: openssl-3.0.0-alpha1~2723 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=71b1ceffc4c795f5db21861dd1016fbe23a53a53;p=oweals%2Fopenssl.git Make sure build_SYS_str_reasons() preserves errno This function can end up being called during ERR_get_error() if we are initialising. ERR_get_error() must preserve errno since it gets called via SSL_get_error(). If that function returns SSL_ERROR_SYSCALL then you are supposed to inspect errno. Reviewed-by: Richard Levitte (Merged from https://github.com/openssl/openssl/pull/7680) --- diff --git a/crypto/err/err.c b/crypto/err/err.c index 11994c3921..bc671c9119 100644 --- a/crypto/err/err.c +++ b/crypto/err/err.c @@ -21,6 +21,7 @@ #include "internal/thread_once.h" #include "internal/ctype.h" #include "internal/constant_time_locl.h" +#include "e_os.h" static int err_load_strings(const ERR_STRING_DATA *str); @@ -206,6 +207,7 @@ static void build_SYS_str_reasons(void) size_t cnt = 0; static int init = 1; int i; + int saveerrno = get_last_sys_error(); CRYPTO_THREAD_write_lock(err_string_lock); if (!init) { @@ -251,6 +253,8 @@ static void build_SYS_str_reasons(void) init = 0; CRYPTO_THREAD_unlock(err_string_lock); + /* openssl_strerror_r could change errno, but we want to preserve it */ + set_sys_error(saveerrno); err_load_strings(SYS_str_reasons); } #endif diff --git a/e_os.h b/e_os.h index 6cdd35e6e1..9c0888e436 100644 --- a/e_os.h +++ b/e_os.h @@ -49,6 +49,7 @@ # define get_last_sys_error() errno # define clear_sys_error() errno=0 +# define set_sys_error(e) errno=(e) /******************************************************************** The Microsoft section @@ -66,8 +67,10 @@ # ifdef WIN32 # undef get_last_sys_error # undef clear_sys_error +# undef set_sys_error # define get_last_sys_error() GetLastError() # define clear_sys_error() SetLastError(0) +# define set_sys_error(e) SetLastError(e) # if !defined(WINNT) # define WIN_CONSOLE_BUG # endif