mirror of
https://github.com/postgres/postgres.git
synced 2025-04-27 22:56:53 +03:00
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 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
This commit is contained in:
parent
0b7e76eb2b
commit
e02571b73f
@ -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)
|
|||||||
|
|
||||||
#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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user