From 16a9d3746ef7e03207cc3cd290356613556959a5 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 12 Dec 2018 21:31:36 +0100 Subject: [PATCH] Make it possible to disable the TRACE API This disabled the tracing functionality by making functions do nothing, and making convenience macros produce dead code. Reviewed-by: Paul Dale (Merged from https://github.com/openssl/openssl/pull/8198) --- Configure | 1 + crypto/trace.c | 56 +++++++++++++++++++++++++++++++++++------ include/openssl/trace.h | 32 ++++++++++++++++++++--- 3 files changed, 77 insertions(+), 12 deletions(-) diff --git a/Configure b/Configure index 707e8b923b..b2410a2bde 100755 --- a/Configure +++ b/Configure @@ -417,6 +417,7 @@ my @disablables = ( "tests", "threads", "tls", + "trace", "ts", "ubsan", "ui-console", diff --git a/crypto/trace.c b/crypto/trace.c index fba33e90f3..a451d657f9 100644 --- a/crypto/trace.c +++ b/crypto/trace.c @@ -19,6 +19,8 @@ #include "e_os.h" /* strcasecmp for Windows */ +#ifndef OPENSSL_NO_TRACE + static CRYPTO_RWLOCK *trace_lock = NULL; static const BIO *current_channel = NULL; @@ -103,6 +105,7 @@ static int trace_free(BIO *channel) OPENSSL_free(BIO_get_data(channel)); return 1; } +#endif /*- * TRACE @@ -139,6 +142,8 @@ int OSSL_trace_get_category_num(const char *name) return -1; /* not found */ } +#ifndef OPENSSL_NO_TRACE + /* We use one trace channel for each trace category */ static struct { enum { t_channel, t_callback } type; @@ -149,29 +154,37 @@ static struct { { 0, NULL, NULL, NULL }, }; +#endif + int ossl_trace_init(void) { +#ifndef OPENSSL_NO_TRACE trace_lock = CRYPTO_THREAD_lock_new(); - if (trace_lock == NULL) - return 0; - return 1; + if (trace_lock != NULL) + return 1; +#endif + + return 0; } void ossl_trace_cleanup(void) { +#ifndef OPENSSL_NO_TRACE int category; for (category = 0; category < OSSL_TRACE_CATEGORY_NUM; category++) OSSL_trace_set_channel(category, NULL); CRYPTO_THREAD_lock_free(trace_lock); +#endif } int OSSL_trace_set_channel(int category, BIO *channel) { +#ifndef OPENSSL_NO_TRACE BIO *prev_channel; if (category < 0 || category >= OSSL_TRACE_CATEGORY_NUM) - return 0; + goto err; prev_channel = trace_channels[category].bio; @@ -181,16 +194,22 @@ int OSSL_trace_set_channel(int category, BIO *channel) } if (channel == NULL) - return 1; /* done */ + return 1; /* Done */ trace_channels[category].bio = channel; trace_channels[category].type = t_channel; return 1; + + err: +#endif + + return 0; } int OSSL_trace_set_callback(int category, OSSL_trace_cb callback, void *data) { +#ifndef OPENSSL_NO_TRACE BIO *channel = trace_channels[category].bio; struct trace_data_st *trace_data = NULL; @@ -224,12 +243,14 @@ int OSSL_trace_set_callback(int category, OSSL_trace_cb callback, void *data) err: BIO_free(channel); OPENSSL_free(trace_data); +#endif return 0; } int OSSL_trace_set_prefix(int category, const char *prefix) { +#ifndef OPENSSL_NO_TRACE char *curr_prefix = trace_channels[category].prefix; if (curr_prefix != NULL) { @@ -238,19 +259,25 @@ int OSSL_trace_set_prefix(int category, const char *prefix) } if (prefix == NULL) - return 1; /* done */ + return 1; /* Done */ curr_prefix = OPENSSL_strdup(prefix); if (curr_prefix == NULL) - return 0; + goto err; trace_channels[category].prefix = curr_prefix; return 1; + + err: +#endif + + return 0; } int OSSL_trace_set_suffix(int category, const char *suffix) { +#ifndef OPENSSL_NO_TRACE char *curr_suffix = trace_channels[category].suffix; if (curr_suffix != NULL) { @@ -263,13 +290,19 @@ int OSSL_trace_set_suffix(int category, const char *suffix) curr_suffix = OPENSSL_strdup(suffix); if (curr_suffix == NULL) - return 0; + goto err; trace_channels[category].suffix = curr_suffix; return 1; + + err: +#endif + + return 0; } +#ifndef OPENSSL_NO_TRACE static int ossl_trace_get_category(int category) { if (category < 0 || category >= OSSL_TRACE_CATEGORY_NUM) @@ -278,18 +311,22 @@ static int ossl_trace_get_category(int category) return category; return OSSL_TRACE_CATEGORY_ANY; } +#endif int OSSL_trace_enabled(int category) { int ret = 0; +#ifndef OPENSSL_NO_TRACE category = ossl_trace_get_category(category); ret = trace_channels[category].bio != NULL; +#endif return ret; } BIO *OSSL_trace_begin(int category) { BIO *channel = NULL; +#ifndef OPENSSL_NO_TRACE char *prefix = NULL; category = ossl_trace_get_category(category); @@ -312,11 +349,13 @@ BIO *OSSL_trace_begin(int category) break; } } +#endif return channel; } void OSSL_trace_end(int category, BIO * channel) { +#ifndef OPENSSL_NO_TRACE char *suffix = NULL; category = ossl_trace_get_category(category); @@ -339,4 +378,5 @@ void OSSL_trace_end(int category, BIO * channel) current_channel = NULL; CRYPTO_THREAD_unlock(trace_lock); } +#endif } diff --git a/include/openssl/trace.h b/include/openssl/trace.h index 59523c306d..df79478b78 100644 --- a/include/openssl/trace.h +++ b/include/openssl/trace.h @@ -173,19 +173,36 @@ void OSSL_trace_end(int category, BIO *channel); * call OSSL_TRACE_CANCEL(category). */ -# define OSSL_TRACE_BEGIN(category) \ +# ifndef OPENSSL_NO_TRACE + +# define OSSL_TRACE_BEGIN(category) \ do { \ BIO *trc_out = OSSL_trace_begin(OSSL_TRACE_CATEGORY_##category); \ \ if (trc_out != NULL) -# define OSSL_TRACE_END(category) \ +# define OSSL_TRACE_END(category) \ OSSL_trace_end(OSSL_TRACE_CATEGORY_##category, trc_out); \ } while (0) -# define OSSL_TRACE_CANCEL(category) \ +# define OSSL_TRACE_CANCEL(category) \ OSSL_trace_end(OSSL_TRACE_CATEGORY_##category, trc_out) \ +# else + +# define OSSL_TRACE_BEGIN(category) \ + do { \ + BIO *trc_out = NULL; \ + if (0) + +# define OSSL_TRACE_END(category) \ + } while(0) + +# define OSSL_TRACE_CANCEL(category) \ + ((void)0) + +# endif + /* * OSSL_TRACE_ENABLED() - Check whether tracing is enabled for |category| * @@ -195,10 +212,17 @@ void OSSL_trace_end(int category, BIO *channel); * ... * } */ +# ifndef OPENSSL_NO_TRACE -# define OSSL_TRACE_ENABLED(category) \ +# define OSSL_TRACE_ENABLED(category) \ OSSL_trace_enabled(OSSL_TRACE_CATEGORY_##category) +# else + +# define OSSL_TRACE_ENABLED(category) (0) + +# endif + /* * OSSL_TRACE*() - OneShot Trace Macros * -- 2.34.1