From d4b1d5a8baf18e4c8d62846360c0c1c0c9331d70 Mon Sep 17 00:00:00 2001
From: Cory Fields <cory-nospam-@coryfields.com>
Date: Tue, 14 Jul 2015 17:38:03 -0400
Subject: [PATCH] openssl: avoid config file load/race

---
 src/util.cpp | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/src/util.cpp b/src/util.cpp
index bb7df2320..00d0f3a00 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -83,6 +83,7 @@
 #include <boost/thread.hpp>
 #include <openssl/crypto.h>
 #include <openssl/rand.h>
+#include <openssl/conf.h>
 
 // Work around clang compilation problem in Boost 1.46:
 // /usr/include/boost/program_options/detail/config_file.hpp:163:17: error: call to function 'to_internal' that is neither visible in the template definition nor found by argument-dependent lookup
@@ -134,6 +135,13 @@ public:
             ppmutexOpenSSL[i] = new CCriticalSection();
         CRYPTO_set_locking_callback(locking_callback);
 
+        // OpenSSL can optionally load a config file which lists optional loadable modules and engines.
+        // We don't use them so we don't require the config. However some of our libs may call functions
+        // which attempt to load the config file, possibly resulting in an exit() or crash if it is missing
+        // or corrupt. Explicitly tell OpenSSL not to try to load the file. The result for our libs will be
+        // that the config appears to have been loaded and there are no modules/engines available.
+        OPENSSL_no_config();
+
 #ifdef WIN32
         // Seed OpenSSL PRNG with current contents of the screen
         RAND_screen();