ERR: preserve system error number in a few more places

It turns out that intialization may change the error number, so we
need to preserve the system error number in functions where
initialization is called for.
These are ERR_get_state() and err_shelve_state()

Fixes #7897

Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/7902)

(cherry picked from commit 91c5473035)
This commit is contained in:
Richard Levitte 2018-12-14 19:33:55 +01:00
parent faafe140a8
commit 145419423e

View file

@ -697,6 +697,7 @@ DEFINE_RUN_ONCE_STATIC(err_do_init)
ERR_STATE *ERR_get_state(void) ERR_STATE *ERR_get_state(void)
{ {
ERR_STATE *state; ERR_STATE *state;
int saveerrno = get_last_sys_error();
if (!OPENSSL_init_crypto(OPENSSL_INIT_BASE_ONLY, NULL)) if (!OPENSSL_init_crypto(OPENSSL_INIT_BASE_ONLY, NULL))
return NULL; return NULL;
@ -728,6 +729,7 @@ ERR_STATE *ERR_get_state(void)
OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL);
} }
set_sys_error(saveerrno);
return state; return state;
} }
@ -737,6 +739,8 @@ ERR_STATE *ERR_get_state(void)
*/ */
int err_shelve_state(void **state) int err_shelve_state(void **state)
{ {
int saveerrno = get_last_sys_error();
if (!OPENSSL_init_crypto(OPENSSL_INIT_BASE_ONLY, NULL)) if (!OPENSSL_init_crypto(OPENSSL_INIT_BASE_ONLY, NULL))
return 0; return 0;
@ -747,6 +751,7 @@ int err_shelve_state(void **state)
if (!CRYPTO_THREAD_set_local(&err_thread_local, (ERR_STATE*)-1)) if (!CRYPTO_THREAD_set_local(&err_thread_local, (ERR_STATE*)-1))
return 0; return 0;
set_sys_error(saveerrno);
return 1; return 1;
} }