]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix incorrect message-printing in win32security.c. REL_14_STABLE github/REL_14_STABLE
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 7ee60ddfec6c47f87cbd073f44e488321f411700..f8c0f0d3843a286e7b220b87a72d13ccc6db39f0 100644 (file)
@@ -3577,13 +3577,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);
@@ -3606,7 +3617,6 @@ write_stderr(const char *fmt,...)
                fflush(stderr);
        }
 #endif
-       va_end(ap);
 }
 
 
index f98a1e8b629b17c99c517edbf852e35e8ebf8119..cde7942b1eba5cedbde1af2f3e7dd81ee54486ed 100644 (file)
@@ -452,6 +452,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 4a673fde19a475dc1d3f93455542610c3f8baa66..5098a8d848952ceaa427262b1071652081b658b7 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);
 }