From: Piotr Caban Subject: [PATCH] ntdll: Fix memchr implementation. Message-Id: <39e8640e-25db-43b6-7f49-101909bba832@codeweavers.com> Date: Fri, 4 Dec 2020 17:41:50 +0100 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50228 Signed-off-by: Piotr Caban --- dlls/msvcrt/string.c | 2 +- dlls/ntdll/string.c | 2 +- dlls/ntdll/tests/string.c | 21 +++++++++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/dlls/msvcrt/string.c b/dlls/msvcrt/string.c index 0c4c657ba99..348c36f3ed5 100644 --- a/dlls/msvcrt/string.c +++ b/dlls/msvcrt/string.c @@ -2621,7 +2621,7 @@ void* __cdecl memchr(const void *ptr, int c, size_t n) { const unsigned char *p = ptr; - for (p = ptr; n; n--, p++) if (*p == c) return (void *)(ULONG_PTR)p; + for (p = ptr; n; n--, p++) if (*p == (unsigned char)c) return (void *)(ULONG_PTR)p; return NULL; } diff --git a/dlls/ntdll/string.c b/dlls/ntdll/string.c index 588b5dd5de7..f1cea6caa83 100644 --- a/dlls/ntdll/string.c +++ b/dlls/ntdll/string.c @@ -72,7 +72,7 @@ void * __cdecl memchr( const void *ptr, int c, size_t n ) { const unsigned char *p = ptr; - for (p = ptr; n; n--, p++) if (*p == c) return (void *)(ULONG_PTR)p; + for (p = ptr; n; n--, p++) if (*p == (unsigned char)c) return (void *)(ULONG_PTR)p; return NULL; } diff --git a/dlls/ntdll/tests/string.c b/dlls/ntdll/tests/string.c index b6a40f6709c..6939dd3c15e 100644 --- a/dlls/ntdll/tests/string.c +++ b/dlls/ntdll/tests/string.c @@ -65,6 +65,7 @@ static int (__cdecl *p_wcsnicmp)(LPCWSTR,LPCWSTR,int); static LPWSTR (__cdecl *pwcschr)(LPCWSTR, WCHAR); static LPWSTR (__cdecl *pwcsrchr)(LPCWSTR, WCHAR); +static void* (__cdecl *pmemchr)(const void*, int, size_t); static void (__cdecl *pqsort)(void *,size_t,size_t, int(__cdecl *compar)(const void *, const void *) ); static void* (__cdecl *pbsearch)(void *,void*,size_t,size_t, int(__cdecl *compar)(const void *, const void *) ); @@ -134,6 +135,7 @@ static void InitFunctionPtrs(void) X(_wcsnicmp); X(wcschr); X(wcsrchr); + X(memchr); X(qsort); X(bsearch); X(_snprintf); @@ -2035,6 +2037,24 @@ static void test_ctype(void) } } +static void test_memchr(void) +{ + const char s[] = "ab"; + char *r; + + r = pmemchr(s, 'z', 2); + ok(!r, "memchr returned %p, expected NULL\n", r); + + r = pmemchr(s, 'a', 2); + ok(r == s, "memchr returned %p, expected %p\n", r, s); + + r = pmemchr(s, 0x100 + 'a', 2); + ok(r == s, "memchr returned %p, expected %p\n", r, s); + + r = pmemchr(s, -0x100 + 'a', 2); + ok(r == s, "memchr returned %p, expected %p\n", r, s); +} + START_TEST(string) { InitFunctionPtrs(); @@ -2066,4 +2086,5 @@ START_TEST(string) test_sscanf(); test_wctype(); test_ctype(); + test_memchr(); }