1*7bedae81SStrahinja Stanišić /*-
2*7bedae81SStrahinja Stanišić * SPDX-License-Identifier: BSD-2-Clause
3*7bedae81SStrahinja Stanišić *
4*7bedae81SStrahinja Stanišić * Copyright (c) 2024 Strahinja Stanisic <strajabot@FreeBSD.org>
5*7bedae81SStrahinja Stanišić */
6*7bedae81SStrahinja Stanišić
7*7bedae81SStrahinja Stanišić #include <string.h>
8*7bedae81SStrahinja Stanišić #include <unistd.h>
9*7bedae81SStrahinja Stanišić #include <stdio.h>
10*7bedae81SStrahinja Stanišić #include <stdlib.h>
11*7bedae81SStrahinja Stanišić #include <stdalign.h>
12*7bedae81SStrahinja Stanišić #include <stdint.h>
13*7bedae81SStrahinja Stanišić
14*7bedae81SStrahinja Stanišić #include <atf-c.h>
15*7bedae81SStrahinja Stanišić
16*7bedae81SStrahinja Stanišić ATF_TC(strnlen_alignments);
ATF_TC_HEAD(strnlen_alignments,tc)17*7bedae81SStrahinja Stanišić ATF_TC_HEAD(strnlen_alignments, tc)
18*7bedae81SStrahinja Stanišić {
19*7bedae81SStrahinja Stanišić atf_tc_set_md_var(tc, "descr", "Test strnlen(3) with different alignments");
20*7bedae81SStrahinja Stanišić }
21*7bedae81SStrahinja Stanišić
ATF_TC_BODY(strnlen_alignments,tc)22*7bedae81SStrahinja Stanišić ATF_TC_BODY(strnlen_alignments, tc)
23*7bedae81SStrahinja Stanišić {
24*7bedae81SStrahinja Stanišić size_t (*strnlen_fn)(const char*, size_t) = strnlen;
25*7bedae81SStrahinja Stanišić char alignas(16) buffer[1 + 16 + 64 + 1 + 1];
26*7bedae81SStrahinja Stanišić
27*7bedae81SStrahinja Stanišić memset(buffer, '/', sizeof(buffer));
28*7bedae81SStrahinja Stanišić
29*7bedae81SStrahinja Stanišić for (int align = 1; align < 1 + 16; align++) {
30*7bedae81SStrahinja Stanišić char *s = buffer + align;
31*7bedae81SStrahinja Stanišić
32*7bedae81SStrahinja Stanišić for (size_t maxlen = 0; maxlen <= 64; maxlen++) {
33*7bedae81SStrahinja Stanišić for (size_t len = 0; len <= maxlen; len++) {
34*7bedae81SStrahinja Stanišić /* returns length */
35*7bedae81SStrahinja Stanišić
36*7bedae81SStrahinja Stanišić /* without sentinels */
37*7bedae81SStrahinja Stanišić s[len] = '\0';
38*7bedae81SStrahinja Stanišić size_t val = strnlen_fn(s, maxlen);
39*7bedae81SStrahinja Stanišić if (val != len) {
40*7bedae81SStrahinja Stanišić fprintf(stderr, "align = %d, maxlen = %zu, len = %zu",
41*7bedae81SStrahinja Stanišić align, maxlen, len);
42*7bedae81SStrahinja Stanišić atf_tc_fail("returned incorrect len");
43*7bedae81SStrahinja Stanišić }
44*7bedae81SStrahinja Stanišić
45*7bedae81SStrahinja Stanišić /* with sentinels */
46*7bedae81SStrahinja Stanišić s[-1] = '\0';
47*7bedae81SStrahinja Stanišić s[maxlen + 1] = '\0';
48*7bedae81SStrahinja Stanišić val = strnlen_fn(s, maxlen);
49*7bedae81SStrahinja Stanišić if (val != len) {
50*7bedae81SStrahinja Stanišić fprintf(stderr, "align = %d, maxlen = %zu, len = %zu",
51*7bedae81SStrahinja Stanišić align, maxlen, len);
52*7bedae81SStrahinja Stanišić atf_tc_fail("returned incorrect len (sentinels)");
53*7bedae81SStrahinja Stanišić }
54*7bedae81SStrahinja Stanišić
55*7bedae81SStrahinja Stanišić /* cleanup */
56*7bedae81SStrahinja Stanišić s[-1] = '/';
57*7bedae81SStrahinja Stanišić s[len] = '/';
58*7bedae81SStrahinja Stanišić s[maxlen + 1] = '/';
59*7bedae81SStrahinja Stanišić
60*7bedae81SStrahinja Stanišić }
61*7bedae81SStrahinja Stanišić
62*7bedae81SStrahinja Stanišić /* returns maxlen */
63*7bedae81SStrahinja Stanišić
64*7bedae81SStrahinja Stanišić /* without sentinels */
65*7bedae81SStrahinja Stanišić size_t val = strnlen_fn(s, maxlen);
66*7bedae81SStrahinja Stanišić if (val != maxlen) {
67*7bedae81SStrahinja Stanišić fprintf(stderr, "align = %d, maxlen = %zu",
68*7bedae81SStrahinja Stanišić align, maxlen);
69*7bedae81SStrahinja Stanišić atf_tc_fail("should return maxlen");
70*7bedae81SStrahinja Stanišić }
71*7bedae81SStrahinja Stanišić
72*7bedae81SStrahinja Stanišić /* with sentinels */
73*7bedae81SStrahinja Stanišić s[-1] = '\0';
74*7bedae81SStrahinja Stanišić s[maxlen + 1] = '\0';
75*7bedae81SStrahinja Stanišić val = strnlen_fn(s, maxlen);
76*7bedae81SStrahinja Stanišić if (val != maxlen) {
77*7bedae81SStrahinja Stanišić fprintf(stderr, "align = %d, maxlen = %zu",
78*7bedae81SStrahinja Stanišić align, maxlen);
79*7bedae81SStrahinja Stanišić atf_tc_fail("should return maxlen (sentinels)");
80*7bedae81SStrahinja Stanišić }
81*7bedae81SStrahinja Stanišić
82*7bedae81SStrahinja Stanišić /* cleanup */
83*7bedae81SStrahinja Stanišić s[-1] = '/';
84*7bedae81SStrahinja Stanišić s[maxlen + 1] = '/';
85*7bedae81SStrahinja Stanišić }
86*7bedae81SStrahinja Stanišić }
87*7bedae81SStrahinja Stanišić }
88*7bedae81SStrahinja Stanišić
89*7bedae81SStrahinja Stanišić ATF_TC(strnlen_size_max);
ATF_TC_HEAD(strnlen_size_max,tc)90*7bedae81SStrahinja Stanišić ATF_TC_HEAD(strnlen_size_max, tc)
91*7bedae81SStrahinja Stanišić {
92*7bedae81SStrahinja Stanišić atf_tc_set_md_var(tc, "descr", "Test strnlen(3) with maxlen=SIZE_MAX");
93*7bedae81SStrahinja Stanišić }
94*7bedae81SStrahinja Stanišić
ATF_TC_BODY(strnlen_size_max,tc)95*7bedae81SStrahinja Stanišić ATF_TC_BODY(strnlen_size_max, tc)
96*7bedae81SStrahinja Stanišić {
97*7bedae81SStrahinja Stanišić size_t (*strnlen_fn)(const char*, size_t) = strnlen;
98*7bedae81SStrahinja Stanišić char alignas(16) buffer[1 + 16 + 64 + 1 + 1];
99*7bedae81SStrahinja Stanišić
100*7bedae81SStrahinja Stanišić memset(buffer, '/', sizeof(buffer));
101*7bedae81SStrahinja Stanišić
102*7bedae81SStrahinja Stanišić for (int align = 1; align < 1 + 16; align++) {
103*7bedae81SStrahinja Stanišić char* s = buffer + align;
104*7bedae81SStrahinja Stanišić
105*7bedae81SStrahinja Stanišić for (size_t len = 0; len <= 64; len++) {
106*7bedae81SStrahinja Stanišić /* returns length */
107*7bedae81SStrahinja Stanišić
108*7bedae81SStrahinja Stanišić /* without sentinels */
109*7bedae81SStrahinja Stanišić s[len] = '\0';
110*7bedae81SStrahinja Stanišić size_t val = strnlen_fn(s, SIZE_MAX);
111*7bedae81SStrahinja Stanišić if (val != len) {
112*7bedae81SStrahinja Stanišić fprintf(stderr, "align = %d, maxlen = %zu, len = %zu",
113*7bedae81SStrahinja Stanišić align, SIZE_MAX, len);
114*7bedae81SStrahinja Stanišić atf_tc_fail("returned incorrect len (SIZE_MAX)");
115*7bedae81SStrahinja Stanišić }
116*7bedae81SStrahinja Stanišić
117*7bedae81SStrahinja Stanišić /* with sentinels */
118*7bedae81SStrahinja Stanišić s[-1] = '\0';
119*7bedae81SStrahinja Stanišić val = strnlen_fn(s, SIZE_MAX);
120*7bedae81SStrahinja Stanišić if (val != len) {
121*7bedae81SStrahinja Stanišić fprintf(stderr, "align = %d, maxlen = %zu, len = %zu",
122*7bedae81SStrahinja Stanišić align, SIZE_MAX, len);
123*7bedae81SStrahinja Stanišić atf_tc_fail("returned incorrect len (sentinels) (SIZE_MAX)");
124*7bedae81SStrahinja Stanišić }
125*7bedae81SStrahinja Stanišić
126*7bedae81SStrahinja Stanišić /* cleanup */
127*7bedae81SStrahinja Stanišić s[-1] = '/';
128*7bedae81SStrahinja Stanišić s[len] = '/';
129*7bedae81SStrahinja Stanišić }
130*7bedae81SStrahinja Stanišić }
131*7bedae81SStrahinja Stanišić }
132*7bedae81SStrahinja Stanišić
133*7bedae81SStrahinja Stanišić
134*7bedae81SStrahinja Stanišić
ATF_TP_ADD_TCS(tp)135*7bedae81SStrahinja Stanišić ATF_TP_ADD_TCS(tp)
136*7bedae81SStrahinja Stanišić {
137*7bedae81SStrahinja Stanišić ATF_TP_ADD_TC(tp, strnlen_alignments);
138*7bedae81SStrahinja Stanišić ATF_TP_ADD_TC(tp, strnlen_size_max);
139*7bedae81SStrahinja Stanišić
140*7bedae81SStrahinja Stanišić return atf_no_error();
141*7bedae81SStrahinja Stanišić }
142