Commit e02571b7 authored by Noah Misch's avatar Noah Misch

Don't call pgwin32_message_to_UTF16() without CurrentMemoryContext.

PostgreSQL running as a Windows service crashed upon calling
write_stderr() before MemoryContextInit().  This fix completes work
started in 5735efee.  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
parent 0b7e76eb
...@@ -2117,10 +2117,15 @@ write_eventlog(int level, const char *line, int len) ...@@ -2117,10 +2117,15 @@ write_eventlog(int level, const char *line, int len)
* try to convert the message to UTF16 and write it with ReportEventW(). * try to convert the message to UTF16 and write it with ReportEventW().
* Fall back on ReportEventA() if conversion failed. * 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 * Also verify that we are not on our way into error recursion trouble due
* to error messages thrown deep inside pgwin32_message_to_UTF16(). * to error messages thrown deep inside pgwin32_message_to_UTF16().
*/ */
if (!in_error_recursion_trouble() && if (!in_error_recursion_trouble() &&
CurrentMemoryContext != NULL &&
GetMessageEncoding() != GetACPEncoding()) GetMessageEncoding() != GetACPEncoding())
{ {
utf16 = pgwin32_message_to_UTF16(line, len, NULL); utf16 = pgwin32_message_to_UTF16(line, len, NULL);
......
...@@ -1038,8 +1038,10 @@ GetMessageEncoding(void) ...@@ -1038,8 +1038,10 @@ GetMessageEncoding(void)
#ifdef WIN32 #ifdef WIN32
/* /*
* Result is palloc'ed null-terminated utf16 string. The character length * Convert from MessageEncoding to a palloc'ed, null-terminated utf16
* is also passed to utf16len if not null. Returns NULL iff failed. * 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 * WCHAR *
pgwin32_message_to_UTF16(const char *str, int len, int *utf16len) pgwin32_message_to_UTF16(const char *str, int len, int *utf16len)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment