Add error return for OPENSSL_INIT_set_config_filename()
authorMatt Caswell <matt@openssl.org>
Mon, 23 May 2016 09:55:54 +0000 (10:55 +0100)
committerMatt Caswell <matt@openssl.org>
Mon, 23 May 2016 22:30:24 +0000 (23:30 +0100)
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 <rsalz@openssl.org>
crypto/conf/conf_lib.c
doc/crypto/OPENSSL_init_crypto.pod
include/openssl/crypto.h

index 1b902e2..a1e42eb 100644 (file)
@@ -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
 
index 157ab81..8caa361 100644 (file)
@@ -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<OPENSSL_init_ssl(3)>
 =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
 
index c98b99b..c4b31d9 100644 (file)
@@ -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);