[PATCH 0/1] MR10111: ucrtbase: Fix scanset character range handling in scanf.
From: Piotr Caban <piotr@codeweavers.com> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=59409 --- dlls/msvcrt/scanf.h | 11 +++++++---- dlls/ucrtbase/tests/scanf.c | 8 ++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/dlls/msvcrt/scanf.h b/dlls/msvcrt/scanf.h index 079414e9be3..50a7d81e80b 100644 --- a/dlls/msvcrt/scanf.h +++ b/dlls/msvcrt/scanf.h @@ -25,6 +25,7 @@ #ifdef WIDE_SCANF #define _CHAR_ wchar_t +#define _UCHAR_ wchar_t #define _EOF_ WEOF #define _EOF_RET (short)WEOF #define _ISSPACE_(c) iswspace(c) @@ -34,6 +35,7 @@ #define _BITMAPSIZE_ 256*256 #else /* WIDE_SCANF */ #define _CHAR_ char +#define _UCHAR_ unsigned char #define _EOF_ EOF #define _EOF_RET EOF #define _ISSPACE_(c) isspace(c) @@ -652,13 +654,13 @@ _FUNCTION_ { /* According to msdn: * "Note that %[a-z] and %[z-a] are interpreted as equivalent to %[abcde...z]." */ if(format[1] == '-' && format[2] && format[2] != ']') { - if (format[0] < format[2]) - RtlSetBits(&bitMask, format[0], format[2] - format[0] + 1); + if ((_UCHAR_)format[0] < (_UCHAR_)format[2]) + RtlSetBits(&bitMask, (_UCHAR_)format[0], (_UCHAR_)format[2] - (_UCHAR_)format[0] + 1); else - RtlSetBits(&bitMask, format[2], format[0] - format[2] + 1); + RtlSetBits(&bitMask, (_UCHAR_)format[2], (_UCHAR_)format[0] - (_UCHAR_)format[2] + 1); format += 2; } else - RtlSetBits(&bitMask, *format, 1); + RtlSetBits(&bitMask, (_UCHAR_)*format, 1); format++; } /* read until char is not suitable */ @@ -730,6 +732,7 @@ _FUNCTION_ { } #undef _CHAR_ +#undef _UCHAR_ #undef _EOF_ #undef _EOF_RET #undef _ISSPACE_ diff --git a/dlls/ucrtbase/tests/scanf.c b/dlls/ucrtbase/tests/scanf.c index 48e9c12f6d1..7fdc70b752d 100644 --- a/dlls/ucrtbase/tests/scanf.c +++ b/dlls/ucrtbase/tests/scanf.c @@ -246,6 +246,14 @@ static void test_sscanf(void) ok(!strcmp(buffer, "test"), "got wrong string '%s' for flags %#x\n", buffer, tests[i]); ok(!strcmp(buffer1, "value\xda"), "got wrong string '%s' for flags %#x\n", buffer1, tests[i]); + ret = vsscanf_wrapper(tests[i], "123", -1, "%[\x01-\xff]", buffer); + ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]); + ok(!strcmp(buffer, "123"), "got wrong string '%s' for flags %#x\n", buffer, tests[i]); + + ret = vsscanf_wrapper(tests[i], "\xf0\xf1\xf2", -1, "%[\xff-\xf1\xf0]", buffer); + ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]); + ok(!strcmp(buffer, "\xf0\xf1\xf2"), "got wrong string '%s' for flags %#x\n", buffer, tests[i]); + ret = vsscanf_wrapper(tests[i], "0.1", 3, "%lf%n", &double_res, &count); ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]); ok(double_res == 0.1, "got wrong double %.16e for flags %#x\n", double_res, tests[i]); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10111
participants (2)
-
Piotr Caban -
Piotr Caban (@piotr)