Don't call pgwin32_message_to_UTF16() without CurrentMemoryContext.
authorNoah Misch
Sun, 12 Nov 2017 21:03:15 +0000 (13:03 -0800)
committerNoah Misch
Sun, 12 Nov 2017 21:03:29 +0000 (13:03 -0800)
PostgreSQL running as a Windows service crashed upon calling
write_stderr() before MemoryContextInit().  This fix completes work
started in 5735efee15540765315aa8c1a230575e756037f7.  Messages this
early contain only ASCII bytes; if we removed the CurrentMemoryContext
requirement, the ensuing conversions would have no effect.  Back-patch
to 9.3 (all supported versions).

Takayuki Tsunakawa, reviewed by Michael Paquier.

Discussion: https://postgr.es/m/0A3221C70F24FB45833433255569204D1F80CC73@G01JPEXMBYT05

src/backend/utils/error/elog.c
src/backend/utils/mb/mbutils.c

index 47a3dffdcf52a217d2572a065840993cd198cdf5..10c90750c0c0f1c6a9f3d61ac4a729f55d8d4b81 100644 (file)
@@ -2041,10 +2041,15 @@ write_eventlog(int level, const char *line, int len)
     * try to convert the message to UTF16 and write it with ReportEventW().
     * Fall back on ReportEventA() if conversion failed.
     *
+    * Since we palloc the structure required for conversion, also fall
+    * through to writing unconverted if we have not yet set up
+    * CurrentMemoryContext.
+    *
     * Also verify that we are not on our way into error recursion trouble due
     * to error messages thrown deep inside pgwin32_message_to_UTF16().
     */
    if (!in_error_recursion_trouble() &&
+       CurrentMemoryContext != NULL &&
        GetMessageEncoding() != GetACPEncoding())
    {
        utf16 = pgwin32_message_to_UTF16(line, len, NULL);
index 436229b9893249ae6c5e3dfb583de9a10360eba4..5b80e51717d1f0c28d7c6750669bd8c670b23c3e 100644 (file)
@@ -1049,8 +1049,10 @@ GetMessageEncoding(void)
 
 #ifdef WIN32
 /*
- * Result is palloc'ed null-terminated utf16 string. The character length
- * is also passed to utf16len if not null. Returns NULL iff failed.
+ * Convert from MessageEncoding to a palloc'ed, null-terminated utf16
+ * string. The character length is also passed to utf16len if not
+ * null. Returns NULL iff failed. Before MessageEncoding initialization, "str"
+ * should be ASCII-only; this will function as though MessageEncoding is UTF8.
  */
 WCHAR *
 pgwin32_message_to_UTF16(const char *str, int len, int *utf16len)