[PATCH] msvcrt: Fix space-only inputs in wcstoi64.
Lauri Kenttä
lauri.kentta at gmail.com
Wed Dec 14 11:45:58 CST 2016
wcstoi64 sets endpos past the beginning only if some digits are found.
Signed-off-by: Lauri Kenttä <lauri.kentta at gmail.com>
---
dlls/msvcrt/tests/string.c | 5 +++++
dlls/msvcrt/wcs.c | 16 ++++++++++++----
2 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index 8e78695..6a3f604 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -2827,6 +2827,7 @@ static void test__stricmp(void)
static void test__wcstoi64(void)
{
static const WCHAR digit[] = { '9', 0 };
+ static const WCHAR space[] = { ' ', 0 };
static const WCHAR stock[] = { 0x3231, 0 }; /* PARENTHESIZED IDEOGRAPH STOCK */
static const WCHAR tamil[] = { 0x0bef, 0 }; /* TAMIL DIGIT NINE */
static const WCHAR thai[] = { 0x0e59, 0 }; /* THAI DIGIT NINE */
@@ -2844,6 +2845,8 @@ static void test__wcstoi64(void)
res = p_wcstoi64(digit, NULL, 10);
ok(res == 9, "res != 9\n");
+ res = p_wcstoi64(space, &endpos, 0);
+ ok(endpos == space, "endpos != space\n");
res = p_wcstoi64(stock, &endpos, 10);
ok(res == 0, "res != 0\n");
ok(endpos == stock, "Incorrect endpos (%p-%p)\n", stock, endpos);
@@ -2859,6 +2862,8 @@ static void test__wcstoi64(void)
ures = p_wcstoui64(digit, NULL, 10);
ok(ures == 9, "ures != 9\n");
+ ures = p_wcstoui64(space, &endpos, 0);
+ ok(endpos == space, "endpos != space\n");
ures = p_wcstoui64(stock, &endpos, 10);
ok(ures == 0, "ures != 0\n");
ok(endpos == stock, "Incorrect endpos (%p-%p)\n", stock, endpos);
diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c
index c497a10..4fbf5a2 100644
--- a/dlls/msvcrt/wcs.c
+++ b/dlls/msvcrt/wcs.c
@@ -2023,7 +2023,7 @@ INT CDECL MSVCRT_wcsncat_s(MSVCRT_wchar_t *dst, MSVCRT_size_t elem,
__int64 CDECL MSVCRT__wcstoi64_l(const MSVCRT_wchar_t *nptr,
MSVCRT_wchar_t **endptr, int base, MSVCRT__locale_t locale)
{
- BOOL negative = FALSE;
+ BOOL negative = FALSE, empty = TRUE;
__int64 ret = 0;
TRACE("(%s %p %d %p)\n", debugstr_w(nptr), endptr, base, locale);
@@ -2032,6 +2032,9 @@ __int64 CDECL MSVCRT__wcstoi64_l(const MSVCRT_wchar_t *nptr,
if (!MSVCRT_CHECK_PMT(base == 0 || base >= 2)) return 0;
if (!MSVCRT_CHECK_PMT(base <= 36)) return 0;
+ if(endptr)
+ *endptr = (MSVCRT_wchar_t*)nptr;
+
while(isspaceW(*nptr)) nptr++;
if(*nptr == '-') {
@@ -2070,6 +2073,7 @@ __int64 CDECL MSVCRT__wcstoi64_l(const MSVCRT_wchar_t *nptr,
v = -v;
nptr++;
+ empty = FALSE;
if(!negative && (ret>MSVCRT_I64_MAX/base || ret*base>MSVCRT_I64_MAX-v)) {
ret = MSVCRT_I64_MAX;
@@ -2081,7 +2085,7 @@ __int64 CDECL MSVCRT__wcstoi64_l(const MSVCRT_wchar_t *nptr,
ret = ret*base + v;
}
- if(endptr)
+ if(endptr && !empty)
*endptr = (MSVCRT_wchar_t*)nptr;
return ret;
@@ -2188,7 +2192,7 @@ MSVCRT_longlong __cdecl MSVCRT__wtoll(const MSVCRT_wchar_t *str)
unsigned __int64 CDECL MSVCRT__wcstoui64_l(const MSVCRT_wchar_t *nptr,
MSVCRT_wchar_t **endptr, int base, MSVCRT__locale_t locale)
{
- BOOL negative = FALSE;
+ BOOL negative = FALSE, empty = TRUE;
unsigned __int64 ret = 0;
TRACE("(%s %p %d %p)\n", debugstr_w(nptr), endptr, base, locale);
@@ -2197,6 +2201,9 @@ unsigned __int64 CDECL MSVCRT__wcstoui64_l(const MSVCRT_wchar_t *nptr,
if (!MSVCRT_CHECK_PMT(base == 0 || base >= 2)) return 0;
if (!MSVCRT_CHECK_PMT(base <= 36)) return 0;
+ if(endptr)
+ *endptr = (MSVCRT_wchar_t*)nptr;
+
while(isspaceW(*nptr)) nptr++;
if(*nptr == '-') {
@@ -2232,6 +2239,7 @@ unsigned __int64 CDECL MSVCRT__wcstoui64_l(const MSVCRT_wchar_t *nptr,
}
nptr++;
+ empty = FALSE;
if(ret>MSVCRT_UI64_MAX/base || ret*base>MSVCRT_UI64_MAX-v) {
ret = MSVCRT_UI64_MAX;
@@ -2240,7 +2248,7 @@ unsigned __int64 CDECL MSVCRT__wcstoui64_l(const MSVCRT_wchar_t *nptr,
ret = ret*base + v;
}
- if(endptr)
+ if(endptr && !empty)
*endptr = (MSVCRT_wchar_t*)nptr;
return negative ? -ret : ret;
--
2.10.2
More information about the wine-patches
mailing list