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:05:55 +0000 (13:05 -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

index fcb5f180b23885fb6b99c111be72b399140bc00e..6c72f23c5db6bc523ff46ceaabbd87d194957563 100644 (file)
@@ -1910,11 +1910,16 @@ write_eventlog(int level, const char *line, int len)
     * Convert message to UTF16 text and write it with ReportEventW, but
     * fall-back into 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_toUTF16().
     */
    if (GetDatabaseEncoding() != GetPlatformEncoding() &&
-       !in_error_recursion_trouble())
+       !in_error_recursion_trouble() &&
+       CurrentMemoryContext != NULL)
    {
        utf16 = pgwin32_toUTF16(line, len, NULL);
        if (utf16)