diff options
-rw-r--r-- | cmake/showoptions.cmake | 2 | ||||
-rw-r--r-- | src/common/Cryptography/OpenSSLCrypto.cpp | 68 | ||||
-rw-r--r-- | src/common/Define.h | 3 |
3 files changed, 72 insertions, 1 deletions
diff --git a/cmake/showoptions.cmake b/cmake/showoptions.cmake index 069b90b544f..0a886e0a367 100644 --- a/cmake/showoptions.cmake +++ b/cmake/showoptions.cmake @@ -100,7 +100,7 @@ elseif ( VALGRIND ) message(" *** jemalloc will be configured to support Valgrind") message(" *** Please specify the valgrind include directory in VALGRIND_INCLUDE_DIR option if you get build errors") message(" *** Please note that this is for DEBUGGING WITH VALGRIND only!") - add_definitions(-DJEMALLOC_VALGRIND) + add_definitions(-DJEMALLOC_VALGRIND -DVALGRIND) endif() if ( HELGRIND ) diff --git a/src/common/Cryptography/OpenSSLCrypto.cpp b/src/common/Cryptography/OpenSSLCrypto.cpp index 92e5f0a87ef..1da91da633d 100644 --- a/src/common/Cryptography/OpenSSLCrypto.cpp +++ b/src/common/Cryptography/OpenSSLCrypto.cpp @@ -22,6 +22,7 @@ #include <mutex> std::vector<std::mutex*> cryptoLocks; +void ValgrindRandomSetup(); static void lockingCallback(int mode, int type, const char* /*file*/, int /*line*/) { @@ -39,6 +40,10 @@ static void threadIdCallback(CRYPTO_THREADID * id) void OpenSSLCrypto::threadsSetup() { +#ifdef VALGRIND + ValgrindRandomSetup(); +#endif + cryptoLocks.resize(CRYPTO_num_locks()); for(int i = 0 ; i < CRYPTO_num_locks(); ++i) { @@ -62,3 +67,66 @@ void OpenSSLCrypto::threadsCleanup() } cryptoLocks.resize(0); } + +#ifdef VALGRIND +#include <openssl/rand.h> + +RAND_METHOD const* default_rand; + +static int Valgrind_RAND_seed(const void* buf, int num) +{ + VALGRIND_DISCARD(VALGRIND_MAKE_MEM_DEFINED(buf, num)); + return default_rand->seed(buf, num); +} + +static int Valgrind_RAND_bytes(unsigned char* buf, int num) +{ + int ret = default_rand->bytes(buf, num); + VALGRIND_DISCARD(VALGRIND_MAKE_MEM_DEFINED(buf, num)); + return ret; +} + +static void Valgrind_RAND_cleanup(void) +{ + default_rand->cleanup(); +} + +static int Valgrind_RAND_add(const void* buf, int num, double randomness) +{ + VALGRIND_DISCARD(VALGRIND_MAKE_MEM_DEFINED(buf, num)); + return default_rand->add(buf, num, randomness); +} + +static int Valgrind_RAND_pseudorand(unsigned char* buf, int num) +{ + int ret = default_rand->pseudorand(buf, num); + VALGRIND_DISCARD(VALGRIND_MAKE_MEM_DEFINED(buf, num)); + return ret; +} + +static int Valgrind_RAND_status(void) +{ + return default_rand->status(); +} + +static RAND_METHOD valgrind_rand; + +void ValgrindRandomSetup() +{ + memset(&valgrind_rand, 0, sizeof(RAND_METHOD)); + default_rand = RAND_get_rand_method(); + if (default_rand->seed) + valgrind_rand.seed = &Valgrind_RAND_seed; + if (default_rand->bytes) + valgrind_rand.bytes = &Valgrind_RAND_bytes; + if (default_rand->cleanup) + valgrind_rand.cleanup = &Valgrind_RAND_cleanup; + if (default_rand->add) + valgrind_rand.add = &Valgrind_RAND_add; + if (default_rand->pseudorand) + valgrind_rand.pseudorand = &Valgrind_RAND_pseudorand; + if (default_rand->status) + valgrind_rand.status = &Valgrind_RAND_status; + RAND_set_rand_method(&valgrind_rand); +} +#endif diff --git a/src/common/Define.h b/src/common/Define.h index fa8a7e5d344..71630ef949c 100644 --- a/src/common/Define.h +++ b/src/common/Define.h @@ -38,6 +38,9 @@ # define _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(A) ANNOTATE_HAPPENS_BEFORE(A) # define _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(A) ANNOTATE_HAPPENS_AFTER(A) # endif +# if defined(VALGRIND) +# include <valgrind/memcheck.h> +# endif #endif #include <cstddef> |