Piotr Caban : ntdll: Fix memchr implementation.

Alexandre Julliard julliard at winehq.org
Fri Dec 4 14:36:04 CST 2020


Module: wine
Branch: master
Commit: 7d94c4f0e4e96c97c0beed7aead626026caa2d03
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=7d94c4f0e4e96c97c0beed7aead626026caa2d03

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Dec  4 17:41:50 2020 +0100

ntdll: Fix memchr implementation.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50228
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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();
 }




More information about the wine-cvs mailing list