FYI, I have a fix for this but it is currently stalled in review due to
another related issue. Interim patch attached.
Matt
On 16/03/16 22:11, Michel wrote:
> Hi,
>
>
>
> As in my previous post, libcrypto still leaks with OpenSSL version 1.1.0
> pre release 4.
>
> Here is an example with the same test program that was running fine
> before I removed the old locking “stuff”.
>
>
>
> Detected memory leaks!
>
> Dumping objects ->
>
> {1418} normal block at 0x0064EF98, 24 bytes long.
>
> Data: < d > 98 1F 64 00 FF FF FF FF 00 00 00 00 00 00 00 00
>
> {703} normal block at 0x00641E40, 24 bytes long.
>
> Data: <x d > 78 1E 64 00 FF FF FF FF 00 00 00 00 00 00 00 00
>
> Object dump complete.
>
> Debug Error!
>
>
>
> ---------- Block 703 at 0x00641E40: 24 bytes ----------
>
> Leak Hash: 0x95EDDA21, Count: 1, Total 24 bytes
>
> Call Stack (TID 7140):
>
> ntdll.dll!RtlAllocateHeap()
>
> f:\dd\vctools\crt\crtw32\misc\dbgmalloc.c (56):
> TestsTLS-11.exe!malloc() + 0x15 bytes
>
> e:\openssl-1.1.0-pre4\crypto\mem.c (140):
> TestsTLS-11.exe!CRYPTO_malloc() + 0x9 bytes
>
> e:\openssl-1.1.0-pre4\crypto\mem.c (148):
> TestsTLS-11.exe!CRYPTO_zalloc() + 0x11 bytes
>
> e:\openssl-1.1.0-pre4\crypto\threads_win.c (57):
> TestsTLS-11.exe!CRYPTO_THREAD_lock_new() + 0xE bytes
>
> e:\openssl-1.1.0-pre4\crypto\err\err.c (393):
> TestsTLS-11.exe!do_err_strings_init() + 0x5 bytes
>
> e:\openssl-1.1.0-pre4\crypto\threads_win.c (117):
> TestsTLS-11.exe!CRYPTO_THREAD_run_once()
>
> e:\openssl-1.1.0-pre4\crypto\err\err.c (711):
> TestsTLS-11.exe!ERR_func_error_string() + 0xF bytes
>
> e:\openssl-1.1.0-pre4\ssl\ssl_err.c (716):
> TestsTLS-11.exe!ERR_load_SSL_strings() + 0x14 bytes
>
> e:\openssl-1.1.0-pre4\ssl\ssl_init.c (180):
> TestsTLS-11.exe!ossl_init_load_ssl_strings()
>
> e:\openssl-1.1.0-pre4\crypto\threads_win.c (117):
> TestsTLS-11.exe!CRYPTO_THREAD_run_once()
>
> e:\openssl-1.1.0-pre4\ssl\ssl_init.c (258):
> TestsTLS-11.exe!OPENSSL_init_ssl() + 0x2B bytes
>
> e:\openssl-1.1.0-pre4\ssl\ssl_lib.c (2359):
> TestsTLS-11.exe!SSL_CTX_new() + 0xE bytes
>
> p:\mes programmes\shared\ocrypto-11\tls.cpp (95):
> TestsTLS-11.exe!OTLS::TLSCtx::SetMinTLSVer() + 0x9 bytes
>
> p:\mes programmes\tests\_testsshared\teststls-11\testtls.cpp (63):
> TestsTLS-11.exe!main() + 0xC bytes
>
> f:\dd\vctools\crt\crtw32\startup\crt0.c (165):
> TestsTLS-11.exe!mainCRTStartup()
>
>
>
> ---------- Block 1418 at 0x0064EF98: 24 bytes ----------
>
> Leak Hash: 0x9FBB4D3C, Count: 1, Total 24 bytes
>
> Call Stack (TID 7140):
>
> ntdll.dll!RtlAllocateHeap()
>
> f:\dd\vctools\crt\crtw32\misc\dbgmalloc.c (56):
> TestsTLS-11.exe!malloc() + 0x15 bytes
>
> e:\openssl-1.1.0-pre4\crypto\mem.c (140):
> TestsTLS-11.exe!CRYPTO_malloc() + 0x9 bytes
>
> e:\openssl-1.1.0-pre4\crypto\mem.c (148):
> TestsTLS-11.exe!CRYPTO_zalloc() + 0x11 bytes
>
> e:\openssl-1.1.0-pre4\crypto\threads_win.c (57):
> TestsTLS-11.exe!CRYPTO_THREAD_lock_new() + 0xE bytes
>
> e:\openssl-1.1.0-pre4\crypto\ex_data.c (143):
> TestsTLS-11.exe!do_ex_data_init() + 0x5 bytes
>
> e:\openssl-1.1.0-pre4\crypto\threads_win.c (117):
> TestsTLS-11.exe!CRYPTO_THREAD_run_once()
>
> e:\openssl-1.1.0-pre4\crypto\ex_data.c (160):
> TestsTLS-11.exe!get_and_lock() + 0xF bytes
>
> e:\openssl-1.1.0-pre4\crypto\ex_data.c (243):
> TestsTLS-11.exe!CRYPTO_get_ex_new_index() + 0x9 bytes
>
> e:\openssl-1.1.0-pre4\ssl\ssl_cert.c (146):
> TestsTLS-11.exe!ssl_x509_store_ctx_init() + 0x14 bytes
>
> e:\openssl-1.1.0-pre4\crypto\threads_win.c (117):
> TestsTLS-11.exe!CRYPTO_THREAD_run_once()
>
> e:\openssl-1.1.0-pre4\ssl\ssl_cert.c (152):
> TestsTLS-11.exe!SSL_get_ex_data_X509_STORE_CTX_idx() + 0xF bytes
>
> e:\openssl-1.1.0-pre4\ssl\ssl_lib.c (2367):
> TestsTLS-11.exe!SSL_CTX_new() + 0x5 bytes
>
> p:\mes programmes\shared\ocrypto-11\tls.cpp (95):
> TestsTLS-11.exe!OTLS::TLSCtx::SetMinTLSVer() + 0x9 bytes
>
> p:\mes programmes\tests\_testsshared\teststls-11\testtls.cpp (63):
> TestsTLS-11.exe!main() + 0xC bytes
>
> f:\dd\vctools\crt\crtw32\startup\crt0.c (165):
> TestsTLS-11.exe!mainCRTStartup()
>
>
>
> Regards,
>
>
>
> Michel
>
>
>
>
>
From 33eae4591fec8bfa08a150e4342b1ae813fe4143 Mon Sep 17 00:00:00 2001
From: Matt Caswell <[email protected]>
Date: Fri, 11 Mar 2016 21:53:18 +0000
Subject: [PATCH] Ensure all locks are properly cleaned up
Some locks were not being properly cleaned up during close down.
---
crypto/bio/b_addr.c | 8 +++++
crypto/err/err.c | 8 +++--
crypto/ex_data.c | 10 +++++--
crypto/include/internal/bio.h | 55 ++++++++++++++++++++++++++++++++++
crypto/include/internal/cryptlib_int.h | 2 ++
crypto/include/internal/err.h | 1 +
crypto/init.c | 5 +++-
7 files changed, 83 insertions(+), 6 deletions(-)
create mode 100644 crypto/include/internal/bio.h
diff --git a/crypto/bio/b_addr.c b/crypto/bio/b_addr.c
index 0a6c5e9..6b2a6da 100644
--- a/crypto/bio/b_addr.c
+++ b/crypto/bio/b_addr.c
@@ -56,6 +56,7 @@
#include "bio_lcl.h"
#include "internal/threads.h"
+#include "internal/bio.h"
#ifndef OPENSSL_NO_SOCK
#include <openssl/err.h>
@@ -853,4 +854,11 @@ int BIO_lookup(const char *host, const char *service,
return ret;
}
+
+void bio_cleanup(void)
+{
+ CRYPTO_THREAD_lock_free(bio_lookup_lock);
+ bio_lookup_lock = NULL;
+}
+
#endif /* OPENSSL_NO_SOCK */
diff --git a/crypto/err/err.c b/crypto/err/err.c
index da6d3ee..6417e2c 100644
--- a/crypto/err/err.c
+++ b/crypto/err/err.c
@@ -113,6 +113,7 @@
#include <string.h>
#include <internal/cryptlib_int.h>
#include <internal/threads.h>
+#include <internal/err.h>
#include <openssl/lhash.h>
#include <openssl/crypto.h>
#include <openssl/buffer.h>
@@ -389,9 +390,12 @@ static void ERR_STATE_free(ERR_STATE *s)
static void do_err_strings_init(void)
{
- CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE);
err_string_lock = CRYPTO_THREAD_lock_new();
- CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE);
+}
+
+void err_cleanup(void)
+{
+ CRYPTO_THREAD_lock_free(err_string_lock);
}
void ERR_load_ERR_strings(void)
diff --git a/crypto/ex_data.c b/crypto/ex_data.c
index 3088889..16019b1 100644
--- a/crypto/ex_data.c
+++ b/crypto/ex_data.c
@@ -108,7 +108,7 @@
*
*/
-#include "internal/cryptlib.h"
+#include "internal/cryptlib_int.h"
#include "internal/threads.h"
#include <openssl/lhash.h>
@@ -139,9 +139,13 @@ static CRYPTO_ONCE ex_data_init = CRYPTO_ONCE_STATIC_INIT;
static void do_ex_data_init(void)
{
- CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE);
ex_data_lock = CRYPTO_THREAD_lock_new();
- CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE);
+}
+
+void ex_data_cleanup(void)
+{
+ CRYPTO_THREAD_lock_free(ex_data_lock);
+ ex_data_lock = NULL;
}
/*
diff --git a/crypto/include/internal/bio.h b/crypto/include/internal/bio.h
new file mode 100644
index 0000000..e21b837
--- /dev/null
+++ b/crypto/include/internal/bio.h
@@ -0,0 +1,55 @@
+/* ====================================================================
+ * Copyright (c) 2016 The OpenSSL Project. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ * software must display the following acknowledgment:
+ * "This product includes software developed by the OpenSSL Project
+ * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * [email protected].
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ * nor may "OpenSSL" appear in their names without prior written
+ * permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ * "This product includes software developed by the OpenSSL Project
+ * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This product includes cryptographic software written by Eric Young
+ * ([email protected]). This product includes software written by Tim
+ * Hudson ([email protected]).
+ *
+ */
+
+void bio_cleanup(void);
diff --git a/crypto/include/internal/cryptlib_int.h b/crypto/include/internal/cryptlib_int.h
index ae30842..fd68522 100644
--- a/crypto/include/internal/cryptlib_int.h
+++ b/crypto/include/internal/cryptlib_int.h
@@ -65,6 +65,8 @@ struct thread_local_inits_st {
};
int ossl_init_thread_start(uint64_t opts);
+void ex_data_cleanup(void);
+
/*
* OPENSSL_INIT flags. The primary list of these is in crypto.h. Flags below
* are those ommitted from crypto.h because they are "reserverd for internal
diff --git a/crypto/include/internal/err.h b/crypto/include/internal/err.h
index aa48019..2992674 100644
--- a/crypto/include/internal/err.h
+++ b/crypto/include/internal/err.h
@@ -56,3 +56,4 @@
*/
void err_load_crypto_strings_intern(void);
+void err_cleanup(void);
diff --git a/crypto/init.c b/crypto/init.c
index 8c59989..2041164 100644
--- a/crypto/init.c
+++ b/crypto/init.c
@@ -66,6 +66,7 @@
#ifndef OPENSSL_NO_ENGINE
#include <internal/engine.h>
#endif
+#include <internal/bio.h>
#include <openssl/comp.h>
#include <internal/err.h>
#include <stdlib.h>
@@ -491,10 +492,12 @@ void OPENSSL_cleanup(void)
#ifndef OPENSSL_NO_ENGINE
ENGINE_cleanup();
#endif
- CRYPTO_cleanup_all_ex_data();
+ ex_data_cleanup();
BIO_sock_cleanup();
+ bio_cleanup();
EVP_cleanup();
OBJ_cleanup();
+ err_cleanup();
base_inited = 0;
}
--
2.5.0
--
openssl-dev mailing list
To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-dev