diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2019-09-04 14:06:52 +0200 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2019-09-04 14:06:52 +0200 |
commit | 4caeefaf004c1a4fdd67485f0328a6741a9640fb (patch) | |
tree | e6d1504de1baa712c5f8704fb383f99a5e491d8c /src/libmain | |
parent | e302ba0e65ba875b7bafd6265285e5f06384b617 (diff) |
Revert "Remove obsolete OpenSSL locking code"
This reverts commit aeb695c0074b52772057b36f442a054f8d1a856d.
Diffstat (limited to 'src/libmain')
-rw-r--r-- | src/libmain/shared.cc | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc index 910549583..0afddfb78 100644 --- a/src/libmain/shared.cc +++ b/src/libmain/shared.cc @@ -15,6 +15,8 @@ #include <unistd.h> #include <signal.h> +#include <openssl/crypto.h> + namespace nix { @@ -78,6 +80,20 @@ string getArg(const string & opt, } +/* OpenSSL is not thread-safe by default - it will randomly crash + unless the user supplies a mutex locking function. So let's do + that. */ +static std::vector<std::mutex> opensslLocks; + +static void opensslLockCallback(int mode, int type, const char * file, int line) +{ + if (mode & CRYPTO_LOCK) + opensslLocks[type].lock(); + else + opensslLocks[type].unlock(); +} + + static void sigHandler(int signo) { } @@ -89,6 +105,10 @@ void initNix() std::cerr.rdbuf()->pubsetbuf(buf, sizeof(buf)); #endif + /* Initialise OpenSSL locking. */ + opensslLocks = std::vector<std::mutex>(CRYPTO_num_locks()); + CRYPTO_set_locking_callback(opensslLockCallback); + loadConfFile(); startSignalHandlerThread(); |