From 2f68032eec77a9c96d58ad141082239978ef8c7d Mon Sep 17 00:00:00 2001 From: Daniel Lehman Date: Wed, 4 Jan 2012 13:58:23 -0800 Subject: msvcrt: make WEOF returned from swscanf signed Windows msvcrt.dll returns 0 but should return -1, according to both Unix man pages and MSDN. Later VS CRT versions (at least msvcr90) do return -1. So do Linux/gcc, AIX/xlC, Solaris/sunstudio. Also, sscanf in Windows msvcrt.dll return -1. So, specifically swscanf in Windows msvcrt.dll returning 0 is broken As-is, Wine returns 65535 because WEOF is an unsigned short 0xFFFF (and should be). But when returned from scanf functions it should be signed-extended; swscanf returns a signed int --- dlls/msvcr90/tests/msvcr90.c | 13 +++++++++++++ dlls/msvcrt/scanf.h | 2 +- dlls/msvcrt/tests/scanf.c | 17 +++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletions(-) diff --git a/dlls/msvcr90/tests/msvcr90.c b/dlls/msvcr90/tests/msvcr90.c index 09b4a40..e4890ac 100644 --- a/dlls/msvcr90/tests/msvcr90.c +++ b/dlls/msvcr90/tests/msvcr90.c @@ -1137,6 +1137,18 @@ static void test_nonblocking_file_access(void) p_unlink("test_file"); } +static void test_swscanf( void ) +{ + wchar_t buffer[100]; + int result, ret; + static const WCHAR formatd[] = {'%','d',0}; + + /* check WEOF */ + buffer[0] = 0; + ret = swscanf(buffer, formatd, &result); + ok( ret == (short)WEOF, "swscanf returns %x instead of %x\n", ret, WEOF ); +} + START_TEST(msvcr90) { if(!init()) @@ -1159,4 +1171,5 @@ START_TEST(msvcr90) test_getptd(); test__vswprintf_l(); test_nonblocking_file_access(); + test_swscanf(); } diff --git a/dlls/msvcrt/scanf.h b/dlls/msvcrt/scanf.h index d1ac548..9f6911e 100644 --- a/dlls/msvcrt/scanf.h +++ b/dlls/msvcrt/scanf.h @@ -26,7 +26,7 @@ #ifdef WIDE_SCANF #define _CHAR_ MSVCRT_wchar_t #define _EOF_ MSVCRT_WEOF -#define _EOF_RET MSVCRT_WEOF +#define _EOF_RET (short)MSVCRT_WEOF #define _ISSPACE_(c) MSVCRT_iswspace(c) #define _ISDIGIT_(c) MSVCRT_iswdigit(c) #define _WIDE2SUPPORTED_(c) c /* No conversion needed (wide to wide) */ diff --git a/dlls/msvcrt/tests/scanf.c b/dlls/msvcrt/tests/scanf.c index cbfb184..8b13bdc 100644 --- a/dlls/msvcrt/tests/scanf.c +++ b/dlls/msvcrt/tests/scanf.c @@ -243,8 +243,25 @@ static void test_sscanf_s(void) ok(i==123, "i = %d\n", i); } +static void test_swscanf( void ) +{ + wchar_t buffer[100]; + int result, ret; + static const WCHAR formatd[] = {'%','d',0}; + + /* check WEOF */ + /* WEOF is an unsigned short -1 but swscanf returns int + so it should be sign-extended */ + buffer[0] = 0; + ret = swscanf(buffer, formatd, &result); + /* msvcrt returns 0 but should return -1 (later versions do) */ + ok( ret == (short)WEOF || broken(ret == 0), + "swscanf returns %x instead of %x\n", ret, WEOF ); +} + START_TEST(scanf) { test_sscanf(); test_sscanf_s(); + test_swscanf(); } -- 1.6.0.4