[openssl-commits] [openssl] master update

Matt Caswell matt at openssl.org
Mon Dec 10 10:25:52 UTC 2018


The branch master has been updated
       via  3cb4e7dc1cf92022f62b9bbdd59695885a1265ff (commit)
       via  71b1ceffc4c795f5db21861dd1016fbe23a53a53 (commit)
      from  f2f734d4f9e34643a1d3e5b79d2447cd643519f8 (commit)


- Log -----------------------------------------------------------------
commit 3cb4e7dc1cf92022f62b9bbdd59695885a1265ff
Author: Matt Caswell <matt at openssl.org>
Date:   Wed Nov 21 11:57:04 2018 +0000

    Preserve errno on dlopen
    
    For the same reasons as in the previous commit we must preserve errno
    across dlopen calls. Some implementations (e.g. solaris) do not preserve
    errno even on a successful dlopen call.
    
    Fixes #6953
    
    Reviewed-by: Richard Levitte <levitte at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/7680)

commit 71b1ceffc4c795f5db21861dd1016fbe23a53a53
Author: Matt Caswell <matt at openssl.org>
Date:   Wed Nov 21 11:44:42 2018 +0000

    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 <levitte at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/7680)

-----------------------------------------------------------------------

Summary of changes:
 crypto/dso/dso_dlfcn.c | 7 +++++++
 crypto/err/err.c       | 4 ++++
 e_os.h                 | 3 +++
 3 files changed, 14 insertions(+)

diff --git a/crypto/dso/dso_dlfcn.c b/crypto/dso/dso_dlfcn.c
index 823dfe9..5e98513 100644
--- a/crypto/dso/dso_dlfcn.c
+++ b/crypto/dso/dso_dlfcn.c
@@ -17,6 +17,7 @@
 #endif
 
 #include "dso_locl.h"
+#include "e_os.h"
 
 #ifdef DSO_DLFCN
 
@@ -99,6 +100,7 @@ static int dlfcn_load(DSO *dso)
     /* See applicable comments in dso_dl.c */
     char *filename = DSO_convert_filename(dso, NULL);
     int flags = DLOPEN_FLAG;
+    int saveerrno = get_last_sys_error();
 
     if (filename == NULL) {
         DSOerr(DSO_F_DLFCN_LOAD, DSO_R_NO_FILENAME);
@@ -118,6 +120,11 @@ static int dlfcn_load(DSO *dso)
         ERR_add_error_data(4, "filename(", filename, "): ", dlerror());
         goto err;
     }
+    /*
+     * Some dlopen() implementations (e.g. solaris) do no preserve errno, even
+     * on a successful call.
+     */
+    set_sys_error(saveerrno);
     if (!sk_void_push(dso->meth_data, (char *)ptr)) {
         DSOerr(DSO_F_DLFCN_LOAD, DSO_R_STACK_ERROR);
         goto err;
diff --git a/crypto/err/err.c b/crypto/err/err.c
index 11994c3..bc671c9 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 6cdd35e..9c0888e 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


More information about the openssl-commits mailing list