From f3f1cf8444f439c0be9de04bf3821a20d00fd956 Mon Sep 17 00:00:00 2001 From: Rich Salz Date: Sat, 30 Jan 2016 12:04:25 -0500 Subject: [PATCH] Move to REF_DEBUG, for consistency. Add utility macros REF_ASSERT_NOT and REF_PRINT_COUNT This is also RT 4181 Reviewed-by: Richard Levitte --- CHANGES | 3 +++ Configurations/10-main.conf | 12 +++++------ Configurations/90-team.conf | 8 ++++---- Configurations/99-personal-ben.conf | 8 ++++---- Configure | 2 +- Makefile.in | 2 +- crypto/asn1/tasn_utl.c | 7 ++----- crypto/asn1/x_info.c | 11 ++-------- crypto/asn1/x_pkey.c | 11 ++-------- crypto/bio/bio_err.c | 2 ++ crypto/bio/bio_lib.c | 11 ++-------- crypto/dh/dh_lib.c | 23 +++++---------------- crypto/dsa/dsa_lib.c | 23 +++++---------------- crypto/dso/dso_lib.c | 11 ++-------- crypto/ec/ec_key.c | 23 +++++---------------- crypto/engine/eng_init.c | 7 +------ crypto/engine/eng_lib.c | 7 +------ crypto/err/err.c | 25 ++++++++++------------- crypto/evp/p_lib.c | 11 ++-------- crypto/lock.c | 2 +- crypto/rsa/rsa_lib.c | 23 +++++---------------- crypto/x509/x509_lu.c | 11 ++-------- e_os.h | 25 ++++++++++++++++------- include/openssl/bio.h | 1 + ssl/ssl_cert.c | 11 ++-------- ssl/ssl_conf.c | 3 --- ssl/ssl_lib.c | 31 ++++++++++------------------- ssl/ssl_sess.c | 11 ++-------- util/pl/linux.pl | 2 +- util/pl/ultrix.pl | 2 +- 30 files changed, 104 insertions(+), 225 deletions(-) diff --git a/CHANGES b/CHANGES index eb6ee3f67d..cb71a13c05 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,9 @@ Changes between 1.0.2f and 1.1.0 [xx XXX xxxx] + *) Rename REF_CHECK to REF_DEBUG. + [Rich Salz] + *) New "unified" build system The "unified" build system is aimed to be a common system for all diff --git a/Configurations/10-main.conf b/Configurations/10-main.conf index 07e1d6a208..cda7e21d7d 100644 --- a/Configurations/10-main.conf +++ b/Configurations/10-main.conf @@ -26,7 +26,7 @@ "vos-gcc" => { cc => "gcc", cflags => "-Wall -DOPENSSL_SYS_VOS -D_POSIX_C_SOURCE=200112L -D_BSD -D_VOS_EXTENDED_NAMES -DB_ENDIAN", - debug_cflags => "-O0 -g -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG", + debug_cflags => "-O0 -g -DBN_DEBUG -DREF_DEBUG -DCONF_DEBUG", release_cflags => "-O3", thread_cflag => "(unknown)", sys_id => "VOS", @@ -134,7 +134,7 @@ # -mcpu=ultrasparc inherit_from => [ "solaris-sparcv7-gcc", asm("sparcv9_asm") ], cflags => add_before(" ", "-m32 -mcpu=ultrasparc"), - debug_cflags => "-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DPEDANTIC -O -g -pedantic -ansi -Wshadow -Wno-long-long -D__EXTENSIONS__", + debug_cflags => "-DBN_DEBUG -DREF_DEBUG -DCONF_DEBUG -DBN_CTX_DEBUG -DPEDANTIC -O -g -pedantic -ansi -Wshadow -Wno-long-long -D__EXTENSIONS__", }, "solaris64-sparcv9-gcc" => { inherit_from => [ "solaris-sparcv9-gcc" ], @@ -152,7 +152,7 @@ inherit_from => [ "solaris-common" ], cc => "cc", cflags => add_before("-xstrconst -Xa -DB_ENDIAN -DBN_DIV2W"), - debug_cflags => "-g -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG", + debug_cflags => "-g -DBN_DEBUG -DREF_DEBUG -DCONF_DEBUG -DBN_CTX_DEBUG", release_cflags => "-xO5 -xdepend", thread_cflag => "-D_REENTRANT", lflags => add("-mt"), @@ -496,7 +496,7 @@ "linux-generic32" => { cc => "gcc", cflags => "-Wall", - debug_cflags => "-O0 -g -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG", + debug_cflags => "-O0 -g -DBN_DEBUG -DREF_DEBUG -DCONF_DEBUG", release_cflags => "-O3", thread_cflag => "-pthread", ex_libs => "-ldl", @@ -607,7 +607,7 @@ inherit_from => [ "linux-generic32", asm("x86_elf_asm") ], cc => "gcc", cflags => "-march=i486 -DL_ENDIAN -Wall", - debug_cflags => "-O0 -g -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG", + debug_cflags => "-O0 -g -DBN_DEBUG -DREF_DEBUG -DCONF_DEBUG -DBN_CTX_DEBUG", release_cflags => "-O3 -fomit-frame-pointer", debug_ex_libs => "-lefence", bn_ops => "BN_LLONG", @@ -1467,7 +1467,7 @@ }, "vxworks-ppc750-debug" => { cc => "ccppc", - cflags => "-ansi -nostdinc -DPPC750 -D_REENTRANT -fvolatile -fno-builtin -fno-for-scope -fsigned-char -Wall -msoft-float -mlongcall -DCPU=PPC604 -I\$(WIND_BASE)/target/h -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DPEDANTIC -DDEBUG_SAFESTACK -DDEBUG -g", + cflags => "-ansi -nostdinc -DPPC750 -D_REENTRANT -fvolatile -fno-builtin -fno-for-scope -fsigned-char -Wall -msoft-float -mlongcall -DCPU=PPC604 -I\$(WIND_BASE)/target/h -DBN_DEBUG -DREF_DEBUG -DCONF_DEBUG -DBN_CTX_DEBUG -DPEDANTIC -DDEBUG_SAFESTACK -DDEBUG -g", sys_id => "VXWORKS", lflags => "-r", }, diff --git a/Configurations/90-team.conf b/Configurations/90-team.conf index bb24bdb717..7dc5fdae48 100644 --- a/Configurations/90-team.conf +++ b/Configurations/90-team.conf @@ -14,7 +14,7 @@ }, "debug" => { cc => "gcc", - cflags => "-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DOPENSSL_NO_ASM -ggdb -g2 -Wformat -Wshadow -Wmissing-prototypes -Wmissing-declarations -Werror", + cflags => "-DBN_DEBUG -DREF_DEBUG -DCONF_DEBUG -DBN_CTX_DEBUG -DOPENSSL_NO_ASM -ggdb -g2 -Wformat -Wshadow -Wmissing-prototypes -Wmissing-declarations -Werror", thread_cflag => "(unknown)", ex_libs => "-lefence", }, @@ -36,7 +36,7 @@ "debug-linux-pentium" => { inherit_from => [ "x86_elf_asm" ], cc => "gcc", - cflags => "-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DL_ENDIAN -g -mcpu=pentium -Wall", + cflags => "-DBN_DEBUG -DREF_DEBUG -DCONF_DEBUG -DBN_CTX_DEBUG -DL_ENDIAN -g -mcpu=pentium -Wall", thread_cflag => "-D_REENTRANT", ex_libs => "-ldl", bn_ops => "BN_LLONG", @@ -45,7 +45,7 @@ "debug-linux-ppro" => { inherit_from => [ "x86_elf_asm" ], cc => "gcc", - cflags => "-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DL_ENDIAN -g -mcpu=pentiumpro -Wall", + cflags => "-DBN_DEBUG -DREF_DEBUG -DCONF_DEBUG -DBN_CTX_DEBUG -DL_ENDIAN -g -mcpu=pentiumpro -Wall", thread_cflag => "-D_REENTRANT", ex_libs => "-ldl", bn_ops => "BN_LLONG", @@ -54,7 +54,7 @@ "debug-linux-elf-noefence" => { inherit_from => [ "x86_elf_asm" ], cc => "gcc", - cflags => "-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DL_ENDIAN -g -march=i486 -Wall", + cflags => "-DBN_DEBUG -DREF_DEBUG -DCONF_DEBUG -DBN_CTX_DEBUG -DL_ENDIAN -g -march=i486 -Wall", thread_cflag => "-D_REENTRANT", ex_libs => "-ldl", bn_ops => "BN_LLONG", diff --git a/Configurations/99-personal-ben.conf b/Configurations/99-personal-ben.conf index 01d8a2dffa..b7093227f0 100644 --- a/Configurations/99-personal-ben.conf +++ b/Configurations/99-personal-ben.conf @@ -8,17 +8,17 @@ %targets = ( "debug-ben" => { cc => "gcc", - cflags => "$gcc_devteam_warn -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DDEBUG_SAFESTACK -O2 -pipe", + cflags => "$gcc_devteam_warn -DBN_DEBUG -DREF_DEBUG -DCONF_DEBUG -DBN_CTX_DEBUG -DDEBUG_SAFESTACK -O2 -pipe", thread_cflag => "(unknown)", }, "debug-ben-openbsd" => { cc => "gcc", - cflags => "-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DPEDANTIC -DDEBUG_SAFESTACK -DOPENSSL_OPENBSD_DEV_CRYPTO -DOPENSSL_NO_ASM -O2 -pedantic -Wall -Wshadow -Werror -pipe", + cflags => "-DBN_DEBUG -DREF_DEBUG -DCONF_DEBUG -DBN_CTX_DEBUG -DPEDANTIC -DDEBUG_SAFESTACK -DOPENSSL_OPENBSD_DEV_CRYPTO -DOPENSSL_NO_ASM -O2 -pedantic -Wall -Wshadow -Werror -pipe", thread_cflag => "(unknown)", }, "debug-ben-openbsd-debug" => { cc => "gcc", - cflags => "-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DPEDANTIC -DDEBUG_SAFESTACK -DOPENSSL_OPENBSD_DEV_CRYPTO -DOPENSSL_NO_ASM -g3 -O2 -pedantic -Wall -Wshadow -Werror -pipe", + cflags => "-DBN_DEBUG -DREF_DEBUG -DCONF_DEBUG -DBN_CTX_DEBUG -DPEDANTIC -DDEBUG_SAFESTACK -DOPENSSL_OPENBSD_DEV_CRYPTO -DOPENSSL_NO_ASM -g3 -O2 -pedantic -Wall -Wshadow -Werror -pipe", thread_cflag => "(unknown)", }, "debug-ben-debug" => { @@ -74,7 +74,7 @@ }, "debug-ben-strict" => { cc => "gcc", - cflags => "-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCONST_STRICT -O2 -Wall -Wshadow -Werror -Wpointer-arith -Wcast-qual -Wwrite-strings -pipe", + cflags => "-DBN_DEBUG -DREF_DEBUG -DCONF_DEBUG -DBN_CTX_DEBUG -DCONST_STRICT -O2 -Wall -Wshadow -Werror -Wpointer-arith -Wcast-qual -Wwrite-strings -pipe", thread_cflag => "(unknown)", }, "debug-ben-darwin64" => { diff --git a/Configure b/Configure index d3800cbf77..4198ff74ce 100755 --- a/Configure +++ b/Configure @@ -80,7 +80,7 @@ my $usage="Usage: Configure [no- ...] [enable- ...] [experimenta # Minimum warning options... any contributions to OpenSSL should at least get # past these. -my $gcc_devteam_warn = "-Wall -pedantic -DPEDANTIC -Wno-long-long -Wsign-compare -Wmissing-prototypes -Wshadow -Wformat -Wtype-limits -Werror -DREF_CHECK -DDEBUG_UNUSED"; +my $gcc_devteam_warn = "-Wall -pedantic -DPEDANTIC -Wno-long-long -Wsign-compare -Wmissing-prototypes -Wshadow -Wformat -Wtype-limits -Werror -DREF_DEBUG -DDEBUG_UNUSED"; # These are used in addition to $gcc_devteam_warn when the compiler is clang. # TODO(openssl-team): fix problems and investigate if (at least) the diff --git a/Makefile.in b/Makefile.in index b788042663..b52bc18eaa 100644 --- a/Makefile.in +++ b/Makefile.in @@ -76,7 +76,7 @@ ENGINESDIR={- use File::Spec::Functions; # NULL encryption ciphers. # # LOCK_DEBUG - turns on lots of lock debug output :-) -# REF_CHECK - turn on some xyz_free() assertions. +# REF_DEBUG - turn on some xyz_free() assertions. # REF_PRINT - prints some stuff on structure free. # MFUNC - Make all Malloc/Free/Realloc calls call # CRYPTO_malloc/CRYPTO_free/CRYPTO_realloc which can be setup to diff --git a/crypto/asn1/tasn_utl.c b/crypto/asn1/tasn_utl.c index f1807c20f4..51f22aa7c6 100644 --- a/crypto/asn1/tasn_utl.c +++ b/crypto/asn1/tasn_utl.c @@ -118,12 +118,9 @@ int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it) } ret = CRYPTO_add(lck, op, aux->ref_lock); #ifdef REF_PRINT - fprintf(stderr, "%s: Reference Count: %d\n", it->sname, *lck); -#endif -#ifdef REF_CHECK - if (ret < 0) - fprintf(stderr, "%s, bad reference count\n", it->sname); + fprintf(stderr, "%p:%4d:%s\n", it, *lck, it->sname); #endif + REF_ASSERT_ISNT(ret < 0); return ret; } diff --git a/crypto/asn1/x_info.c b/crypto/asn1/x_info.c index 375e0ae8bd..adee224699 100644 --- a/crypto/asn1/x_info.c +++ b/crypto/asn1/x_info.c @@ -82,17 +82,10 @@ void X509_INFO_free(X509_INFO *x) return; i = CRYPTO_add(&x->references, -1, CRYPTO_LOCK_X509_INFO); -#ifdef REF_PRINT - REF_PRINT("X509_INFO", x); -#endif + REF_PRINT_COUNT("X509_INFO", x); if (i > 0) return; -#ifdef REF_CHECK - if (i < 0) { - fprintf(stderr, "X509_INFO_free, bad reference count\n"); - abort(); - } -#endif + REF_ASSERT_ISNT(i < 0); X509_free(x->x509); X509_CRL_free(x->crl); diff --git a/crypto/asn1/x_pkey.c b/crypto/asn1/x_pkey.c index 5bca68ad1e..6e09d29239 100644 --- a/crypto/asn1/x_pkey.c +++ b/crypto/asn1/x_pkey.c @@ -90,17 +90,10 @@ void X509_PKEY_free(X509_PKEY *x) return; i = CRYPTO_add(&x->references, -1, CRYPTO_LOCK_X509_PKEY); -#ifdef REF_PRINT - REF_PRINT("X509_PKEY", x); -#endif + REF_PRINT_COUNT("X509_PKEY", x); if (i > 0) return; -#ifdef REF_CHECK - if (i < 0) { - fprintf(stderr, "X509_PKEY_free, bad reference count\n"); - abort(); - } -#endif + REF_ASSERT_ISNT(i < 0); X509_ALGOR_free(x->enc_algor); ASN1_OCTET_STRING_free(x->enc_pkey); diff --git a/crypto/bio/bio_err.c b/crypto/bio/bio_err.c index 5b2eb952f8..36b9dfe62c 100644 --- a/crypto/bio/bio_err.c +++ b/crypto/bio/bio_err.c @@ -1,3 +1,4 @@ +/* crypto/bio/bio_err.c */ /* ==================================================================== * Copyright (c) 1999-2016 The OpenSSL Project. All rights reserved. * @@ -96,6 +97,7 @@ static ERR_STRING_DATA BIO_str_functs[] = { {ERR_FUNC(BIO_F_BIO_PUTS), "BIO_puts"}, {ERR_FUNC(BIO_F_BIO_READ), "BIO_read"}, {ERR_FUNC(BIO_F_BIO_SOCKET), "BIO_socket"}, + {ERR_FUNC(BIO_F_BIO_SOCKET_NBIO), "BIO_socket_nbio"}, {ERR_FUNC(BIO_F_BIO_SOCK_INFO), "BIO_sock_info"}, {ERR_FUNC(BIO_F_BIO_SOCK_INIT), "BIO_sock_init"}, {ERR_FUNC(BIO_F_BIO_WRITE), "BIO_write"}, diff --git a/crypto/bio/bio_lib.c b/crypto/bio/bio_lib.c index ef68dbb774..ee8d622b20 100644 --- a/crypto/bio/bio_lib.c +++ b/crypto/bio/bio_lib.c @@ -110,17 +110,10 @@ int BIO_free(BIO *a) return (0); i = CRYPTO_add(&a->references, -1, CRYPTO_LOCK_BIO); -#ifdef REF_PRINT - REF_PRINT("BIO", a); -#endif + REF_PRINT_COUNT("BIO", a); if (i > 0) return (1); -#ifdef REF_CHECK - if (i < 0) { - fprintf(stderr, "BIO_free, bad reference count\n"); - abort(); - } -#endif + REF_ASSERT_ISNT(i < 0); if ((a->callback != NULL) && ((i = (int)a->callback(a, BIO_CB_FREE, NULL, 0, 0L, 1L)) <= 0)) return (i); diff --git a/crypto/dh/dh_lib.c b/crypto/dh/dh_lib.c index 013008eafe..9167d69ea8 100644 --- a/crypto/dh/dh_lib.c +++ b/crypto/dh/dh_lib.c @@ -157,17 +157,10 @@ void DH_free(DH *r) if (r == NULL) return; i = CRYPTO_add(&r->references, -1, CRYPTO_LOCK_DH); -#ifdef REF_PRINT - REF_PRINT("DH", r); -#endif + REF_PRINT_COUNT("DH", r); if (i > 0) return; -#ifdef REF_CHECK - if (i < 0) { - fprintf(stderr, "DH_free, bad reference count\n"); - abort(); - } -#endif + REF_ASSERT_ISNT(i < 0); if (r->meth->finish) r->meth->finish(r); @@ -192,15 +185,9 @@ void DH_free(DH *r) int DH_up_ref(DH *r) { int i = CRYPTO_add(&r->references, 1, CRYPTO_LOCK_DH); -#ifdef REF_PRINT - REF_PRINT("DH", r); -#endif -#ifdef REF_CHECK - if (i < 2) { - fprintf(stderr, "DH_up, bad reference count\n"); - abort(); - } -#endif + + REF_PRINT_COUNT("DH", r); + REF_ASSERT_ISNT(i < 2); return ((i > 1) ? 1 : 0); } diff --git a/crypto/dsa/dsa_lib.c b/crypto/dsa/dsa_lib.c index b8d8e10ddb..26a5d28f0d 100644 --- a/crypto/dsa/dsa_lib.c +++ b/crypto/dsa/dsa_lib.c @@ -165,17 +165,10 @@ void DSA_free(DSA *r) return; i = CRYPTO_add(&r->references, -1, CRYPTO_LOCK_DSA); -#ifdef REF_PRINT - REF_PRINT("DSA", r); -#endif + REF_PRINT_COUNT("DSA", r); if (i > 0) return; -#ifdef REF_CHECK - if (i < 0) { - fprintf(stderr, "DSA_free, bad reference count\n"); - abort(); - } -#endif + REF_ASSERT_ISNT(i < 0); if (r->meth->finish) r->meth->finish(r); @@ -199,15 +192,9 @@ void DSA_free(DSA *r) int DSA_up_ref(DSA *r) { int i = CRYPTO_add(&r->references, 1, CRYPTO_LOCK_DSA); -#ifdef REF_PRINT - REF_PRINT("DSA", r); -#endif -#ifdef REF_CHECK - if (i < 2) { - fprintf(stderr, "DSA_up_ref, bad reference count\n"); - abort(); - } -#endif + + REF_PRINT_COUNT("DSA", r); + REF_ASSERT_ISNT(i < 2); return ((i > 1) ? 1 : 0); } diff --git a/crypto/dso/dso_lib.c b/crypto/dso/dso_lib.c index bc3a785940..0921fb2409 100644 --- a/crypto/dso/dso_lib.c +++ b/crypto/dso/dso_lib.c @@ -136,17 +136,10 @@ int DSO_free(DSO *dso) return (1); i = CRYPTO_add(&dso->references, -1, CRYPTO_LOCK_DSO); -#ifdef REF_PRINT - REF_PRINT("DSO", dso); -#endif + REF_PRINT_COUNT("DSO", dso); if (i > 0) return (1); -#ifdef REF_CHECK - if (i < 0) { - fprintf(stderr, "DSO_free, bad reference count\n"); - abort(); - } -#endif + REF_ASSERT_ISNT(i < 0); if ((dso->meth->dso_unload != NULL) && !dso->meth->dso_unload(dso)) { DSOerr(DSO_F_DSO_FREE, DSO_R_UNLOAD_FAILED); diff --git a/crypto/ec/ec_key.c b/crypto/ec/ec_key.c index 57388da91e..7d8507ca50 100644 --- a/crypto/ec/ec_key.c +++ b/crypto/ec/ec_key.c @@ -99,17 +99,10 @@ void EC_KEY_free(EC_KEY *r) return; i = CRYPTO_add(&r->references, -1, CRYPTO_LOCK_EC); -#ifdef REF_PRINT - REF_PRINT("EC_KEY", r); -#endif + REF_PRINT_COUNT("EC_KEY", r); if (i > 0) return; -#ifdef REF_CHECK - if (i < 0) { - fprintf(stderr, "EC_KEY_free, bad reference count\n"); - abort(); - } -#endif + REF_ASSERT_ISNT(i < 0); if (r->meth->finish != NULL) r->meth->finish(r); @@ -213,15 +206,9 @@ EC_KEY *EC_KEY_dup(EC_KEY *ec_key) int EC_KEY_up_ref(EC_KEY *r) { int i = CRYPTO_add(&r->references, 1, CRYPTO_LOCK_EC); -#ifdef REF_PRINT - REF_PRINT("EC_KEY", r); -#endif -#ifdef REF_CHECK - if (i < 2) { - fprintf(stderr, "EC_KEY_up, bad reference count\n"); - abort(); - } -#endif + + REF_PRINT_COUNT("EC_KEY", r); + REF_ASSERT_ISNT(i < 2); return ((i > 1) ? 1 : 0); } diff --git a/crypto/engine/eng_init.c b/crypto/engine/eng_init.c index c5f3805765..b66d476d80 100644 --- a/crypto/engine/eng_init.c +++ b/crypto/engine/eng_init.c @@ -108,12 +108,7 @@ int engine_unlocked_finish(ENGINE *e, int unlock_for_handlers) if (!to_return) return 0; } -#ifdef REF_CHECK - if (e->funct_ref < 0) { - fprintf(stderr, "ENGINE_finish, bad functional reference count\n"); - abort(); - } -#endif + REF_ASSERT_ISNT(e->funct_ref < 0); /* Release the structural reference too */ if (!engine_free_util(e, 0)) { ENGINEerr(ENGINE_F_ENGINE_UNLOCKED_FINISH, ENGINE_R_FINISH_FAILED); diff --git a/crypto/engine/eng_lib.c b/crypto/engine/eng_lib.c index 388e8ca877..15c2c6ff68 100644 --- a/crypto/engine/eng_lib.c +++ b/crypto/engine/eng_lib.c @@ -114,12 +114,7 @@ int engine_free_util(ENGINE *e, int locked) engine_ref_debug(e, 0, -1) if (i > 0) return 1; -#ifdef REF_CHECK - if (i < 0) { - fprintf(stderr, "ENGINE_free, bad structural reference count\n"); - abort(); - } -#endif + REF_ASSERT_ISNT(i < 0); /* Free up any dynamically allocated public key methods */ engine_pkey_meths_free(e); engine_pkey_asn1_meths_free(e); diff --git a/crypto/err/err.c b/crypto/err/err.c index 5e1d5c55b4..00565fa473 100644 --- a/crypto/err/err.c +++ b/crypto/err/err.c @@ -241,9 +241,13 @@ static void int_thread_del_item(const ERR_STATE *); /* * The internal state */ + +/* This is a struct so that REF_PRINT_COUNT works. */ +static struct refcount { + int references; +} refcount = { 0 }; static LHASH_OF(ERR_STRING_DATA) *int_error_hash = NULL; static LHASH_OF(ERR_STATE) *int_thread_hash = NULL; -static int int_thread_hash_references = 0; static int int_err_library_number = ERR_LIB_USER; static unsigned long get_error_values(int inc, int top, const char **file, @@ -317,7 +321,7 @@ static LHASH_OF(ERR_STATE) *int_thread_get(int create, int lockit) int_thread_hash = lh_ERR_STATE_new(err_state_hash, err_state_cmp); } if (int_thread_hash != NULL) { - int_thread_hash_references++; + refcount.references++; ret = int_thread_hash; } if (lockit) @@ -332,19 +336,12 @@ static void int_thread_release(LHASH_OF(ERR_STATE) **hash) if (hash == NULL || *hash == NULL) return; - i = CRYPTO_add(&int_thread_hash_references, -1, CRYPTO_LOCK_ERR); + i = CRYPTO_add(&refcount.references, -1, CRYPTO_LOCK_ERR); -#ifdef REF_PRINT - fprintf(stderr, "%4d:%s\n", int_thread_hash_references, "ERR"); -#endif + REF_PRINT_COUNT(&refcount, "ERR"); if (i > 0) return; -#ifdef REF_CHECK - if (i < 0) { - fprintf(stderr, "int_thread_release, bad reference count\n"); - abort(); /* ok */ - } -#endif + REF_ASSERT_ISNT(i < 0); *hash = NULL; } @@ -389,10 +386,10 @@ static void int_thread_del_item(const ERR_STATE *d) p = lh_ERR_STATE_delete(hash, d); /* If there are no other references, and we just removed the * last item, delete the int_thread_hash */ - if (int_thread_hash_references == 1 + if (refcount.references == 1 && int_thread_hash && lh_ERR_STATE_num_items(int_thread_hash) == 0) { - int_thread_hash_references = 0; + refcount.references = 0; lh_ERR_STATE_free(int_thread_hash); int_thread_hash = NULL; hash = NULL; diff --git a/crypto/evp/p_lib.c b/crypto/evp/p_lib.c index 0626c27e15..1f9f6f010f 100644 --- a/crypto/evp/p_lib.c +++ b/crypto/evp/p_lib.c @@ -425,17 +425,10 @@ void EVP_PKEY_free(EVP_PKEY *x) return; i = CRYPTO_add(&x->references, -1, CRYPTO_LOCK_EVP_PKEY); -#ifdef REF_PRINT - REF_PRINT("EVP_PKEY", x); -#endif + REF_PRINT_COUNT("EVP_PKEY", x); if (i > 0) return; -#ifdef REF_CHECK - if (i < 0) { - fprintf(stderr, "EVP_PKEY_free, bad reference count\n"); - abort(); - } -#endif + REF_ASSERT_ISNT(i < 0); EVP_PKEY_free_it(x); sk_X509_ATTRIBUTE_pop_free(x->attributes, X509_ATTRIBUTE_free); OPENSSL_free(x); diff --git a/crypto/lock.c b/crypto/lock.c index 0925214f32..9be78c4ed8 100644 --- a/crypto/lock.c +++ b/crypto/lock.c @@ -305,7 +305,7 @@ void CRYPTO_destroy_dynlockid(int i) pointer = sk_CRYPTO_dynlock_value(dyn_locks, i); if (pointer != NULL) { --pointer->references; -#ifdef REF_CHECK +#ifdef REF_DEBUG if (pointer->references < 0) { OPENSSL_showfatal("CRYPTO_destroy_dynlockid, bad reference count\n"); abort(); diff --git a/crypto/rsa/rsa_lib.c b/crypto/rsa/rsa_lib.c index 62b2854ecc..a8afb2cef7 100644 --- a/crypto/rsa/rsa_lib.c +++ b/crypto/rsa/rsa_lib.c @@ -183,17 +183,10 @@ void RSA_free(RSA *r) return; i = CRYPTO_add(&r->references, -1, CRYPTO_LOCK_RSA); -#ifdef REF_PRINT - REF_PRINT("RSA", r); -#endif + REF_PRINT_COUNT("RSA", r); if (i > 0) return; -#ifdef REF_CHECK - if (i < 0) { - fprintf(stderr, "RSA_free, bad reference count\n"); - abort(); - } -#endif + REF_ASSERT_ISNT(i < 0); if (r->meth->finish) r->meth->finish(r); @@ -221,15 +214,9 @@ void RSA_free(RSA *r) int RSA_up_ref(RSA *r) { int i = CRYPTO_add(&r->references, 1, CRYPTO_LOCK_RSA); -#ifdef REF_PRINT - REF_PRINT("RSA", r); -#endif -#ifdef REF_CHECK - if (i < 2) { - fprintf(stderr, "RSA_up_ref, bad reference count\n"); - abort(); - } -#endif + + REF_PRINT_COUNT("RSA", r); + REF_ASSERT_ISNT(i < 2); return ((i > 1) ? 1 : 0); } diff --git a/crypto/x509/x509_lu.c b/crypto/x509/x509_lu.c index cd84394141..b53ec48032 100644 --- a/crypto/x509/x509_lu.c +++ b/crypto/x509/x509_lu.c @@ -229,17 +229,10 @@ void X509_STORE_free(X509_STORE *vfy) return; i = CRYPTO_add(&vfy->references, -1, CRYPTO_LOCK_X509_STORE); -#ifdef REF_PRINT - REF_PRINT("X509_STORE", vfy); -#endif + REF_PRINT_COUNT("X509_STORE", vfy); if (i > 0) return; -#ifdef REF_CHECK - if (i < 0) { - fprintf(stderr, "X509_STORE_free, bad reference count\n"); - abort(); /* ok */ - } -#endif + REF_ASSERT_ISNT(i < 0); sk = vfy->get_cert_methods; for (i = 0; i < sk_X509_LOOKUP_num(sk); i++) { diff --git a/e_os.h b/e_os.h index 4456b7e51c..0701a78d5c 100644 --- a/e_os.h +++ b/e_os.h @@ -71,15 +71,26 @@ extern "C" { #endif /* Used to checking reference counts, most while doing perl5 stuff :-) */ -# ifdef REF_PRINT -# undef REF_PRINT -# define REF_PRINT(a,b) fprintf(stderr,"%08X:%4d:%s\n",(int)b,b->references,a) +# if defined(OPENSSL_NO_STDIO) +# if defined(REF_DEBUG) +# error "REF_DEBUG requires stdio" +# endif +# if defined(REF_PRINT) +# error "REF_PRINT requires stdio" +# endif # endif -# if defined(OPENSSL_NO_STDIO) && defined(REF_CHECK) -# error "Cannot have REF_CHECK with no-stdio" + +# if defined(REF_DEBUG) +# define REF_ASSERT_ISNT(test) \ + (void)((test) ? (OpenSSLDie(__FILE__, __LINE__, "refcount error"), 1) : 0) +# else +# define REF_ASSERT_ISNT(i) # endif -# if defined(OPENSSL_NO_STDIO) && defined(REF_PRINT) -# error "Cannot have REF_PRINT with no-stdio" +# ifdef REF_PRINT +# define REF_PRINT_COUNT(a, b) \ + fprintf(stderr, "%p:%4d:%s\n", b, b->references, a) +# else +# define REF_PRINT_COUNT(a, b) # endif # ifndef DEVRANDOM diff --git a/include/openssl/bio.h b/include/openssl/bio.h index cfb7b0fd33..a1b4ced571 100644 --- a/include/openssl/bio.h +++ b/include/openssl/bio.h @@ -857,6 +857,7 @@ void ERR_load_BIO_strings(void); # define BIO_F_BIO_PUTS 110 # define BIO_F_BIO_READ 111 # define BIO_F_BIO_SOCKET 140 +# define BIO_F_BIO_SOCKET_NBIO 142 # define BIO_F_BIO_SOCK_INFO 141 # define BIO_F_BIO_SOCK_INIT 112 # define BIO_F_BIO_WRITE 113 diff --git a/ssl/ssl_cert.c b/ssl/ssl_cert.c index dc58e25752..cc82fff423 100644 --- a/ssl/ssl_cert.c +++ b/ssl/ssl_cert.c @@ -335,17 +335,10 @@ void ssl_cert_free(CERT *c) return; i = CRYPTO_add(&c->references, -1, CRYPTO_LOCK_SSL_CERT); -#ifdef REF_PRINT - REF_PRINT("CERT", c); -#endif + REF_PRINT_COUNT("CERT", c); if (i > 0) return; -#ifdef REF_CHECK - if (i < 0) { - fprintf(stderr, "ssl_cert_free, bad reference count\n"); - abort(); /* ok */ - } -#endif + REF_ASSERT_ISNT(i < 0); #ifndef OPENSSL_NO_DH EVP_PKEY_free(c->dh_tmp); diff --git a/ssl/ssl_conf.c b/ssl/ssl_conf.c index 1846155424..809ce7a872 100644 --- a/ssl/ssl_conf.c +++ b/ssl/ssl_conf.c @@ -55,9 +55,6 @@ * */ -#ifdef REF_CHECK -# include -#endif #include #include "ssl_locl.h" #include diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c index d0802207ce..c7d178da89 100644 --- a/ssl/ssl_lib.c +++ b/ssl/ssl_lib.c @@ -142,7 +142,7 @@ * OTHERWISE. */ -#ifdef REF_CHECK +#ifdef REF_DEBUG # include #endif #include @@ -995,17 +995,10 @@ void SSL_free(SSL *s) return; i = CRYPTO_add(&s->references, -1, CRYPTO_LOCK_SSL); -#ifdef REF_PRINT - REF_PRINT("SSL", s); -#endif + REF_PRINT_COUNT("SSL", s); if (i > 0) return; -#ifdef REF_CHECK - if (i < 0) { - fprintf(stderr, "SSL_free, bad reference count\n"); - abort(); /* ok */ - } -#endif + REF_ASSERT_ISNT(i < 0); X509_VERIFY_PARAM_free(s->param); dane_final(&s->dane); @@ -2400,17 +2393,10 @@ void SSL_CTX_free(SSL_CTX *a) return; i = CRYPTO_add(&a->references, -1, CRYPTO_LOCK_SSL_CTX); -#ifdef REF_PRINT - REF_PRINT("SSL_CTX", a); -#endif + REF_PRINT_COUNT("SSL_CTX", a); if (i > 0) return; -#ifdef REF_CHECK - if (i < 0) { - fprintf(stderr, "SSL_CTX_free, bad reference count\n"); - abort(); /* ok */ - } -#endif + REF_ASSERT_ISNT(i < 0); X509_VERIFY_PARAM_free(a->param); dane_ctx_final(&a->dane); @@ -3274,8 +3260,11 @@ void ssl_free_wbio_buffer(SSL *s) if (s->bbio == s->wbio) { /* remove buffering */ s->wbio = BIO_pop(s->wbio); -#ifdef REF_CHECK /* not the usual REF_CHECK, but this avoids - * adding one more preprocessor symbol */ +#ifdef REF_DEBUG + /* + * not the usual REF_DEBUG, but this avoids + * adding one more preprocessor symbol + */ assert(s->wbio != NULL); #endif } diff --git a/ssl/ssl_sess.c b/ssl/ssl_sess.c index 85f6c7ff67..97f3ce2480 100644 --- a/ssl/ssl_sess.c +++ b/ssl/ssl_sess.c @@ -814,17 +814,10 @@ void SSL_SESSION_free(SSL_SESSION *ss) return; i = CRYPTO_add(&ss->references, -1, CRYPTO_LOCK_SSL_SESSION); -#ifdef REF_PRINT - REF_PRINT("SSL_SESSION", ss); -#endif + REF_PRINT_COUNT("SSL_SESSION", ss); if (i > 0) return; -#ifdef REF_CHECK - if (i < 0) { - fprintf(stderr, "SSL_SESSION_free, bad reference count\n"); - abort(); /* ok */ - } -#endif + REF_ASSERT_ISNT(i < 0); CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->ex_data); diff --git a/util/pl/linux.pl b/util/pl/linux.pl index 60ffc25930..fa281c8ba3 100644 --- a/util/pl/linux.pl +++ b/util/pl/linux.pl @@ -11,7 +11,7 @@ $rm='/bin/rm -f'; $cc='gcc'; if ($debug) - { $cflags="-g2 -ggdb -DREF_CHECK"; } + { $cflags="-g2 -ggdb -DREF_DEBUG"; } elsif ($profile) { $cflags="-pg -O3"; } else diff --git a/util/pl/ultrix.pl b/util/pl/ultrix.pl index c5e3be861c..1887794798 100644 --- a/util/pl/ultrix.pl +++ b/util/pl/ultrix.pl @@ -11,7 +11,7 @@ $rm='/bin/rm -f'; $cc='cc'; if ($debug) - { $cflags="-g -DREF_CHECK"; } + { $cflags="-g -DREF_DEBUG"; } else { $cflags="-O2"; } -- 2.25.1