From: Richard Levitte Date: Thu, 20 Jun 2019 08:38:46 +0000 (+0200) Subject: test/testutil/init.c, apps/openssl.c: add trace cleanup handle earlier X-Git-Tag: openssl-3.0.0-alpha1~1880 X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff_plain;h=ba4341316ce762f917f973bb4ac604062fb11724 test/testutil/init.c, apps/openssl.c: add trace cleanup handle earlier It turned out that the internal trace cleanup handler was added too late, so it would be executed before OPENSSL_cleanup(). This results in address errors, as the trace code that's executed in OPENSSL_cleanup() itself tries to reach for data that's been freed at that point. Reviewed-by: Matt Caswell (Merged from https://github.com/openssl/openssl/pull/9196) --- diff --git a/apps/openssl.c b/apps/openssl.c index 9c0d933d7b..7a490cc455 100644 --- a/apps/openssl.c +++ b/apps/openssl.c @@ -216,6 +216,13 @@ static void setup_trace(const char *str) { char *val; + /* + * We add this handler as early as possible to ensure it's executed + * as late as possible, i.e. after the TRACE code has done its cleanup + * (which happens last in OPENSSL_cleanup). + */ + atexit(cleanup_trace); + trace_data_stack = sk_tracedata_new_null(); val = OPENSSL_strdup(str); @@ -240,7 +247,6 @@ static void setup_trace(const char *str) } OPENSSL_free(val); - atexit(cleanup_trace); } #endif /* OPENSSL_NO_TRACE */ diff --git a/test/testutil/init.c b/test/testutil/init.c index b4a7277f02..429c1a0333 100644 --- a/test/testutil/init.c +++ b/test/testutil/init.c @@ -102,6 +102,13 @@ static void setup_trace(const char *str) { char *val; + /* + * We add this handler as early as possible to ensure it's executed + * as late as possible, i.e. after the TRACE code has done its cleanup + * (which happens last in OPENSSL_cleanup). + */ + atexit(cleanup_trace); + trace_data_stack = sk_tracedata_new_null(); val = OPENSSL_strdup(str); @@ -126,7 +133,6 @@ static void setup_trace(const char *str) } OPENSSL_free(val); - atexit(cleanup_trace); } #endif /* OPENSSL_NO_TRACE */