]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Fix potential log corruption with event_set_log_message_callback()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 20 Jun 2023 22:20:30 +0000 (01:20 +0300)
committermarkus.valentin <markus.valentin@open-xchange.com>
Fri, 23 Jun 2023 06:10:18 +0000 (06:10 +0000)
If the callback returned the same input log_prefix pointer back, the message
became corrupted because the log_prefix was soon changed.

src/lib/event-log.c

index c738ea2b3b0bcdb1e1b61347fcf90e95ad5920b1..af0b0576a52a97d898f14a37782fca5c00e33069 100644 (file)
@@ -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). */