From 8ea19c931d0b5f0a46d7c713dbfc95614ac65dba Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Fri, 25 Jan 2019 04:34:38 +0000 Subject: [PATCH] tls: fix malloc mismatch in SSL_set_tlsext_status_ocsp_resp call SSL_set_tlsext_status_ocsp_resp expects the data to be allocated with OPENSSL_malloc, not libc malloc, so use OpenSSLMalloc. Additionally, though OpenSSL doesn't type-check due to it being a macro, the function is documented to take an unsigned char pointer: https://www.openssl.org/docs/man1.1.0/ssl/SSL_set_tlsext_status_ocsp_resp.html (By default, OPENSSL_malloc is the same as libc malloc, but it is possible to customize this.) --- src/node_crypto.cc | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/node_crypto.cc b/src/node_crypto.cc index 01593914a1f501..d0579da5fbed15 100644 --- a/src/node_crypto.cc +++ b/src/node_crypto.cc @@ -326,6 +326,14 @@ bool EntropySource(unsigned char* buffer, size_t length) { } +template +static T* MallocOpenSSL(size_t count) { + void* mem = OPENSSL_malloc(MultiplyWithOverflowCheck(count, sizeof(T))); + CHECK_IMPLIES(mem == nullptr, count == 0); + return static_cast(mem); +} + + void SecureContext::Initialize(Environment* env, Local target) { Local t = env->NewFunctionTemplate(New); t->InstanceTemplate()->SetInternalFieldCount(1); @@ -2472,11 +2480,11 @@ int SSLWrap::TLSExtStatusCallback(SSL* s, void* arg) { size_t len = Buffer::Length(obj); // OpenSSL takes control of the pointer after accepting it - char* data = node::Malloc(len); + unsigned char* data = MallocOpenSSL(len); memcpy(data, resp, len); if (!SSL_set_tlsext_status_ocsp_resp(s, data, len)) - free(data); + OPENSSL_free(data); w->ocsp_response_.Reset(); return SSL_TLSEXT_ERR_OK; @@ -2698,13 +2706,6 @@ static bool IsSupportedAuthenticatedMode(const EVP_CIPHER_CTX* ctx) { return IsSupportedAuthenticatedMode(cipher); } -template -static T* MallocOpenSSL(size_t count) { - void* mem = OPENSSL_malloc(MultiplyWithOverflowCheck(count, sizeof(T))); - CHECK_IMPLIES(mem == nullptr, count == 0); - return static_cast(mem); -} - enum class ParsePublicKeyResult { kParsePublicOk, kParsePublicNotRecognized,