Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Fail pgwin32_message_to_UTF16() for SQL_ASCII messages.
authorNoah Misch <noah@leadboat.com>
Sun, 12 May 2019 17:33:05 +0000 (10:33 -0700)
committerNoah Misch <noah@leadboat.com>
Sun, 12 May 2019 17:34:22 +0000 (10:34 -0700)
The function had been interpreting SQL_ASCII messages as UTF8, throwing
an error when they were invalid UTF8.  The new behavior is consistent
with pg_do_encoding_conversion().  This affects LOG_DESTINATION_STDERR
and LOG_DESTINATION_EVENTLOG, which will send untranslated bytes to
write() and ReportEventA().  On buildfarm member bowerbird, enabling
log_connections caused an error whenever the role name was not valid
UTF8.  Back-patch to 9.4 (all supported versions).

Discussion: https://postgr.es/m/20190512015615.GD1124997@rfd.leadboat.com

src/backend/utils/mb/mbutils.c

index 2e792b4f189a1a2de835f00bfc8e85dd55a747af..7f4a2f5fcf31888f78ea4463b652cfc5ec8ca17c 100644 (file)
@@ -1057,11 +1057,16 @@ GetMessageEncoding(void)
 WCHAR *
 pgwin32_message_to_UTF16(const char *str, int len, int *utf16len)
 {
+   int         msgenc = GetMessageEncoding();
    WCHAR      *utf16;
    int         dstlen;
    UINT        codepage;
 
-   codepage = pg_enc2name_tbl[GetMessageEncoding()].codepage;
+   if (msgenc == PG_SQL_ASCII)
+       /* No conversion is possible, and SQL_ASCII is never utf16. */
+       return NULL;
+
+   codepage = pg_enc2name_tbl[msgenc].codepage;
 
    /*
     * Use MultiByteToWideChar directly if there is a corresponding codepage,
@@ -1086,7 +1091,7 @@ pgwin32_message_to_UTF16(const char *str, int len, int *utf16len)
        {
            utf8 = (char *) pg_do_encoding_conversion((unsigned char *) str,
                                                      len,
-                                                     GetMessageEncoding(),
+                                                     msgenc,
                                                      PG_UTF8);
            if (utf8 != str)
                len = strlen(utf8);