From 689f112d9806fa4a0c2f8c108226639455bc770d Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Thu, 4 May 2017 12:51:18 +0100 Subject: [PATCH] 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: Richard Levitte (Merged from https://github.com/openssl/openssl/pull/3383) --- crypto/init.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crypto/init.c b/crypto/init.c index 8036654c11..265d54d807 100644 --- a/crypto/init.c +++ b/crypto/init.c @@ -107,13 +107,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 @@ -648,8 +650,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 } -- 2.25.1