From fb23cc7e81db181bfb3dcfed6ad0731a3473d4e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Herrera?= Date: Mon, 8 Jun 2026 19:49:54 +0200 Subject: [PATCH] Fix syslogger NULL-pointer-dereference in EXEC_BACKEND MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Commit 0c8e082fba8d changed the time at which MyBackendType is assigned, breaking a careful choreography in syslogger to decide when to write messages to its own log files. Fix by flipping a boolean at the (approximate) location where previously MyBackendType was set, instead of depending on MyBackendType directly. Author: Álvaro Herrera Reported-by: Michael Paquier Reviewed-by: Euler Taveira Reviewed-by: Michael Paquier Discussion: https://postgr.es/m/ahP-JT4ZRPyobnLb@paquier.xyz --- src/backend/postmaster/syslogger.c | 19 +++++++++++++++++++ src/backend/utils/error/csvlog.c | 2 +- src/backend/utils/error/elog.c | 6 +++--- src/backend/utils/error/jsonlog.c | 2 +- src/include/postmaster/syslogger.h | 1 + 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c index acfe0a01715..7645c495a81 100644 --- a/src/backend/postmaster/syslogger.c +++ b/src/backend/postmaster/syslogger.c @@ -76,6 +76,12 @@ char *Log_filename = NULL; bool Log_truncate_on_rotation = false; int Log_file_mode = S_IRUSR | S_IWUSR; +/* + * Indicates to be running in the syslogger process, and that the logging + * file descriptor(s) have been set up. + */ +bool syslogger_setup_done = false; + /* * Private state */ @@ -175,6 +181,17 @@ SysLoggerMain(const void *startup_data, size_t startup_data_len) pg_time_t now; WaitEventSet *wes; +#ifndef EXEC_BACKEND + + /* + * In !EXEC_BACKEND, syslogger is immediately ready to take over: the + * output files were already opened by postmaster before forking. For the + * other case we must wait until the file descriptors have been restored, + * below. + */ + syslogger_setup_done = true; +#endif + /* * Re-open the error output files that were opened by SysLogger_Start(). * @@ -190,6 +207,8 @@ SysLoggerMain(const void *startup_data, size_t startup_data_len) syslogFile = syslogger_fdopen(slsdata->syslogFile); csvlogFile = syslogger_fdopen(slsdata->csvlogFile); jsonlogFile = syslogger_fdopen(slsdata->jsonlogFile); + + syslogger_setup_done = true; } #else Assert(startup_data_len == 0); diff --git a/src/backend/utils/error/csvlog.c b/src/backend/utils/error/csvlog.c index 2b2b9484bdc..ee4e2a7104a 100644 --- a/src/backend/utils/error/csvlog.c +++ b/src/backend/utils/error/csvlog.c @@ -253,7 +253,7 @@ write_csvlog(ErrorData *edata) appendStringInfoChar(&buf, '\n'); /* If in the syslogger process, try to write messages direct to file */ - if (MyBackendType == B_LOGGER) + if (syslogger_setup_done) write_syslogger_file(buf.data, buf.len, LOG_DESTINATION_CSVLOG); else write_pipe_chunks(buf.data, buf.len, LOG_DESTINATION_CSVLOG); diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 50c53b571a0..a6936a0c664 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -3831,7 +3831,7 @@ send_message_to_server_log(ErrorData *edata) * pipe). If this is not possible, fallback to an entry written to * stderr. */ - if (redirection_done || MyBackendType == B_LOGGER) + if (redirection_done || syslogger_setup_done) write_csvlog(edata); else fallback_to_stderr = true; @@ -3845,7 +3845,7 @@ send_message_to_server_log(ErrorData *edata) * pipe). If this is not possible, fallback to an entry written to * stderr. */ - if (redirection_done || MyBackendType == B_LOGGER) + if (redirection_done || syslogger_setup_done) { write_jsonlog(edata); } @@ -3885,7 +3885,7 @@ send_message_to_server_log(ErrorData *edata) } /* If in the syslogger process, try to write messages direct to file */ - if (MyBackendType == B_LOGGER) + if (syslogger_setup_done) write_syslogger_file(buf.data, buf.len, LOG_DESTINATION_STDERR); /* No more need of the message formatted for stderr */ diff --git a/src/backend/utils/error/jsonlog.c b/src/backend/utils/error/jsonlog.c index e5ba22794d2..4a76072830d 100644 --- a/src/backend/utils/error/jsonlog.c +++ b/src/backend/utils/error/jsonlog.c @@ -292,7 +292,7 @@ write_jsonlog(ErrorData *edata) appendStringInfoChar(&buf, '\n'); /* If in the syslogger process, try to write messages direct to file */ - if (MyBackendType == B_LOGGER) + if (syslogger_setup_done) write_syslogger_file(buf.data, buf.len, LOG_DESTINATION_JSONLOG); else write_pipe_chunks(buf.data, buf.len, LOG_DESTINATION_JSONLOG); diff --git a/src/include/postmaster/syslogger.h b/src/include/postmaster/syslogger.h index 30c4b2daf3f..44409fc2542 100644 --- a/src/include/postmaster/syslogger.h +++ b/src/include/postmaster/syslogger.h @@ -85,6 +85,7 @@ extern PGDLLIMPORT int syslogPipe[2]; extern PGDLLIMPORT HANDLE syslogPipe[2]; #endif +extern bool syslogger_setup_done; extern int SysLogger_Start(int child_slot);