diff options
author | Noah Misch <noah@leadboat.com> | 2019-05-12 10:33:05 -0700 |
---|---|---|
committer | Noah Misch <noah@leadboat.com> | 2019-05-12 10:34:22 -0700 |
commit | 9dc65bcf9dece8aa92f554db51112645c9751c9e (patch) | |
tree | c4a5516b9521df624d01fa0f31a17aff682fa768 | |
parent | 899f943ca43ad2752e36a44c6ed9dd19cff02f69 (diff) | |
download | postgresql-9dc65bcf9dece8aa92f554db51112645c9751c9e.tar.gz postgresql-9dc65bcf9dece8aa92f554db51112645c9751c9e.zip |
Fail pgwin32_message_to_UTF16() for SQL_ASCII messages.
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
-rw-r--r-- | src/backend/utils/mb/mbutils.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c index 2e792b4f189..7f4a2f5fcf3 100644 --- a/src/backend/utils/mb/mbutils.c +++ b/src/backend/utils/mb/mbutils.c @@ -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); |