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
This commit is contained in:
Noah Misch 2019-05-12 10:33:05 -07:00
parent eb97242c2f
commit 4ec14e5aa1
3 changed files with 11 additions and 10 deletions

View File

@ -1046,11 +1046,16 @@ GetMessageEncoding(void)
WCHAR * WCHAR *
pgwin32_message_to_UTF16(const char *str, int len, int *utf16len) pgwin32_message_to_UTF16(const char *str, int len, int *utf16len)
{ {
int msgenc = GetMessageEncoding();
WCHAR *utf16; WCHAR *utf16;
int dstlen; int dstlen;
UINT codepage; 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, * 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, utf8 = (char *) pg_do_encoding_conversion((unsigned char *) str,
len, len,
GetMessageEncoding(), msgenc,
PG_UTF8); PG_UTF8);
if (utf8 != str) if (utf8 != str)
len = strlen(utf8); len = strlen(utf8);

View File

@ -14,10 +14,8 @@ else
plan tests => 14; plan tests => 14;
} }
# In a SQL_ASCII database, pgwin32_message_to_UTF16() needs to # We're going to use byte sequences that aren't valid UTF-8 strings. Use
# interpret everything as UTF8. We're going to use byte sequences # LATIN1, which accepts any byte and has a conversion from each byte to UTF-8.
# that aren't valid UTF-8 strings, so that would fail. Use LATIN1,
# which accepts any byte and has a conversion from each byte to UTF-8.
$ENV{LC_ALL} = 'C'; $ENV{LC_ALL} = 'C';
$ENV{PGCLIENTENCODING} = 'LATIN1'; $ENV{PGCLIENTENCODING} = 'LATIN1';

View File

@ -7,10 +7,8 @@ use Test::More tests => 3;
# Tests to check connection string handling in utilities # Tests to check connection string handling in utilities
# In a SQL_ASCII database, pgwin32_message_to_UTF16() needs to # We're going to use byte sequences that aren't valid UTF-8 strings. Use
# interpret everything as UTF8. We're going to use byte sequences # LATIN1, which accepts any byte and has a conversion from each byte to UTF-8.
# that aren't valid UTF-8 strings, so that would fail. Use LATIN1,
# which accepts any byte and has a conversion from each byte to UTF-8.
$ENV{LC_ALL} = 'C'; $ENV{LC_ALL} = 'C';
$ENV{PGCLIENTENCODING} = 'LATIN1'; $ENV{PGCLIENTENCODING} = 'LATIN1';