1 1.3 christos /* $NetBSD: t_strchr.c,v 1.3 2023/01/30 19:49:49 christos Exp $ */ 2 1.1 jruoho 3 1.1 jruoho /* 4 1.1 jruoho * Written by J.T. Conklin <jtc (at) acorntoolworks.com> 5 1.1 jruoho * Public domain. 6 1.1 jruoho */ 7 1.1 jruoho 8 1.1 jruoho #include <atf-c.h> 9 1.1 jruoho #include <string.h> 10 1.1 jruoho #include <unistd.h> 11 1.1 jruoho #include <stdio.h> 12 1.1 jruoho #include <stdlib.h> 13 1.1 jruoho #include <dlfcn.h> 14 1.1 jruoho 15 1.1 jruoho static char *slow_strchr(char *, int); 16 1.1 jruoho static void verify_strchr(char *, int, unsigned int, unsigned int); 17 1.1 jruoho 18 1.1 jruoho char * (*volatile strchr_fn)(const char *, int); 19 1.1 jruoho 20 1.1 jruoho static char * 21 1.1 jruoho slow_strchr(char *buf, int ch) 22 1.1 jruoho { 23 1.1 jruoho unsigned char c = 1; 24 1.1 jruoho 25 1.1 jruoho ch &= 0xff; 26 1.1 jruoho 27 1.1 jruoho for (; c != 0; buf++) { 28 1.1 jruoho c = *buf; 29 1.1 jruoho if (c == ch) 30 1.1 jruoho return buf; 31 1.1 jruoho } 32 1.1 jruoho return 0; 33 1.1 jruoho } 34 1.1 jruoho 35 1.1 jruoho static void 36 1.1 jruoho verify_strchr(char *buf, int ch, unsigned int t, unsigned int a) 37 1.1 jruoho { 38 1.1 jruoho const char *off, *ok_off; 39 1.1 jruoho 40 1.1 jruoho off = strchr_fn(buf, ch); 41 1.1 jruoho ok_off = slow_strchr(buf, ch); 42 1.1 jruoho if (off == ok_off) 43 1.1 jruoho return; 44 1.1 jruoho 45 1.1 jruoho fprintf(stderr, "test_strchr(\"%s\", %#x) gave %zd not %zd (test %d, " 46 1.1 jruoho "alignment %d)\n", 47 1.1 jruoho buf, ch, off ? off - buf : -1, ok_off ? ok_off - buf : -1, t, a); 48 1.1 jruoho 49 1.1 jruoho atf_tc_fail("Check stderr for details"); 50 1.1 jruoho } 51 1.1 jruoho 52 1.1 jruoho ATF_TC(strchr_basic); 53 1.1 jruoho ATF_TC_HEAD(strchr_basic, tc) 54 1.1 jruoho { 55 1.1 jruoho 56 1.1 jruoho atf_tc_set_md_var(tc, "descr", "Test strchr(3) results"); 57 1.1 jruoho } 58 1.1 jruoho 59 1.1 jruoho ATF_TC_BODY(strchr_basic, tc) 60 1.1 jruoho { 61 1.2 christos void *dl_handle; 62 1.1 jruoho char *off; 63 1.1 jruoho char buf[32]; 64 1.2 christos unsigned int t, a; 65 1.1 jruoho 66 1.1 jruoho const char *tab[] = { 67 1.1 jruoho "", 68 1.1 jruoho "a", 69 1.1 jruoho "aa", 70 1.1 jruoho "abc", 71 1.1 jruoho "abcd", 72 1.1 jruoho "abcde", 73 1.1 jruoho "abcdef", 74 1.1 jruoho "abcdefg", 75 1.1 jruoho "abcdefgh", 76 1.1 jruoho 77 1.1 jruoho "/", 78 1.1 jruoho "//", 79 1.1 jruoho "/a", 80 1.1 jruoho "/a/", 81 1.1 jruoho "/ab", 82 1.1 jruoho "/ab/", 83 1.1 jruoho "/abc", 84 1.1 jruoho "/abc/", 85 1.1 jruoho "/abcd", 86 1.1 jruoho "/abcd/", 87 1.1 jruoho "/abcde", 88 1.1 jruoho "/abcde/", 89 1.1 jruoho "/abcdef", 90 1.1 jruoho "/abcdef/", 91 1.1 jruoho "/abcdefg", 92 1.1 jruoho "/abcdefg/", 93 1.1 jruoho "/abcdefgh", 94 1.1 jruoho "/abcdefgh/", 95 1.1 jruoho 96 1.1 jruoho "a/", 97 1.1 jruoho "a//", 98 1.1 jruoho "a/a", 99 1.1 jruoho "a/a/", 100 1.1 jruoho "a/ab", 101 1.1 jruoho "a/ab/", 102 1.1 jruoho "a/abc", 103 1.1 jruoho "a/abc/", 104 1.1 jruoho "a/abcd", 105 1.1 jruoho "a/abcd/", 106 1.1 jruoho "a/abcde", 107 1.1 jruoho "a/abcde/", 108 1.1 jruoho "a/abcdef", 109 1.1 jruoho "a/abcdef/", 110 1.1 jruoho "a/abcdefg", 111 1.1 jruoho "a/abcdefg/", 112 1.1 jruoho "a/abcdefgh", 113 1.1 jruoho "a/abcdefgh/", 114 1.1 jruoho 115 1.1 jruoho "ab/", 116 1.1 jruoho "ab//", 117 1.1 jruoho "ab/a", 118 1.1 jruoho "ab/a/", 119 1.1 jruoho "ab/ab", 120 1.1 jruoho "ab/ab/", 121 1.1 jruoho "ab/abc", 122 1.1 jruoho "ab/abc/", 123 1.1 jruoho "ab/abcd", 124 1.1 jruoho "ab/abcd/", 125 1.1 jruoho "ab/abcde", 126 1.1 jruoho "ab/abcde/", 127 1.1 jruoho "ab/abcdef", 128 1.1 jruoho "ab/abcdef/", 129 1.1 jruoho "ab/abcdefg", 130 1.1 jruoho "ab/abcdefg/", 131 1.1 jruoho "ab/abcdefgh", 132 1.1 jruoho "ab/abcdefgh/", 133 1.1 jruoho 134 1.1 jruoho "abc/", 135 1.1 jruoho "abc//", 136 1.1 jruoho "abc/a", 137 1.1 jruoho "abc/a/", 138 1.1 jruoho "abc/ab", 139 1.1 jruoho "abc/ab/", 140 1.1 jruoho "abc/abc", 141 1.1 jruoho "abc/abc/", 142 1.1 jruoho "abc/abcd", 143 1.1 jruoho "abc/abcd/", 144 1.1 jruoho "abc/abcde", 145 1.1 jruoho "abc/abcde/", 146 1.1 jruoho "abc/abcdef", 147 1.1 jruoho "abc/abcdef/", 148 1.1 jruoho "abc/abcdefg", 149 1.1 jruoho "abc/abcdefg/", 150 1.1 jruoho "abc/abcdefgh", 151 1.1 jruoho "abc/abcdefgh/", 152 1.1 jruoho 153 1.1 jruoho "abcd/", 154 1.1 jruoho "abcd//", 155 1.1 jruoho "abcd/a", 156 1.1 jruoho "abcd/a/", 157 1.1 jruoho "abcd/ab", 158 1.1 jruoho "abcd/ab/", 159 1.1 jruoho "abcd/abc", 160 1.1 jruoho "abcd/abc/", 161 1.1 jruoho "abcd/abcd", 162 1.1 jruoho "abcd/abcd/", 163 1.1 jruoho "abcd/abcde", 164 1.1 jruoho "abcd/abcde/", 165 1.1 jruoho "abcd/abcdef", 166 1.1 jruoho "abcd/abcdef/", 167 1.1 jruoho "abcd/abcdefg", 168 1.1 jruoho "abcd/abcdefg/", 169 1.1 jruoho "abcd/abcdefgh", 170 1.1 jruoho "abcd/abcdefgh/", 171 1.1 jruoho 172 1.1 jruoho "abcde/", 173 1.1 jruoho "abcde//", 174 1.1 jruoho "abcde/a", 175 1.1 jruoho "abcde/a/", 176 1.1 jruoho "abcde/ab", 177 1.1 jruoho "abcde/ab/", 178 1.1 jruoho "abcde/abc", 179 1.1 jruoho "abcde/abc/", 180 1.1 jruoho "abcde/abcd", 181 1.1 jruoho "abcde/abcd/", 182 1.1 jruoho "abcde/abcde", 183 1.1 jruoho "abcde/abcde/", 184 1.1 jruoho "abcde/abcdef", 185 1.1 jruoho "abcde/abcdef/", 186 1.1 jruoho "abcde/abcdefg", 187 1.1 jruoho "abcde/abcdefg/", 188 1.1 jruoho "abcde/abcdefgh", 189 1.1 jruoho "abcde/abcdefgh/", 190 1.1 jruoho 191 1.1 jruoho "abcdef/", 192 1.1 jruoho "abcdef//", 193 1.1 jruoho "abcdef/a", 194 1.1 jruoho "abcdef/a/", 195 1.1 jruoho "abcdef/ab", 196 1.1 jruoho "abcdef/ab/", 197 1.1 jruoho "abcdef/abc", 198 1.1 jruoho "abcdef/abc/", 199 1.1 jruoho "abcdef/abcd", 200 1.1 jruoho "abcdef/abcd/", 201 1.1 jruoho "abcdef/abcde", 202 1.1 jruoho "abcdef/abcde/", 203 1.1 jruoho "abcdef/abcdef", 204 1.1 jruoho "abcdef/abcdef/", 205 1.1 jruoho "abcdef/abcdefg", 206 1.1 jruoho "abcdef/abcdefg/", 207 1.1 jruoho "abcdef/abcdefgh", 208 1.1 jruoho "abcdef/abcdefgh/", 209 1.1 jruoho 210 1.1 jruoho "abcdefg/", 211 1.1 jruoho "abcdefg//", 212 1.1 jruoho "abcdefg/a", 213 1.1 jruoho "abcdefg/a/", 214 1.1 jruoho "abcdefg/ab", 215 1.1 jruoho "abcdefg/ab/", 216 1.1 jruoho "abcdefg/abc", 217 1.1 jruoho "abcdefg/abc/", 218 1.1 jruoho "abcdefg/abcd", 219 1.1 jruoho "abcdefg/abcd/", 220 1.1 jruoho "abcdefg/abcde", 221 1.1 jruoho "abcdefg/abcde/", 222 1.1 jruoho "abcdefg/abcdef", 223 1.1 jruoho "abcdefg/abcdef/", 224 1.1 jruoho "abcdefg/abcdefg", 225 1.1 jruoho "abcdefg/abcdefg/", 226 1.1 jruoho "abcdefg/abcdefgh", 227 1.1 jruoho "abcdefg/abcdefgh/", 228 1.1 jruoho 229 1.1 jruoho "abcdefgh/", 230 1.1 jruoho "abcdefgh//", 231 1.1 jruoho "abcdefgh/a", 232 1.1 jruoho "abcdefgh/a/", 233 1.1 jruoho "abcdefgh/ab", 234 1.1 jruoho "abcdefgh/ab/", 235 1.1 jruoho "abcdefgh/abc", 236 1.1 jruoho "abcdefgh/abc/", 237 1.1 jruoho "abcdefgh/abcd", 238 1.1 jruoho "abcdefgh/abcd/", 239 1.1 jruoho "abcdefgh/abcde", 240 1.1 jruoho "abcdefgh/abcde/", 241 1.1 jruoho "abcdefgh/abcdef", 242 1.1 jruoho "abcdefgh/abcdef/", 243 1.1 jruoho "abcdefgh/abcdefg", 244 1.1 jruoho "abcdefgh/abcdefg/", 245 1.1 jruoho "abcdefgh/abcdefgh", 246 1.1 jruoho "abcdefgh/abcdefgh/", 247 1.1 jruoho }; 248 1.1 jruoho 249 1.2 christos dl_handle = dlopen(NULL, RTLD_LAZY); 250 1.3 christos strchr_fn = dlsym(dl_handle, "test_strchr"); 251 1.1 jruoho if (!strchr_fn) 252 1.1 jruoho strchr_fn = strchr; 253 1.1 jruoho 254 1.1 jruoho for (a = 3; a < 3 + sizeof(long); ++a) { 255 1.1 jruoho /* Put char and a \0 before the buffer */ 256 1.1 jruoho buf[a-1] = '/'; 257 1.1 jruoho buf[a-2] = '0'; 258 1.1 jruoho buf[a-3] = 0xff; 259 1.1 jruoho for (t = 0; t < (sizeof(tab) / sizeof(tab[0])); ++t) { 260 1.1 jruoho int len = strlen(tab[t]) + 1; 261 1.1 jruoho memcpy(&buf[a], tab[t], len); 262 1.1 jruoho 263 1.1 jruoho /* Put the char we are looking for after the \0 */ 264 1.1 jruoho buf[a + len] = '/'; 265 1.1 jruoho 266 1.1 jruoho /* Check search for NUL at end of string */ 267 1.1 jruoho verify_strchr(buf + a, 0, t, a); 268 1.1 jruoho 269 1.1 jruoho /* Then for the '/' in the strings */ 270 1.1 jruoho verify_strchr(buf + a, '/', t, a); 271 1.1 jruoho 272 1.3 christos /* check zero extension of char arg */ 273 1.3 christos verify_strchr(buf + a, 0xffffff00 | '/', t, a); 274 1.1 jruoho 275 1.3 christos /* Replace all the '/' with 0xff */ 276 1.3 christos while ((off = slow_strchr(buf + a, '/')) != NULL) 277 1.1 jruoho *off = 0xff; 278 1.1 jruoho 279 1.1 jruoho buf[a + len] = 0xff; 280 1.1 jruoho 281 1.1 jruoho /* Check we can search for 0xff as well as '/' */ 282 1.1 jruoho verify_strchr(buf + a, 0xff, t, a); 283 1.1 jruoho } 284 1.1 jruoho } 285 1.2 christos (void)dlclose(dl_handle); 286 1.1 jruoho } 287 1.1 jruoho 288 1.1 jruoho ATF_TP_ADD_TCS(tp) 289 1.1 jruoho { 290 1.1 jruoho 291 1.1 jruoho ATF_TP_ADD_TC(tp, strchr_basic); 292 1.1 jruoho 293 1.1 jruoho return atf_no_error(); 294 1.1 jruoho } 295