From a85bc781d380754a576db573959d4c76b5a32e01 Mon Sep 17 00:00:00 2001 From: Akihiro Sagawa Date: Mon, 16 Dec 2019 22:39:41 +0900 Subject: [PATCH] kernelbase: Use translated Unicode default char to check invalid chars. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48288 Signed-off-by: Akihiro Sagawa Signed-off-by: Alexandre Julliard --- dlls/kernel32/tests/codepage.c | 3 +++ dlls/kernelbase/locale.c | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/dlls/kernel32/tests/codepage.c b/dlls/kernel32/tests/codepage.c index dc25c556526..2c081586f2e 100644 --- a/dlls/kernel32/tests/codepage.c +++ b/dlls/kernel32/tests/codepage.c @@ -1005,12 +1005,15 @@ static void test_undefined_byte_char(void) LPCSTR str; BOOL is_error; } testset[] = { + { 37, "\x6f", FALSE }, { 874, "\xdd", TRUE }, { 932, "\xfe", TRUE }, { 932, "\x80", FALSE }, + { 932, "\x81\x45", FALSE }, { 936, "\xff", TRUE }, { 949, "\xff", TRUE }, { 950, "\xff", TRUE }, + { 1252, "?", FALSE }, { 1252, "\x90", FALSE }, { 1253, "\xaa", TRUE }, { 1255, "\xff", TRUE }, diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c index fba15555d20..c250c979688 100644 --- a/dlls/kernelbase/locale.c +++ b/dlls/kernelbase/locale.c @@ -1044,12 +1044,12 @@ static int check_invalid_chars( const CPTABLEINFO *info, const unsigned char *sr { if (srclen == 1) break; /* partial char, error */ if (info->DBCSOffsets[off + src[1]] == info->UniDefaultChar && - ((src[0] << 8) | src[1]) != info->TransDefaultChar) break; + ((src[0] << 8) | src[1]) != info->TransUniDefaultChar) break; src++; srclen--; continue; } - if (info->MultiByteTable[*src] == info->UniDefaultChar && *src != info->TransDefaultChar) + if (info->MultiByteTable[*src] == info->UniDefaultChar && *src != info->TransUniDefaultChar) break; if (is_private_use_area_char( info->MultiByteTable[*src] )) break; } @@ -1058,7 +1058,7 @@ static int check_invalid_chars( const CPTABLEINFO *info, const unsigned char *sr { for ( ; srclen; src++, srclen-- ) { - if (info->MultiByteTable[*src] == info->UniDefaultChar && *src != info->TransDefaultChar) + if (info->MultiByteTable[*src] == info->UniDefaultChar && *src != info->TransUniDefaultChar) break; if (is_private_use_area_char( info->MultiByteTable[*src] )) break; }