diff options
author | Matt Caswell <matt@openssl.org> | 2018-11-21 12:57:04 +0100 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2018-12-10 11:17:43 +0100 |
commit | 3cb4e7dc1cf92022f62b9bbdd59695885a1265ff (patch) | |
tree | 3ea32097cec47a62f731f88518206778950b88d7 /crypto/dso/dso_dlfcn.c | |
parent | Make sure build_SYS_str_reasons() preserves errno (diff) | |
download | openssl-3cb4e7dc1cf92022f62b9bbdd59695885a1265ff.tar.xz openssl-3cb4e7dc1cf92022f62b9bbdd59695885a1265ff.zip |
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@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/7680)
Diffstat (limited to 'crypto/dso/dso_dlfcn.c')
-rw-r--r-- | crypto/dso/dso_dlfcn.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/crypto/dso/dso_dlfcn.c b/crypto/dso/dso_dlfcn.c index 823dfe9029..5e98513441 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; |