Commit ccceda84 authored by Matt Caswell's avatar Matt Caswell
Browse files

Don't leave stale errors on queue if DSO_dsobyaddr() fails



The init code uses DSO_dsobyaddr() to leak a reference to ourselves to
ensure we remain loaded until atexit() time. In some circumstances that
can fail and leave stale errors on the error queue.

Fixes #3372

Reviewed-by: default avatarRichard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/3383)
(cherry picked from commit 689f112d)
parent 6e7e171d
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -104,13 +104,15 @@ DEFINE_RUN_ONCE_STATIC(ossl_init_base)
# else
    /*
     * Deliberately leak a reference to ourselves. This will force the library
     * to remain loaded until the atexit() handler is run a process exit.
     * to remain loaded until the atexit() handler is run at process exit.
     */
    {
        DSO *dso = NULL;

        ERR_set_mark();
        dso = DSO_dsobyaddr(&base_inited, DSO_FLAG_NO_UNLOAD_ON_FREE);
        DSO_free(dso);
        ERR_pop_to_mark();
    }
# endif
#endif
@@ -645,8 +647,10 @@ int OPENSSL_atexit(void (*handler)(void))
        {
            DSO *dso = NULL;

            ERR_set_mark();
            dso = DSO_dsobyaddr(handlersym.sym, DSO_FLAG_NO_UNLOAD_ON_FREE);
            DSO_free(dso);
            ERR_pop_to_mark();
        }
# endif
    }