OSSL_TRACE: ensure it's initialised
authorRichard Levitte <levitte@openssl.org>
Fri, 21 Jun 2019 09:20:15 +0000 (11:20 +0200)
committerRichard Levitte <levitte@openssl.org>
Sat, 22 Jun 2019 07:02:22 +0000 (09:02 +0200)
When OSSL_TRACE functionality is called before anything else, it finds
itself uninitialised, i.e. its global lock hasn't been created yet.

Fortunately, we have an internal general setup function for the trace
functionality, that makes for a perfect spot to trigger initialisation.

Reviewed-by: Matthias St. Pierre <Matthias.St.Pierre@ncp-e.com>
(Merged from https://github.com/openssl/openssl/pull/9212)

crypto/trace.c

index ecfc6d4e3101e59a778098c6544207b23513504b..f4b96866a8be877cfeccc7aa27969110e3cbe210 100644 (file)
@@ -132,6 +132,8 @@ static const struct trace_category_st trace_categories[] = {
     TRACE_CATEGORY_(PKCS12_DECRYPT),
     TRACE_CATEGORY_(X509V3_POLICY),
     TRACE_CATEGORY_(BN_CTX),
+    TRACE_CATEGORY_(PROV),
+    TRACE_CATEGORY_(FETCH),
 };
 
 const char *OSSL_trace_get_category_name(int num)
@@ -223,9 +225,16 @@ static int set_trace_data(int category, int type, BIO **channel,
                           int (*attach_cb)(int, int, const void *),
                           int (*detach_cb)(int, int, const void *))
 {
-    BIO *curr_channel = trace_channels[category].bio;
-    char *curr_prefix = trace_channels[category].prefix;
-    char *curr_suffix = trace_channels[category].suffix;
+    BIO *curr_channel = NULL;
+    char *curr_prefix = NULL;
+    char *curr_suffix = NULL;
+
+    /* Ensure ossl_trace_init() is called */
+    OPENSSL_init_crypto(0, NULL);
+
+    curr_channel = trace_channels[category].bio;
+    curr_prefix = trace_channels[category].prefix;
+    curr_suffix = trace_channels[category].suffix;
 
     /* Make sure to run the detach callback first on all data */
     if (prefix != NULL && curr_prefix != NULL) {