Commit 3cb4e7dc authored by Matt Caswell's avatar Matt Caswell
Browse files

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: default avatarRichard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/7680)
parent 71b1ceff
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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;