summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDr. David von Oheimb <David.von.Oheimb@siemens.com>2022-12-22 11:42:14 +0100
committerHugo Landau <hlandau@openssl.org>2023-01-24 12:33:19 +0000
commita478dd11e9e827445e472c87288dfb77790d2d8e (patch)
treed2d91f716dc06cde31ed83440f14d23cc16cf586
parenta3dd46d2c63953a5c9349ee9d559b4303fd40af6 (diff)
set_trace_data(): prevent double free on OPENSSL_strdup() failure
Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Hugo Landau <hlandau@openssl.org> (Merged from https://github.com/openssl/openssl/pull/19959) (cherry picked from commit 0fec2121c0c40d8b098896c9bdf629a48fbafa63)
-rw-r--r--crypto/trace.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/crypto/trace.c b/crypto/trace.c
index 520d2a5178..de03fe954c 100644
--- a/crypto/trace.c
+++ b/crypto/trace.c
@@ -287,11 +287,6 @@ static int set_trace_data(int category, int type, BIO **channel,
}
/* 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;
- }
-
if (prefix != NULL && *prefix != NULL) {
if ((curr_prefix = OPENSSL_strdup(*prefix)) == NULL)
return 0;
@@ -304,6 +299,15 @@ static int set_trace_data(int category, int type, BIO **channel,
trace_channels[category].suffix = curr_suffix;
}
+ if (channel != NULL && *channel != NULL) {
+ trace_channels[category].type = type;
+ trace_channels[category].bio = *channel;
+ /*
+ * This must not be done before setting prefix/suffix,
+ * as those may fail, and then the caller is mislead to free *channel.
+ */
+ }
+
/* Finally, run the attach callback on the new data */
if (channel != NULL && *channel != NULL) {
attach_cb(category, CHANNEL, *channel);