aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorNoah Misch <noah@leadboat.com>2019-05-12 10:33:05 -0700
committerNoah Misch <noah@leadboat.com>2019-05-12 10:33:08 -0700
commit4ec14e5aa1f79d01a2558b694ccbe7756c4d186e (patch)
tree79adb60dac485a22f5882b1d8585fd9f2fa84412 /src/backend
parenteb97242c2f78869376277567dcb8102283368489 (diff)
downloadpostgresql-4ec14e5aa1f79d01a2558b694ccbe7756c4d186e.tar.gz
postgresql-4ec14e5aa1f79d01a2558b694ccbe7756c4d186e.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
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/utils/mb/mbutils.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c
index 8d80ffe78ba..d10b3d0c260 100644
--- a/src/backend/utils/mb/mbutils.c
+++ b/src/backend/utils/mb/mbutils.c
@@ -1046,11 +1046,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,
@@ -1075,7 +1080,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);