mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-03-07 19:47:50 +08:00
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:
parent
85ccb6899c
commit
d02768ddd1
@ -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);
|
||||
|
@ -14,10 +14,8 @@ else
|
||||
plan tests => 14;
|
||||
}
|
||||
|
||||
# In a SQL_ASCII database, pgwin32_message_to_UTF16() needs to
|
||||
# interpret everything as UTF8. We're going to use byte sequences
|
||||
# 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.
|
||||
# We're going to use byte sequences that aren't valid UTF-8 strings. Use
|
||||
# LATIN1, which accepts any byte and has a conversion from each byte to UTF-8.
|
||||
$ENV{LC_ALL} = 'C';
|
||||
$ENV{PGCLIENTENCODING} = 'LATIN1';
|
||||
|
||||
|
@ -7,10 +7,8 @@ use Test::More tests => 3;
|
||||
|
||||
# Tests to check connection string handling in utilities
|
||||
|
||||
# In a SQL_ASCII database, pgwin32_message_to_UTF16() needs to
|
||||
# interpret everything as UTF8. We're going to use byte sequences
|
||||
# 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.
|
||||
# We're going to use byte sequences that aren't valid UTF-8 strings. Use
|
||||
# LATIN1, which accepts any byte and has a conversion from each byte to UTF-8.
|
||||
$ENV{LC_ALL} = 'C';
|
||||
$ENV{PGCLIENTENCODING} = 'LATIN1';
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user