PR/57205: Dag-Erling Smørgrav: Add tests strchrnul(3), fix strchr pasto
from strlen.
This commit is contained in:
parent
b0a3116ca9
commit
e20f737644
|
@ -1,4 +1,4 @@
|
|||
# $NetBSD: Makefile,v 1.12 2019/12/19 19:19:28 macallan Exp $
|
||||
# $NetBSD: Makefile,v 1.13 2023/01/30 19:49:49 christos Exp $
|
||||
|
||||
.include <bsd.own.mk>
|
||||
|
||||
|
@ -15,6 +15,7 @@ TESTS_C+= t_memset
|
|||
TESTS_C+= t_popcount
|
||||
TESTS_C+= t_strcat
|
||||
TESTS_C+= t_strchr
|
||||
TESTS_C+= t_strchrnul
|
||||
TESTS_C+= t_strcmp
|
||||
TESTS_C+= t_strcoll
|
||||
TESTS_C+= t_strcpy
|
||||
|
|
|
@ -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 <jtc@acorntoolworks.com>
|
||||
|
@ -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;
|
||||
|
|
|
@ -0,0 +1,293 @@
|
|||
/* $NetBSD: t_strchrnul.c,v 1.1 2023/01/30 19:49:49 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Written by J.T. Conklin <jtc@acorntoolworks.com>
|
||||
* 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();
|
||||
}
|
Loading…
Reference in New Issue