From 21e001747d4a246827ad432fc508d67ac404ecdb Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Sun, 8 May 2016 17:01:09 +0200 Subject: [PATCH] Restore the ERR_remove_thread_state() API and make it a no-op The ERR_remove_thread_state() API is restored to take a pointer argument, but does nothing more. ERR_remove_state() is also made into a no-op. Both functions are deprecated and users are recommended to use OPENSSL_thread_stop() instead. Documentation is changed to reflect this. Reviewed-by: Matt Caswell --- crypto/err/err.c | 9 ++++++-- crypto/include/internal/err_int.h | 1 + crypto/init.c | 4 ++-- doc/crypto/ERR_remove_state.pod | 34 +++++++++++++++---------------- doc/crypto/err.pod | 9 ++++---- include/openssl/err.h | 5 ++--- 6 files changed, 32 insertions(+), 30 deletions(-) diff --git a/crypto/err/err.c b/crypto/err/err.c index b0fd19e7ae..fd2ea8194a 100644 --- a/crypto/err/err.c +++ b/crypto/err/err.c @@ -740,7 +740,7 @@ const char *ERR_reason_error_string(unsigned long e) return ((p == NULL) ? NULL : p->string); } -void ERR_remove_thread_state(void) +void err_delete_thread_state(void) { ERR_STATE *state = ERR_get_state(); if (state == NULL) @@ -750,10 +750,15 @@ void ERR_remove_thread_state(void) ERR_STATE_free(state); } +#if OPENSSL_API_COMPAT < 0x10000000L +void ERR_remove_thread_state(void *dummy) +{ +} +#endif + #if OPENSSL_API_COMPAT < 0x10000000L void ERR_remove_state(unsigned long pid) { - ERR_remove_thread_state(); } #endif diff --git a/crypto/include/internal/err_int.h b/crypto/include/internal/err_int.h index 7f1037e939..0aebe8466e 100644 --- a/crypto/include/internal/err_int.h +++ b/crypto/include/internal/err_int.h @@ -13,5 +13,6 @@ void err_load_crypto_strings_int(void); void err_cleanup(void); +void err_delete_thread_state(void); #endif diff --git a/crypto/init.c b/crypto/init.c index 48f74c496c..938bf78a39 100644 --- a/crypto/init.c +++ b/crypto/init.c @@ -351,9 +351,9 @@ static void ossl_init_thread_stop(struct thread_local_inits_st *locals) if (locals->err_state) { #ifdef OPENSSL_INIT_DEBUG fprintf(stderr, "OPENSSL_INIT: ossl_init_thread_stop: " - "ERR_remove_thread_state()\n"); + "err_delete_thread_state()\n"); #endif - ERR_remove_thread_state(); + err_delete_thread_state(); } OPENSSL_free(locals); diff --git a/doc/crypto/ERR_remove_state.pod b/doc/crypto/ERR_remove_state.pod index b011182c47..944365d89c 100644 --- a/doc/crypto/ERR_remove_state.pod +++ b/doc/crypto/ERR_remove_state.pod @@ -2,44 +2,42 @@ =head1 NAME -ERR_remove_thread_state, ERR_remove_state - free a thread's error queue +ERR_remove_thread_state, ERR_remove_state - DEPRECATED =head1 SYNOPSIS - #include - - void ERR_remove_thread_state(void); - Deprecated: #if OPENSSL_API_COMPAT < 0x10000000L void ERR_remove_state(unsigned long pid); #endif -=head1 DESCRIPTION + #if OPENSSL_API_COMPAT < 0x10100000L + void ERR_remove_thread_state(void *); + #endif -ERR_remove_thread_state() frees the error queue associated with the current -thread. +=head1 DESCRIPTION -Since error queue data structures are allocated automatically for new -threads, they must be freed when threads are terminated in order to -avoid memory leaks. +The functions described here were used to free the error queue +associated with the current or specificed thread. -ERR_remove_state is deprecated and has been replaced by -ERR_remove_thread_state. Any argument to this function is ignored and -calling ERR_remove_state is equivalent to B. +They are now deprecated and do nothing, please use +OPENSSL_thread_stop() instead. =head1 RETURN VALUE -ERR_remove_thread_state and ERR_remove_state() return no value. +The functions described here return no value. =head1 SEE ALSO -L +L, L =head1 HISTORY -ERR_remove_state() -was deprecated in OpenSSL 1.0.0 when ERR_remove_thread_state() was introduced. +ERR_remove_state() was deprecated in OpenSSL 1.0.0 when +ERR_remove_thread_state() was introduced. + +ERR_remove_thread_state() was deprecated in OpenSSL 1.1.0 when the +thread handling functionality was entirely rewritten. =cut diff --git a/doc/crypto/err.pod b/doc/crypto/err.pod index 33cb19d0cf..a590cd756a 100644 --- a/doc/crypto/err.pod +++ b/doc/crypto/err.pod @@ -22,7 +22,6 @@ err - error codes int ERR_GET_REASON(unsigned long e); void ERR_clear_error(void); - void ERR_remove_thread_state(void); char *ERR_error_string(unsigned long e, char *buf); const char *ERR_lib_error_string(unsigned long e); @@ -48,6 +47,10 @@ Deprecated: void ERR_remove_state(unsigned long pid); #endif + #if OPENSSL_API_COMPAT < 0x10100000L + void ERR_remove_thread_state(void *); + #endif + #if OPENSSL_API_COMPAT < 0x10100000L void ERR_free_strings(void) #endif @@ -71,9 +74,6 @@ messages is described in L. L can be used to clear the error queue. -Note that L should be used to -avoid memory leaks when threads are terminated. - =head1 ADDING NEW ERROR CODES TO OPENSSL See L if you want to record error codes in the @@ -186,7 +186,6 @@ L, L, L, L, -L, L, L, L diff --git a/include/openssl/err.h b/include/openssl/err.h index ccf2ff72de..e41fdc3efe 100644 --- a/include/openssl/err.h +++ b/include/openssl/err.h @@ -359,9 +359,8 @@ void ERR_load_ERR_strings(void); # define ERR_free_strings() while(0) continue #endif -void ERR_remove_thread_state(void); -DEPRECATEDIN_1_0_0(void ERR_remove_state(unsigned long pid)) /* if zero we - * look it up */ +DEPRECATEDIN_1_1_0(void ERR_remove_thread_state(void *)) +DEPRECATEDIN_1_0_0(void ERR_remove_state(unsigned long pid)) ERR_STATE *ERR_get_state(void); LHASH_OF(ERR_STRING_DATA) *ERR_get_string_table(void); -- 2.34.1