From: Timo Sirainen Date: Tue, 20 Jun 2023 22:20:30 +0000 (+0300) Subject: lib: Fix potential log corruption with event_set_log_message_callback() X-Git-Tag: 2.4.0~2671 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4e054549b0b0d51f27655efa79c3a1e0647b9a43;p=thirdparty%2Fdovecot%2Fcore.git lib: Fix potential log corruption with event_set_log_message_callback() If the callback returned the same input log_prefix pointer back, the message became corrupted because the log_prefix was soon changed. --- diff --git a/src/lib/event-log.c b/src/lib/event-log.c index c738ea2b3b..af0b0576a5 100644 --- a/src/lib/event-log.c +++ b/src/lib/event-log.c @@ -192,20 +192,27 @@ event_get_log_message(struct event *event, /* construct the log message composed by children and arguments */ + const char *log_prefix = str_c(glmctx->log_prefix); if (glmctx->message == NULL) { str_vprintfa(glmctx->log_prefix, fmt, args); - in_message = str_c(glmctx->log_prefix); + in_message = log_prefix; } else if (str_len(glmctx->log_prefix) == 0) { in_message = glmctx->message; } else { str_append(glmctx->log_prefix, glmctx->message); - in_message = str_c(glmctx->log_prefix); + in_message = log_prefix; } /* reformat the log message */ glmctx->message = event->log_message_callback( event->log_message_callback_context, glmctx->params->log_type, in_message); + if (glmctx->message == log_prefix) { + /* The log message returned the input log_prefix + pointer. However, it's going to become modified, so + it needs to be duplicated. */ + glmctx->message = t_strdup(log_prefix); + } /* continue with a cleared prefix buffer (as prefix is now part of *message_r). */