]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Fix losing log prefix or IP change when log process is busy
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 21 Feb 2022 11:39:02 +0000 (12:39 +0100)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Tue, 22 Feb 2022 07:52:57 +0000 (07:52 +0000)
The fd for writing to log process is non-blocking. When sending options
to log process, it was done with write_full(), which stopped whenever
EAGAIN was returned. This error was simply ignored, and the logging code
thought that the prefix was successfully changed (or the IP was sent).

This mainly caused a problem when processes were reused and log process
was busy. The prefix update could have failed, and the following logging
would be using the previous session's log prefix, i.e. log lines could have
been logged for the wrong user/session.

Broken by 9372e48b702a3af5705785e08fbf47b0e37f2047

src/lib/failures.c

index d3d0002f5f36e7e3c65df2987776bd0b58d6f209..e98a749db4e4f060e4755a5e51c4c219b048ec10 100644 (file)
@@ -724,7 +724,8 @@ static void i_failure_send_option_forced(const char *key, const char *value)
 
        str = t_strdup_printf("\001%c%s %s=%s\n", LOG_TYPE_OPTION+1,
                              my_pid, key, value);
-       (void)write_full(STDERR_FILENO, str, strlen(str));
+       (void)log_fd_write(STDERR_FILENO, (const unsigned char *)str,
+                          strlen(str));
 }
 
 static void i_failure_send_option(const char *key, const char *value)