The branch stable/13 has been updated by des:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=de00ef64eeb6940d5510c5f5e1ec80f8ef46e39e

commit de00ef64eeb6940d5510c5f5e1ec80f8ef46e39e
Author:     Dag-Erling Smørgrav <[email protected]>
AuthorDate: 2023-02-01 20:06:20 +0000
Commit:     Dag-Erling Smørgrav <[email protected]>
CommitDate: 2023-02-09 20:32:56 +0000

    libc: Add tests for strchrnul(3).
    
    MFC after:      1 week
    Sponsored by:   Klara, Inc.
    Reviewed by:    allanjude
    Differential Revision:  https://reviews.freebsd.org/D38286
    
    (cherry picked from commit 606d0e4a9a862a7b4e3469a084834ca0e888afa4)
---
 contrib/netbsd-tests/lib/libc/string/t_strchr.c    |  12 +-
 contrib/netbsd-tests/lib/libc/string/t_strchrnul.c | 293 +++++++++++++++++++++
 lib/libc/tests/string/Makefile                     |   1 +
 3 files changed, 300 insertions(+), 6 deletions(-)

diff --git a/contrib/netbsd-tests/lib/libc/string/t_strchr.c 
b/contrib/netbsd-tests/lib/libc/string/t_strchr.c
index 5dd9a62213ab..4bc304e71267 100644
--- a/contrib/netbsd-tests/lib/libc/string/t_strchr.c
+++ b/contrib/netbsd-tests/lib/libc/string/t_strchr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_strchr.c,v 1.2 2017/01/10 15:34:49 christos Exp $ */
+/* $NetBSD: t_strchr.c,v 1.3 2023/01/30 19:49:49 christos Exp $ */
 
 /*
  * Written by J.T. Conklin <[email protected]>
@@ -247,7 +247,7 @@ ATF_TC_BODY(strchr_basic, tc)
        };
 
        dl_handle = dlopen(NULL, RTLD_LAZY);
-       strchr_fn = dlsym(dl_handle, "test_strlen");
+       strchr_fn = dlsym(dl_handle, "test_strchr");
        if (!strchr_fn)
                strchr_fn = strchr;
 
@@ -269,11 +269,11 @@ ATF_TC_BODY(strchr_basic, tc)
                        /* Then for the '/' in the strings */
                        verify_strchr(buf + a, '/', t, a);
 
-                       /* check zero extension of char arg */
-                       verify_strchr(buf + a, 0xffffff00 | '/', t, a);
+                       /* check zero extension of char arg */
+                       verify_strchr(buf + a, 0xffffff00 | '/', t, a);
 
-                       /* Replace all the '/' with 0xff */
-                       while ((off = slow_strchr(buf + a, '/')) != NULL)
+                       /* Replace all the '/' with 0xff */
+                       while ((off = slow_strchr(buf + a, '/')) != NULL)
                                *off = 0xff;
 
                        buf[a + len] = 0xff;
diff --git a/contrib/netbsd-tests/lib/libc/string/t_strchrnul.c 
b/contrib/netbsd-tests/lib/libc/string/t_strchrnul.c
new file mode 100644
index 000000000000..62ac702523aa
--- /dev/null
+++ b/contrib/netbsd-tests/lib/libc/string/t_strchrnul.c
@@ -0,0 +1,293 @@
+/* $NetBSD: t_strchrnul.c,v 1.1 2023/01/30 19:49:49 christos Exp $ */
+
+/*
+ * Written by J.T. Conklin <[email protected]>
+ * Public domain.
+ */
+
+#include <atf-c.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <dlfcn.h>
+
+static char    *slow_strchrnul(char *, int);
+static void     verify_strchrnul(char *, int, unsigned int, unsigned int);
+
+char * (*volatile strchrnul_fn)(const char *, int);
+
+static char *
+slow_strchrnul(char *buf, int ch)
+{
+       unsigned char c = 1;
+
+       ch &= 0xff;
+
+       for (; ; buf++) {
+               c = *buf;
+               if (c == ch || c == 0)
+                       return buf;
+       }
+}
+
+static void
+verify_strchrnul(char *buf, int ch, unsigned int t, unsigned int a)
+{
+       const char *off, *ok_off;
+
+       off = strchrnul_fn(buf, ch);
+       ok_off = slow_strchrnul(buf, ch);
+       if (off == ok_off)
+               return;
+
+       fprintf(stderr, "test_strchrnul(\"%s\", %#x) gave %zd not %zd (test %d, 
"
+           "alignment %d)\n",
+           buf, ch, off ? off - buf : -1, ok_off ? ok_off - buf : -1, t, a);
+
+       atf_tc_fail("Check stderr for details");
+}
+
+ATF_TC(strchrnul_basic);
+ATF_TC_HEAD(strchrnul_basic, tc)
+{
+
+        atf_tc_set_md_var(tc, "descr", "Test strchrnul(3) results");
+}
+
+ATF_TC_BODY(strchrnul_basic, tc)
+{
+       void *dl_handle;
+       char *off;
+       char buf[32];
+       unsigned int t, a;
+
+       const char *tab[] = {
+               "",
+               "a",
+               "aa",
+               "abc",
+               "abcd",
+               "abcde",
+               "abcdef",
+               "abcdefg",
+               "abcdefgh",
+
+               "/",
+               "//",
+               "/a",
+               "/a/",
+               "/ab",
+               "/ab/",
+               "/abc",
+               "/abc/",
+               "/abcd",
+               "/abcd/",
+               "/abcde",
+               "/abcde/",
+               "/abcdef",
+               "/abcdef/",
+               "/abcdefg",
+               "/abcdefg/",
+               "/abcdefgh",
+               "/abcdefgh/",
+
+               "a/",
+               "a//",
+               "a/a",
+               "a/a/",
+               "a/ab",
+               "a/ab/",
+               "a/abc",
+               "a/abc/",
+               "a/abcd",
+               "a/abcd/",
+               "a/abcde",
+               "a/abcde/",
+               "a/abcdef",
+               "a/abcdef/",
+               "a/abcdefg",
+               "a/abcdefg/",
+               "a/abcdefgh",
+               "a/abcdefgh/",
+
+               "ab/",
+               "ab//",
+               "ab/a",
+               "ab/a/",
+               "ab/ab",
+               "ab/ab/",
+               "ab/abc",
+               "ab/abc/",
+               "ab/abcd",
+               "ab/abcd/",
+               "ab/abcde",
+               "ab/abcde/",
+               "ab/abcdef",
+               "ab/abcdef/",
+               "ab/abcdefg",
+               "ab/abcdefg/",
+               "ab/abcdefgh",
+               "ab/abcdefgh/",
+
+               "abc/",
+               "abc//",
+               "abc/a",
+               "abc/a/",
+               "abc/ab",
+               "abc/ab/",
+               "abc/abc",
+               "abc/abc/",
+               "abc/abcd",
+               "abc/abcd/",
+               "abc/abcde",
+               "abc/abcde/",
+               "abc/abcdef",
+               "abc/abcdef/",
+               "abc/abcdefg",
+               "abc/abcdefg/",
+               "abc/abcdefgh",
+               "abc/abcdefgh/",
+
+               "abcd/",
+               "abcd//",
+               "abcd/a",
+               "abcd/a/",
+               "abcd/ab",
+               "abcd/ab/",
+               "abcd/abc",
+               "abcd/abc/",
+               "abcd/abcd",
+               "abcd/abcd/",
+               "abcd/abcde",
+               "abcd/abcde/",
+               "abcd/abcdef",
+               "abcd/abcdef/",
+               "abcd/abcdefg",
+               "abcd/abcdefg/",
+               "abcd/abcdefgh",
+               "abcd/abcdefgh/",
+
+               "abcde/",
+               "abcde//",
+               "abcde/a",
+               "abcde/a/",
+               "abcde/ab",
+               "abcde/ab/",
+               "abcde/abc",
+               "abcde/abc/",
+               "abcde/abcd",
+               "abcde/abcd/",
+               "abcde/abcde",
+               "abcde/abcde/",
+               "abcde/abcdef",
+               "abcde/abcdef/",
+               "abcde/abcdefg",
+               "abcde/abcdefg/",
+               "abcde/abcdefgh",
+               "abcde/abcdefgh/",
+
+               "abcdef/",
+               "abcdef//",
+               "abcdef/a",
+               "abcdef/a/",
+               "abcdef/ab",
+               "abcdef/ab/",
+               "abcdef/abc",
+               "abcdef/abc/",
+               "abcdef/abcd",
+               "abcdef/abcd/",
+               "abcdef/abcde",
+               "abcdef/abcde/",
+               "abcdef/abcdef",
+               "abcdef/abcdef/",
+               "abcdef/abcdefg",
+               "abcdef/abcdefg/",
+               "abcdef/abcdefgh",
+               "abcdef/abcdefgh/",
+
+               "abcdefg/",
+               "abcdefg//",
+               "abcdefg/a",
+               "abcdefg/a/",
+               "abcdefg/ab",
+               "abcdefg/ab/",
+               "abcdefg/abc",
+               "abcdefg/abc/",
+               "abcdefg/abcd",
+               "abcdefg/abcd/",
+               "abcdefg/abcde",
+               "abcdefg/abcde/",
+               "abcdefg/abcdef",
+               "abcdefg/abcdef/",
+               "abcdefg/abcdefg",
+               "abcdefg/abcdefg/",
+               "abcdefg/abcdefgh",
+               "abcdefg/abcdefgh/",
+
+               "abcdefgh/",
+               "abcdefgh//",
+               "abcdefgh/a",
+               "abcdefgh/a/",
+               "abcdefgh/ab",
+               "abcdefgh/ab/",
+               "abcdefgh/abc",
+               "abcdefgh/abc/",
+               "abcdefgh/abcd",
+               "abcdefgh/abcd/",
+               "abcdefgh/abcde",
+               "abcdefgh/abcde/",
+               "abcdefgh/abcdef",
+               "abcdefgh/abcdef/",
+               "abcdefgh/abcdefg",
+               "abcdefgh/abcdefg/",
+               "abcdefgh/abcdefgh",
+               "abcdefgh/abcdefgh/",
+       };
+
+       dl_handle = dlopen(NULL, RTLD_LAZY);
+       strchrnul_fn = dlsym(dl_handle, "test_strchrnul");
+       if (!strchrnul_fn)
+               strchrnul_fn = strchrnul;
+
+       for (a = 3; a < 3 + sizeof(long); ++a) {
+               /* Put char and a \0 before the buffer */
+               buf[a-1] = '/';
+               buf[a-2] = '0';
+               buf[a-3] = 0xff;
+               for (t = 0; t < (sizeof(tab) / sizeof(tab[0])); ++t) {
+                       int len = strlen(tab[t]) + 1;
+                       memcpy(&buf[a], tab[t], len);
+
+                       /* Put the char we are looking for after the \0 */
+                       buf[a + len] = '/';
+
+                       /* Check search for NUL at end of string */
+                       verify_strchrnul(buf + a, 0, t, a);
+
+                       /* Then for the '/' in the strings */
+                       verify_strchrnul(buf + a, '/', t, a);
+
+                       /* check zero extension of char arg */
+                       verify_strchrnul(buf + a, 0xffffff00 | '/', t, a);
+
+                       /* Replace all the '/' with 0xff */
+                       while (*(off = slow_strchrnul(buf + a, '/')) != '\0')
+                               *off = 0xff;
+
+                       buf[a + len] = 0xff;
+
+                       /* Check we can search for 0xff as well as '/' */
+                       verify_strchrnul(buf + a, 0xff, t, a);
+               }
+       }
+       (void)dlclose(dl_handle);
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+
+       ATF_TP_ADD_TC(tp, strchrnul_basic);
+
+       return atf_no_error();
+}
diff --git a/lib/libc/tests/string/Makefile b/lib/libc/tests/string/Makefile
index eacf7e15c27c..5d1944113a1a 100644
--- a/lib/libc/tests/string/Makefile
+++ b/lib/libc/tests/string/Makefile
@@ -18,6 +18,7 @@ NETBSD_ATF_TESTS_C+=  memmem_test
 NETBSD_ATF_TESTS_C+=   memset_test
 NETBSD_ATF_TESTS_C+=   strcat_test
 NETBSD_ATF_TESTS_C+=   strchr_test
+NETBSD_ATF_TESTS_C+=   strchrnul_test
 NETBSD_ATF_TESTS_C+=   strcmp_test
 NETBSD_ATF_TESTS_C+=   strcpy_test
 NETBSD_ATF_TESTS_C+=   strcspn_test

Reply via email to