]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix incorrect message-printing in win32security.c.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 13 Oct 2025 21:56:45 +0000 (17:56 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 13 Oct 2025 21:56:45 +0000 (17:56 -0400)
log_error() would probably fail completely if used, and would
certainly print garbage for anything that needed to be interpolated
into the message, because it was failing to use the correct printing
subroutine for a va_list argument.

This bug likely went undetected because the error cases this code
is used for are rarely exercised - they only occur when Windows
security API calls fail catastrophically (out of memory, security
subsystem corruption, etc).

The FRONTEND variant can be fixed just by calling vfprintf()
instead of fprintf().  However, there was no va_list variant
of write_stderr(), so create one by refactoring that function.
Following the usual naming convention for such things, call
it vwrite_stderr().

Author: Bryan Green <dbryan.green@gmail.com>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/CAF+pBj8goe4fRmZ0V3Cs6eyWzYLvK+HvFLYEYWG=TzaM+tWPnw@mail.gmail.com
Backpatch-through: 13

src/backend/utils/error/elog.c
src/include/utils/elog.h
src/port/win32security.c

index 31cff62da353140a060fe2963cd3ffba01e898a9..1cc50e39b4d6c6b21e4e556d1616d6afdd86e9ae 100644 (file)
@@ -3444,13 +3444,24 @@ write_stderr(const char *fmt,...)
 {
        va_list         ap;
 
+       va_start(ap, fmt);
+       vwrite_stderr(fmt, ap);
+       va_end(ap);
+}
+
+
+/*
+ * Write errors to stderr (or by equal means when stderr is
+ * not available) - va_list version
+ */
+void
+vwrite_stderr(const char *fmt, va_list ap)
+{
 #ifdef WIN32
        char            errbuf[2048];   /* Arbitrary size? */
 #endif
 
        fmt = _(fmt);
-
-       va_start(ap, fmt);
 #ifndef WIN32
        /* On Unix, we just fprintf to stderr */
        vfprintf(stderr, fmt, ap);
@@ -3473,7 +3484,6 @@ write_stderr(const char *fmt,...)
                fflush(stderr);
        }
 #endif
-       va_end(ap);
 }
 
 
index 1b263a886dbf52555ba2807113650ea01715fe53..624a4f2b6cece20206ff780f9c01399307d69bc8 100644 (file)
@@ -435,6 +435,7 @@ extern void set_syslog_parameters(const char *ident, int facility);
  * safely (memory context, GUC load etc)
  */
 extern void write_stderr(const char *fmt,...) pg_attribute_printf(1, 2);
+extern void vwrite_stderr(const char *fmt, va_list ap) pg_attribute_printf(1, 0);
 
 /*
  * Write a message to STDERR using only async-signal-safe functions.  This can
index 577162e5478abc4bdefa626c7b0944d3908ca7c1..cbbe06fbe6b4034b9324a384b5604e002b58135b 100644 (file)
@@ -31,9 +31,9 @@ log_error(const char *fmt,...)
 
        va_start(ap, fmt);
 #ifndef FRONTEND
-       write_stderr(fmt, ap);
+       vwrite_stderr(fmt, ap);
 #else
-       fprintf(stderr, fmt, ap);
+       vfprintf(stderr, fmt, ap);
 #endif
        va_end(ap);
 }