From dae00d631fdaed48d88c454864abbd6ce99c63d6 Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Mon, 23 May 2016 10:55:54 +0100 Subject: [PATCH] Add error return for OPENSSL_INIT_set_config_filename() The OPENSSL_INIT_set_config_filename() function can fail so ensure that it provides a suitable error code. GitHub Issue #920 Reviewed-by: Rich Salz --- crypto/conf/conf_lib.c | 16 +++++++++++++--- doc/crypto/OPENSSL_init_crypto.pod | 12 +++++++----- include/openssl/crypto.h | 4 ++-- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/crypto/conf/conf_lib.c b/crypto/conf/conf_lib.c index 1b902e2077..a1e42eb7c4 100644 --- a/crypto/conf/conf_lib.c +++ b/crypto/conf/conf_lib.c @@ -339,11 +339,21 @@ OPENSSL_INIT_SETTINGS *OPENSSL_INIT_new(void) #ifndef OPENSSL_NO_STDIO -void OPENSSL_INIT_set_config_filename(OPENSSL_INIT_SETTINGS *settings, - const char *config_file) +int OPENSSL_INIT_set_config_filename(OPENSSL_INIT_SETTINGS *settings, + const char *config_file) { + char *new_config_file = NULL; + + if (config_file != NULL) { + new_config_file = strdup(config_file); + if (new_config_file == NULL) + return 0; + } + free(settings->config_name); - settings->config_name = config_file == NULL ? NULL : strdup(config_file); + settings->config_name = new_config_file; + + return 1; } #endif diff --git a/doc/crypto/OPENSSL_init_crypto.pod b/doc/crypto/OPENSSL_init_crypto.pod index 157ab8140d..8caa36148c 100644 --- a/doc/crypto/OPENSSL_init_crypto.pod +++ b/doc/crypto/OPENSSL_init_crypto.pod @@ -16,8 +16,9 @@ initialisation and deinitialisation functions void OPENSSL_thread_stop(void); OPENSSL_INIT_SETTINGS *OPENSSL_init_new(void); - OPENSSL_INIT_set_config_filename(OPENSSL_INIT_SETTINGS *init, const char* name); - OPENSSL_INIT_free(OPENSSL_INIT_SETTINGS *init); + int OPENSSL_INIT_set_config_filename(OPENSSL_INIT_SETTINGS *init, + const char* name); + void OPENSSL_INIT_free(OPENSSL_INIT_SETTINGS *init); =head1 DESCRIPTION @@ -208,8 +209,8 @@ using static linking should also call OPENSSL_thread_stop(). =head1 RETURN VALUES -The functions OPENSSL_init_crypto and OPENSSL_atexit() returns 1 on success or -0 on error. +The functions OPENSSL_init_crypto, OPENSSL_atexit() and +OPENSSL_INIT_set_config_filename() return 1 on success or 0 on error. =head1 SEE ALSO @@ -218,7 +219,8 @@ L =head1 HISTORY The OPENSSL_init_crypto(), OPENSSL_cleanup(), OPENSSL_atexit(), -and OPENSSL_thread_stop() functions were added in OpenSSL 1.1.0. +OPENSSL_thread_stop(), OPENSSL_init_new(), OPENSSL_INIT_set_config_filename() +and OPENSSL_INIT_free() functions were added in OpenSSL 1.1.0. =head1 COPYRIGHT diff --git a/include/openssl/crypto.h b/include/openssl/crypto.h index c98b99b473..c4b31d92f3 100644 --- a/include/openssl/crypto.h +++ b/include/openssl/crypto.h @@ -380,8 +380,8 @@ void OPENSSL_thread_stop(void); /* Low-level control of initialization */ OPENSSL_INIT_SETTINGS *OPENSSL_INIT_new(void); #ifndef OPENSSL_NO_STDIO -void OPENSSL_INIT_set_config_filename(OPENSSL_INIT_SETTINGS *settings, - const char *config_file); +int OPENSSL_INIT_set_config_filename(OPENSSL_INIT_SETTINGS *settings, + const char *config_file); #endif void OPENSSL_INIT_free(OPENSSL_INIT_SETTINGS *settings); -- 2.34.1