X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=crypto%2Ftrace.c;h=ecfc6d4e3101e59a778098c6544207b23513504b;hb=792ea008af17238d2af91301241973dc4f4f544c;hp=c0b3ab2ed5aa8473fca4971d7d33e1d28b47ce02;hpb=d33d76168fb7642916cdcb7ccb0513abdb6f5f05;p=oweals%2Fopenssl.git diff --git a/crypto/trace.c b/crypto/trace.c index c0b3ab2ed5..ecfc6d4e31 100644 --- a/crypto/trace.c +++ b/crypto/trace.c @@ -65,7 +65,7 @@ static int trace_write(BIO *channel, const char *buf, size_t num, size_t *written) { struct trace_data_st *ctx = BIO_get_data(channel); - size_t cnt = ctx->callback(buf, num, ctx->category, OSSL_TRACE_CTRL_DURING, + size_t cnt = ctx->callback(buf, num, ctx->category, OSSL_TRACE_CTRL_WRITE, ctx->data); *written = cnt; @@ -119,12 +119,12 @@ struct trace_category_st { #define TRACE_CATEGORY_(name) { #name, OSSL_TRACE_CATEGORY_##name } static const struct trace_category_st trace_categories[] = { - TRACE_CATEGORY_(ANY), + TRACE_CATEGORY_(ALL), TRACE_CATEGORY_(TRACE), TRACE_CATEGORY_(INIT), TRACE_CATEGORY_(TLS), TRACE_CATEGORY_(TLS_CIPHER), - TRACE_CATEGORY_(ENGINE_CONF), + TRACE_CATEGORY_(CONF), TRACE_CATEGORY_(ENGINE_TABLE), TRACE_CATEGORY_(ENGINE_REF_COUNT), TRACE_CATEGORY_(PKCS5V2), @@ -158,7 +158,7 @@ int OSSL_trace_get_category_num(const char *name) /* We use one trace channel for each trace category */ static struct { - enum { t_channel, t_callback } type; + enum { SIMPLE_CHANNEL, CALLBACK_CHANNEL } type; BIO *bio; char *prefix; char *suffix; @@ -169,18 +169,25 @@ static struct { #endif #ifndef OPENSSL_NO_TRACE + +enum { + CHANNEL, + PREFIX, + SUFFIX +}; + static int trace_attach_cb(int category, int type, const void *data) { switch (type) { - case 0: /* Channel */ + case CHANNEL: OSSL_TRACE2(TRACE, "Attach channel %p to category '%s'\n", data, trace_categories[category].name); break; - case 1: /* Prefix */ + case PREFIX: OSSL_TRACE2(TRACE, "Attach prefix \"%s\" to category '%s'\n", (const char *)data, trace_categories[category].name); break; - case 2: /* Suffix */ + case SUFFIX: OSSL_TRACE2(TRACE, "Attach suffix \"%s\" to category '%s'\n", (const char *)data, trace_categories[category].name); break; @@ -193,15 +200,15 @@ static int trace_attach_cb(int category, int type, const void *data) static int trace_detach_cb(int category, int type, const void *data) { switch (type) { - case 0: /* Channel */ + case CHANNEL: OSSL_TRACE2(TRACE, "Detach channel %p from category '%s'\n", data, trace_categories[category].name); break; - case 1: /* Prefix */ + case PREFIX: OSSL_TRACE2(TRACE, "Detach prefix \"%s\" from category '%s'\n", (const char *)data, trace_categories[category].name); break; - case 2: /* Suffix */ + case SUFFIX: OSSL_TRACE2(TRACE, "Detach suffix \"%s\" from category '%s'\n", (const char *)data, trace_categories[category].name); break; @@ -211,7 +218,7 @@ static int trace_detach_cb(int category, int type, const void *data) return 1; } -static int set_trace_data(int category, BIO **channel, +static int set_trace_data(int category, int type, BIO **channel, const char **prefix, const char **suffix, int (*attach_cb)(int, int, const void *), int (*detach_cb)(int, int, const void *)) @@ -222,15 +229,15 @@ static int set_trace_data(int category, BIO **channel, /* Make sure to run the detach callback first on all data */ if (prefix != NULL && curr_prefix != NULL) { - detach_cb(category, 1, curr_prefix); + detach_cb(category, PREFIX, curr_prefix); } if (suffix != NULL && curr_suffix != NULL) { - detach_cb(category, 2, curr_suffix); + detach_cb(category, SUFFIX, curr_suffix); } if (channel != NULL && curr_channel != NULL) { - detach_cb(category, 0, curr_channel); + detach_cb(category, CHANNEL, curr_channel); } /* After detach callbacks are done, clear data where appropriate */ @@ -246,11 +253,13 @@ static int set_trace_data(int category, BIO **channel, if (channel != NULL && curr_channel != NULL) { BIO_free(curr_channel); + trace_channels[category].type = 0; trace_channels[category].bio = NULL; } /* Before running callbacks are done, set new data where appropriate */ if (channel != NULL && *channel != NULL) { + trace_channels[category].type = type; trace_channels[category].bio = *channel; } @@ -268,15 +277,15 @@ static int set_trace_data(int category, BIO **channel, /* Finally, run the attach callback on the new data */ if (channel != NULL && *channel != NULL) { - attach_cb(category, 0, *channel); + attach_cb(category, CHANNEL, *channel); } if (prefix != NULL && *prefix != NULL) { - attach_cb(category, 1, *prefix); + attach_cb(category, PREFIX, *prefix); } if (suffix != NULL && *suffix != NULL) { - attach_cb(category, 2, *suffix); + attach_cb(category, SUFFIX, *suffix); } return 1; @@ -306,10 +315,11 @@ void ossl_trace_cleanup(void) /* We force the TRACE category to be treated last */ if (category == OSSL_TRACE_CATEGORY_TRACE) continue; - set_trace_data(category, &channel, &prefix, &suffix, + set_trace_data(category, 0, &channel, &prefix, &suffix, trace_attach_cb, trace_detach_cb); } - set_trace_data(OSSL_TRACE_CATEGORY_TRACE, &channel, &prefix, &suffix, + set_trace_data(OSSL_TRACE_CATEGORY_TRACE, 0, &channel, + &prefix, &suffix, trace_attach_cb, trace_detach_cb); CRYPTO_THREAD_lock_free(trace_lock); #endif @@ -318,30 +328,27 @@ void ossl_trace_cleanup(void) int OSSL_trace_set_channel(int category, BIO *channel) { #ifndef OPENSSL_NO_TRACE - if (category < 0 || category >= OSSL_TRACE_CATEGORY_NUM - || !set_trace_data(category, &channel, NULL, NULL, - trace_attach_cb, trace_detach_cb)) - return 0; - - trace_channels[category].type = t_channel; + if (category >= 0 && category < OSSL_TRACE_CATEGORY_NUM) + return set_trace_data(category, SIMPLE_CHANNEL, &channel, NULL, NULL, + trace_attach_cb, trace_detach_cb); #endif - return 1; + return 0; } #ifndef OPENSSL_NO_TRACE static int trace_attach_w_callback_cb(int category, int type, const void *data) { switch (type) { - case 0: /* Channel */ + case CHANNEL: OSSL_TRACE2(TRACE, "Attach channel %p to category '%s' (with callback)\n", data, trace_categories[category].name); break; - case 1: /* Prefix */ + case PREFIX: OSSL_TRACE2(TRACE, "Attach prefix \"%s\" to category '%s'\n", (const char *)data, trace_categories[category].name); break; - case 2: /* Suffix */ + case SUFFIX: OSSL_TRACE2(TRACE, "Attach suffix \"%s\" to category '%s'\n", (const char *)data, trace_categories[category].name); break; @@ -359,7 +366,7 @@ int OSSL_trace_set_callback(int category, OSSL_trace_cb callback, void *data) struct trace_data_st *trace_data = NULL; if (category < 0 || category >= OSSL_TRACE_CATEGORY_NUM) - goto err; + return 0; if (callback != NULL) { if ((channel = BIO_new(&trace_method)) == NULL @@ -374,46 +381,38 @@ int OSSL_trace_set_callback(int category, OSSL_trace_cb callback, void *data) BIO_set_data(channel, trace_data); } - if (!set_trace_data(category, &channel, NULL, NULL, + if (!set_trace_data(category, CALLBACK_CHANNEL, &channel, NULL, NULL, trace_attach_w_callback_cb, trace_detach_cb)) goto err; - trace_channels[category].type = t_callback; - goto done; + return 1; err: BIO_free(channel); OPENSSL_free(trace_data); - return 0; - done: #endif - return 1; + + return 0; } int OSSL_trace_set_prefix(int category, const char *prefix) { - int rv = 1; - #ifndef OPENSSL_NO_TRACE - if (category >= 0 || category < OSSL_TRACE_CATEGORY_NUM) - return set_trace_data(category, NULL, &prefix, NULL, + if (category >= 0 && category < OSSL_TRACE_CATEGORY_NUM) + return set_trace_data(category, 0, NULL, &prefix, NULL, trace_attach_cb, trace_detach_cb); - rv = 0; #endif - return rv; + return 0; } int OSSL_trace_set_suffix(int category, const char *suffix) { - int rv = 1; - #ifndef OPENSSL_NO_TRACE - if (category >= 0 || category < OSSL_TRACE_CATEGORY_NUM) - return set_trace_data(category, NULL, NULL, &suffix, + if (category >= 0 && category < OSSL_TRACE_CATEGORY_NUM) + return set_trace_data(category, 0, NULL, NULL, &suffix, trace_attach_cb, trace_detach_cb); - rv = 0; #endif - return rv; + return 0; } #ifndef OPENSSL_NO_TRACE @@ -423,7 +422,7 @@ static int ossl_trace_get_category(int category) return -1; if (trace_channels[category].bio != NULL) return category; - return OSSL_TRACE_CATEGORY_ANY; + return OSSL_TRACE_CATEGORY_ALL; } #endif @@ -432,7 +431,8 @@ 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; + if (category >= 0) + ret = trace_channels[category].bio != NULL; #endif return ret; } @@ -444,6 +444,9 @@ BIO *OSSL_trace_begin(int category) char *prefix = NULL; category = ossl_trace_get_category(category); + if (category < 0) + return NULL; + channel = trace_channels[category].bio; prefix = trace_channels[category].prefix; @@ -451,13 +454,13 @@ BIO *OSSL_trace_begin(int category) CRYPTO_THREAD_write_lock(trace_lock); current_channel = channel; switch (trace_channels[category].type) { - case t_channel: + case SIMPLE_CHANNEL: if (prefix != NULL) { (void)BIO_puts(channel, prefix); (void)BIO_puts(channel, "\n"); } break; - case t_callback: + case CALLBACK_CHANNEL: (void)BIO_ctrl(channel, OSSL_TRACE_CTRL_BEGIN, prefix == NULL ? 0 : strlen(prefix), prefix); break; @@ -478,13 +481,13 @@ void OSSL_trace_end(int category, BIO * channel) && ossl_assert(channel == current_channel)) { (void)BIO_flush(channel); switch (trace_channels[category].type) { - case t_channel: + case SIMPLE_CHANNEL: if (suffix != NULL) { (void)BIO_puts(channel, suffix); (void)BIO_puts(channel, "\n"); } break; - case t_callback: + case CALLBACK_CHANNEL: (void)BIO_ctrl(channel, OSSL_TRACE_CTRL_END, suffix == NULL ? 0 : strlen(suffix), suffix); break;