1b53d7aa8SKyle Evans /* @generated by `generate-fortify-tests.lua "wchar"` */
2b53d7aa8SKyle Evans
3b53d7aa8SKyle Evans #define _FORTIFY_SOURCE 2
4b53d7aa8SKyle Evans #define TMPFILE_SIZE (1024 * 32)
5b53d7aa8SKyle Evans
6b53d7aa8SKyle Evans #include <sys/param.h>
7*22178cb2SKyle Evans #include <sys/jail.h>
8062d9380SKyle Evans #include <sys/random.h>
9b53d7aa8SKyle Evans #include <sys/resource.h>
102aba0eeaSKyle Evans #include <sys/select.h>
111f155d48SKyle Evans #include <sys/socket.h>
12b53d7aa8SKyle Evans #include <sys/time.h>
131ace24b3SKyle Evans #include <sys/uio.h>
14b53d7aa8SKyle Evans #include <sys/wait.h>
15b53d7aa8SKyle Evans #include <dirent.h>
16b53d7aa8SKyle Evans #include <errno.h>
17b53d7aa8SKyle Evans #include <fcntl.h>
18b53d7aa8SKyle Evans #include <limits.h>
19b53d7aa8SKyle Evans #include <poll.h>
20b53d7aa8SKyle Evans #include <signal.h>
21b53d7aa8SKyle Evans #include <stdio.h>
22b53d7aa8SKyle Evans #include <stdlib.h>
23b53d7aa8SKyle Evans #include <string.h>
24b53d7aa8SKyle Evans #include <strings.h>
25b53d7aa8SKyle Evans #include <sysexits.h>
26b53d7aa8SKyle Evans #include <unistd.h>
27b53d7aa8SKyle Evans #include <wchar.h>
28b53d7aa8SKyle Evans #include <atf-c.h>
29b53d7aa8SKyle Evans
30b53d7aa8SKyle Evans static FILE * __unused
new_fp(size_t __len)31b53d7aa8SKyle Evans new_fp(size_t __len)
32b53d7aa8SKyle Evans {
33b53d7aa8SKyle Evans static char fpbuf[LINE_MAX];
34b53d7aa8SKyle Evans FILE *fp;
35b53d7aa8SKyle Evans
36b53d7aa8SKyle Evans ATF_REQUIRE(__len <= sizeof(fpbuf));
37b53d7aa8SKyle Evans
38b53d7aa8SKyle Evans memset(fpbuf, 'A', sizeof(fpbuf) - 1);
39b53d7aa8SKyle Evans fpbuf[sizeof(fpbuf) - 1] = '\0';
40b53d7aa8SKyle Evans
41b53d7aa8SKyle Evans fp = fmemopen(fpbuf, sizeof(fpbuf), "rb");
42b53d7aa8SKyle Evans ATF_REQUIRE(fp != NULL);
43b53d7aa8SKyle Evans
44b53d7aa8SKyle Evans return (fp);
45b53d7aa8SKyle Evans }
46b53d7aa8SKyle Evans
47b53d7aa8SKyle Evans /*
48b53d7aa8SKyle Evans * Create a new symlink to use for readlink(2) style tests, we'll just use a
49b53d7aa8SKyle Evans * random target name to have something interesting to look at.
50b53d7aa8SKyle Evans */
51b53d7aa8SKyle Evans static const char * __unused
new_symlink(size_t __len)52b53d7aa8SKyle Evans new_symlink(size_t __len)
53b53d7aa8SKyle Evans {
54b53d7aa8SKyle Evans static const char linkname[] = "link";
55b53d7aa8SKyle Evans char target[MAXNAMLEN];
56b53d7aa8SKyle Evans int error;
57b53d7aa8SKyle Evans
58b53d7aa8SKyle Evans ATF_REQUIRE(__len <= sizeof(target));
59b53d7aa8SKyle Evans
60b53d7aa8SKyle Evans arc4random_buf(target, sizeof(target));
61b53d7aa8SKyle Evans
62b53d7aa8SKyle Evans error = unlink(linkname);
63b53d7aa8SKyle Evans ATF_REQUIRE(error == 0 || errno == ENOENT);
64b53d7aa8SKyle Evans
65b53d7aa8SKyle Evans error = symlink(target, linkname);
66b53d7aa8SKyle Evans ATF_REQUIRE(error == 0);
67b53d7aa8SKyle Evans
68b53d7aa8SKyle Evans return (linkname);
69b53d7aa8SKyle Evans }
70b53d7aa8SKyle Evans
71b53d7aa8SKyle Evans /*
721f155d48SKyle Evans * For our purposes, first descriptor will be the reader; we'll send both
731f155d48SKyle Evans * raw data and a control message over it so that the result can be used for
741f155d48SKyle Evans * any of our recv*() tests.
751f155d48SKyle Evans */
761f155d48SKyle Evans static void __unused
new_socket(int sock[2])771f155d48SKyle Evans new_socket(int sock[2])
781f155d48SKyle Evans {
791f155d48SKyle Evans unsigned char ctrl[CMSG_SPACE(sizeof(int))] = { 0 };
801f155d48SKyle Evans static char sockbuf[256];
811f155d48SKyle Evans ssize_t rv;
821f155d48SKyle Evans size_t total = 0;
831f155d48SKyle Evans struct msghdr hdr = { 0 };
841f155d48SKyle Evans struct cmsghdr *cmsg;
851f155d48SKyle Evans int error, fd;
861f155d48SKyle Evans
871f155d48SKyle Evans error = socketpair(AF_UNIX, SOCK_STREAM, 0, sock);
881f155d48SKyle Evans ATF_REQUIRE(error == 0);
891f155d48SKyle Evans
901f155d48SKyle Evans while (total != sizeof(sockbuf)) {
911f155d48SKyle Evans rv = send(sock[1], &sockbuf[total], sizeof(sockbuf) - total, 0);
921f155d48SKyle Evans
931f155d48SKyle Evans ATF_REQUIRE_MSG(rv > 0,
941f155d48SKyle Evans "expected bytes sent, got %zd with %zu left (size %zu, total %zu)",
951f155d48SKyle Evans rv, sizeof(sockbuf) - total, sizeof(sockbuf), total);
961f155d48SKyle Evans ATF_REQUIRE_MSG(total + (size_t)rv <= sizeof(sockbuf),
971f155d48SKyle Evans "%zd exceeds total %zu", rv, sizeof(sockbuf));
981f155d48SKyle Evans total += rv;
991f155d48SKyle Evans }
1001f155d48SKyle Evans
1011f155d48SKyle Evans hdr.msg_control = ctrl;
1021f155d48SKyle Evans hdr.msg_controllen = sizeof(ctrl);
1031f155d48SKyle Evans
1041f155d48SKyle Evans cmsg = CMSG_FIRSTHDR(&hdr);
1051f155d48SKyle Evans cmsg->cmsg_level = SOL_SOCKET;
1061f155d48SKyle Evans cmsg->cmsg_type = SCM_RIGHTS;
1071f155d48SKyle Evans cmsg->cmsg_len = CMSG_LEN(sizeof(fd));
1081f155d48SKyle Evans fd = STDIN_FILENO;
1091f155d48SKyle Evans memcpy(CMSG_DATA(cmsg), &fd, sizeof(fd));
1101f155d48SKyle Evans
1111f155d48SKyle Evans error = sendmsg(sock[1], &hdr, 0);
1121f155d48SKyle Evans ATF_REQUIRE(error != -1);
1131f155d48SKyle Evans }
1141f155d48SKyle Evans
1151f155d48SKyle Evans /*
116b53d7aa8SKyle Evans * Constructs a tmpfile that we can use for testing read(2) and friends.
117b53d7aa8SKyle Evans */
118b53d7aa8SKyle Evans static int __unused
new_tmpfile(void)119b53d7aa8SKyle Evans new_tmpfile(void)
120b53d7aa8SKyle Evans {
121b53d7aa8SKyle Evans char buf[1024];
122b53d7aa8SKyle Evans ssize_t rv;
123b53d7aa8SKyle Evans size_t written;
124b53d7aa8SKyle Evans int fd;
125b53d7aa8SKyle Evans
126b53d7aa8SKyle Evans fd = open("tmpfile", O_RDWR | O_CREAT | O_TRUNC, 0644);
127b53d7aa8SKyle Evans ATF_REQUIRE(fd >= 0);
128b53d7aa8SKyle Evans
129b53d7aa8SKyle Evans written = 0;
130b53d7aa8SKyle Evans while (written < TMPFILE_SIZE) {
131b53d7aa8SKyle Evans rv = write(fd, buf, sizeof(buf));
132b53d7aa8SKyle Evans ATF_REQUIRE(rv > 0);
133b53d7aa8SKyle Evans
134b53d7aa8SKyle Evans written += rv;
135b53d7aa8SKyle Evans }
136b53d7aa8SKyle Evans
137b53d7aa8SKyle Evans ATF_REQUIRE_EQ(0, lseek(fd, 0, SEEK_SET));
138b53d7aa8SKyle Evans return (fd);
139b53d7aa8SKyle Evans }
140b53d7aa8SKyle Evans
141b53d7aa8SKyle Evans static void
disable_coredumps(void)142b53d7aa8SKyle Evans disable_coredumps(void)
143b53d7aa8SKyle Evans {
144b53d7aa8SKyle Evans struct rlimit rl = { 0 };
145b53d7aa8SKyle Evans
146b53d7aa8SKyle Evans if (setrlimit(RLIMIT_CORE, &rl) == -1)
147b53d7aa8SKyle Evans _exit(EX_OSERR);
148b53d7aa8SKyle Evans }
149b53d7aa8SKyle Evans
150b53d7aa8SKyle Evans /*
151b53d7aa8SKyle Evans * Replaces stdin with a file that we can actually read from, for tests where
152b53d7aa8SKyle Evans * we want a FILE * or fd that we can get data from.
153b53d7aa8SKyle Evans */
154b53d7aa8SKyle Evans static void __unused
replace_stdin(void)155b53d7aa8SKyle Evans replace_stdin(void)
156b53d7aa8SKyle Evans {
157b53d7aa8SKyle Evans int fd;
158b53d7aa8SKyle Evans
159b53d7aa8SKyle Evans fd = new_tmpfile();
160b53d7aa8SKyle Evans
161b53d7aa8SKyle Evans (void)dup2(fd, STDIN_FILENO);
162b53d7aa8SKyle Evans if (fd != STDIN_FILENO)
163b53d7aa8SKyle Evans close(fd);
164b53d7aa8SKyle Evans }
165b53d7aa8SKyle Evans
16609cdbf04SKyle Evans ATF_TC(wmemcpy_before_end);
ATF_TC_HEAD(wmemcpy_before_end,tc)16709cdbf04SKyle Evans ATF_TC_HEAD(wmemcpy_before_end, tc)
16809cdbf04SKyle Evans {
16909cdbf04SKyle Evans }
ATF_TC_BODY(wmemcpy_before_end,tc)170b53d7aa8SKyle Evans ATF_TC_BODY(wmemcpy_before_end, tc)
171b53d7aa8SKyle Evans {
172b53d7aa8SKyle Evans #define BUF &__stack.__buf
173b53d7aa8SKyle Evans struct {
174b53d7aa8SKyle Evans uint8_t padding_l;
175b53d7aa8SKyle Evans wchar_t __buf[42];
176b53d7aa8SKyle Evans uint8_t padding_r;
177b53d7aa8SKyle Evans } __stack;
178b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
179b53d7aa8SKyle Evans const size_t __len = 42 - 1;
180b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
181b53d7aa8SKyle Evans wchar_t src[__len + 10];
182b53d7aa8SKyle Evans
183b53d7aa8SKyle Evans wmemcpy(__stack.__buf, src, __len);
184b53d7aa8SKyle Evans #undef BUF
185b53d7aa8SKyle Evans
186b53d7aa8SKyle Evans }
187b53d7aa8SKyle Evans
18809cdbf04SKyle Evans ATF_TC(wmemcpy_end);
ATF_TC_HEAD(wmemcpy_end,tc)18909cdbf04SKyle Evans ATF_TC_HEAD(wmemcpy_end, tc)
19009cdbf04SKyle Evans {
19109cdbf04SKyle Evans }
ATF_TC_BODY(wmemcpy_end,tc)192b53d7aa8SKyle Evans ATF_TC_BODY(wmemcpy_end, tc)
193b53d7aa8SKyle Evans {
194b53d7aa8SKyle Evans #define BUF &__stack.__buf
195b53d7aa8SKyle Evans struct {
196b53d7aa8SKyle Evans uint8_t padding_l;
197b53d7aa8SKyle Evans wchar_t __buf[42];
198b53d7aa8SKyle Evans uint8_t padding_r;
199b53d7aa8SKyle Evans } __stack;
200b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
201b53d7aa8SKyle Evans const size_t __len = 42;
202b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
203b53d7aa8SKyle Evans wchar_t src[__len + 10];
204b53d7aa8SKyle Evans
205b53d7aa8SKyle Evans wmemcpy(__stack.__buf, src, __len);
206b53d7aa8SKyle Evans #undef BUF
207b53d7aa8SKyle Evans
208b53d7aa8SKyle Evans }
209b53d7aa8SKyle Evans
21009cdbf04SKyle Evans ATF_TC(wmemcpy_heap_before_end);
ATF_TC_HEAD(wmemcpy_heap_before_end,tc)21109cdbf04SKyle Evans ATF_TC_HEAD(wmemcpy_heap_before_end, tc)
21209cdbf04SKyle Evans {
21309cdbf04SKyle Evans }
ATF_TC_BODY(wmemcpy_heap_before_end,tc)214b53d7aa8SKyle Evans ATF_TC_BODY(wmemcpy_heap_before_end, tc)
215b53d7aa8SKyle Evans {
216b53d7aa8SKyle Evans #define BUF __stack.__buf
217b53d7aa8SKyle Evans struct {
218b53d7aa8SKyle Evans uint8_t padding_l;
219b53d7aa8SKyle Evans wchar_t * __buf;
220b53d7aa8SKyle Evans uint8_t padding_r;
221b53d7aa8SKyle Evans } __stack;
222b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
223b53d7aa8SKyle Evans const size_t __len = 42 - 1;
224b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
225b53d7aa8SKyle Evans wchar_t src[__len + 10];
226b53d7aa8SKyle Evans
227b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
228b53d7aa8SKyle Evans
229b53d7aa8SKyle Evans wmemcpy(__stack.__buf, src, __len);
230b53d7aa8SKyle Evans #undef BUF
231b53d7aa8SKyle Evans
232b53d7aa8SKyle Evans }
233b53d7aa8SKyle Evans
23409cdbf04SKyle Evans ATF_TC(wmemcpy_heap_end);
ATF_TC_HEAD(wmemcpy_heap_end,tc)23509cdbf04SKyle Evans ATF_TC_HEAD(wmemcpy_heap_end, tc)
23609cdbf04SKyle Evans {
23709cdbf04SKyle Evans }
ATF_TC_BODY(wmemcpy_heap_end,tc)238b53d7aa8SKyle Evans ATF_TC_BODY(wmemcpy_heap_end, tc)
239b53d7aa8SKyle Evans {
240b53d7aa8SKyle Evans #define BUF __stack.__buf
241b53d7aa8SKyle Evans struct {
242b53d7aa8SKyle Evans uint8_t padding_l;
243b53d7aa8SKyle Evans wchar_t * __buf;
244b53d7aa8SKyle Evans uint8_t padding_r;
245b53d7aa8SKyle Evans } __stack;
246b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
247b53d7aa8SKyle Evans const size_t __len = 42;
248b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
249b53d7aa8SKyle Evans wchar_t src[__len + 10];
250b53d7aa8SKyle Evans
251b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
252b53d7aa8SKyle Evans
253b53d7aa8SKyle Evans wmemcpy(__stack.__buf, src, __len);
254b53d7aa8SKyle Evans #undef BUF
255b53d7aa8SKyle Evans
256b53d7aa8SKyle Evans }
257b53d7aa8SKyle Evans
25809cdbf04SKyle Evans ATF_TC(wmemcpy_heap_after_end);
ATF_TC_HEAD(wmemcpy_heap_after_end,tc)25909cdbf04SKyle Evans ATF_TC_HEAD(wmemcpy_heap_after_end, tc)
26009cdbf04SKyle Evans {
26109cdbf04SKyle Evans }
ATF_TC_BODY(wmemcpy_heap_after_end,tc)262b53d7aa8SKyle Evans ATF_TC_BODY(wmemcpy_heap_after_end, tc)
263b53d7aa8SKyle Evans {
264b53d7aa8SKyle Evans #define BUF __stack.__buf
265b53d7aa8SKyle Evans struct {
266b53d7aa8SKyle Evans uint8_t padding_l;
267b53d7aa8SKyle Evans wchar_t * __buf;
268b53d7aa8SKyle Evans uint8_t padding_r;
269b53d7aa8SKyle Evans } __stack;
270b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
271b53d7aa8SKyle Evans const size_t __len = 42 + 1;
272b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
273b53d7aa8SKyle Evans pid_t __child;
274b53d7aa8SKyle Evans int __status;
275b53d7aa8SKyle Evans wchar_t src[__len + 10];
276b53d7aa8SKyle Evans
277b53d7aa8SKyle Evans __child = fork();
278b53d7aa8SKyle Evans ATF_REQUIRE(__child >= 0);
279b53d7aa8SKyle Evans if (__child > 0)
280b53d7aa8SKyle Evans goto monitor;
281b53d7aa8SKyle Evans
282b53d7aa8SKyle Evans /* Child */
283b53d7aa8SKyle Evans disable_coredumps();
284b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
285b53d7aa8SKyle Evans
286b53d7aa8SKyle Evans wmemcpy(__stack.__buf, src, __len);
287b53d7aa8SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
288b53d7aa8SKyle Evans
289b53d7aa8SKyle Evans monitor:
290b53d7aa8SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
291b53d7aa8SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
292b53d7aa8SKyle Evans }
293b53d7aa8SKyle Evans
294b53d7aa8SKyle Evans if (!WIFSIGNALED(__status)) {
295b53d7aa8SKyle Evans switch (WEXITSTATUS(__status)) {
296b53d7aa8SKyle Evans case EX_SOFTWARE:
297b53d7aa8SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
298b53d7aa8SKyle Evans break;
299b53d7aa8SKyle Evans case EX_OSERR:
300b53d7aa8SKyle Evans atf_tc_fail("setrlimit(2) failed");
301b53d7aa8SKyle Evans break;
302b53d7aa8SKyle Evans default:
303b53d7aa8SKyle Evans atf_tc_fail("child exited with status %d",
304b53d7aa8SKyle Evans WEXITSTATUS(__status));
305b53d7aa8SKyle Evans }
306b53d7aa8SKyle Evans } else {
307b53d7aa8SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
308b53d7aa8SKyle Evans }
309b53d7aa8SKyle Evans #undef BUF
310b53d7aa8SKyle Evans
311b53d7aa8SKyle Evans }
312b53d7aa8SKyle Evans
31309cdbf04SKyle Evans ATF_TC(wmempcpy_before_end);
ATF_TC_HEAD(wmempcpy_before_end,tc)31409cdbf04SKyle Evans ATF_TC_HEAD(wmempcpy_before_end, tc)
31509cdbf04SKyle Evans {
31609cdbf04SKyle Evans }
ATF_TC_BODY(wmempcpy_before_end,tc)317b53d7aa8SKyle Evans ATF_TC_BODY(wmempcpy_before_end, tc)
318b53d7aa8SKyle Evans {
319b53d7aa8SKyle Evans #define BUF &__stack.__buf
320b53d7aa8SKyle Evans struct {
321b53d7aa8SKyle Evans uint8_t padding_l;
322b53d7aa8SKyle Evans wchar_t __buf[42];
323b53d7aa8SKyle Evans uint8_t padding_r;
324b53d7aa8SKyle Evans } __stack;
325b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
326b53d7aa8SKyle Evans const size_t __len = 42 - 1;
327b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
328b53d7aa8SKyle Evans wchar_t src[__len + 10];
329b53d7aa8SKyle Evans
330b53d7aa8SKyle Evans wmempcpy(__stack.__buf, src, __len);
331b53d7aa8SKyle Evans #undef BUF
332b53d7aa8SKyle Evans
333b53d7aa8SKyle Evans }
334b53d7aa8SKyle Evans
33509cdbf04SKyle Evans ATF_TC(wmempcpy_end);
ATF_TC_HEAD(wmempcpy_end,tc)33609cdbf04SKyle Evans ATF_TC_HEAD(wmempcpy_end, tc)
33709cdbf04SKyle Evans {
33809cdbf04SKyle Evans }
ATF_TC_BODY(wmempcpy_end,tc)339b53d7aa8SKyle Evans ATF_TC_BODY(wmempcpy_end, tc)
340b53d7aa8SKyle Evans {
341b53d7aa8SKyle Evans #define BUF &__stack.__buf
342b53d7aa8SKyle Evans struct {
343b53d7aa8SKyle Evans uint8_t padding_l;
344b53d7aa8SKyle Evans wchar_t __buf[42];
345b53d7aa8SKyle Evans uint8_t padding_r;
346b53d7aa8SKyle Evans } __stack;
347b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
348b53d7aa8SKyle Evans const size_t __len = 42;
349b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
350b53d7aa8SKyle Evans wchar_t src[__len + 10];
351b53d7aa8SKyle Evans
352b53d7aa8SKyle Evans wmempcpy(__stack.__buf, src, __len);
353b53d7aa8SKyle Evans #undef BUF
354b53d7aa8SKyle Evans
355b53d7aa8SKyle Evans }
356b53d7aa8SKyle Evans
35709cdbf04SKyle Evans ATF_TC(wmempcpy_heap_before_end);
ATF_TC_HEAD(wmempcpy_heap_before_end,tc)35809cdbf04SKyle Evans ATF_TC_HEAD(wmempcpy_heap_before_end, tc)
35909cdbf04SKyle Evans {
36009cdbf04SKyle Evans }
ATF_TC_BODY(wmempcpy_heap_before_end,tc)361b53d7aa8SKyle Evans ATF_TC_BODY(wmempcpy_heap_before_end, tc)
362b53d7aa8SKyle Evans {
363b53d7aa8SKyle Evans #define BUF __stack.__buf
364b53d7aa8SKyle Evans struct {
365b53d7aa8SKyle Evans uint8_t padding_l;
366b53d7aa8SKyle Evans wchar_t * __buf;
367b53d7aa8SKyle Evans uint8_t padding_r;
368b53d7aa8SKyle Evans } __stack;
369b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
370b53d7aa8SKyle Evans const size_t __len = 42 - 1;
371b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
372b53d7aa8SKyle Evans wchar_t src[__len + 10];
373b53d7aa8SKyle Evans
374b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
375b53d7aa8SKyle Evans
376b53d7aa8SKyle Evans wmempcpy(__stack.__buf, src, __len);
377b53d7aa8SKyle Evans #undef BUF
378b53d7aa8SKyle Evans
379b53d7aa8SKyle Evans }
380b53d7aa8SKyle Evans
38109cdbf04SKyle Evans ATF_TC(wmempcpy_heap_end);
ATF_TC_HEAD(wmempcpy_heap_end,tc)38209cdbf04SKyle Evans ATF_TC_HEAD(wmempcpy_heap_end, tc)
38309cdbf04SKyle Evans {
38409cdbf04SKyle Evans }
ATF_TC_BODY(wmempcpy_heap_end,tc)385b53d7aa8SKyle Evans ATF_TC_BODY(wmempcpy_heap_end, tc)
386b53d7aa8SKyle Evans {
387b53d7aa8SKyle Evans #define BUF __stack.__buf
388b53d7aa8SKyle Evans struct {
389b53d7aa8SKyle Evans uint8_t padding_l;
390b53d7aa8SKyle Evans wchar_t * __buf;
391b53d7aa8SKyle Evans uint8_t padding_r;
392b53d7aa8SKyle Evans } __stack;
393b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
394b53d7aa8SKyle Evans const size_t __len = 42;
395b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
396b53d7aa8SKyle Evans wchar_t src[__len + 10];
397b53d7aa8SKyle Evans
398b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
399b53d7aa8SKyle Evans
400b53d7aa8SKyle Evans wmempcpy(__stack.__buf, src, __len);
401b53d7aa8SKyle Evans #undef BUF
402b53d7aa8SKyle Evans
403b53d7aa8SKyle Evans }
404b53d7aa8SKyle Evans
40509cdbf04SKyle Evans ATF_TC(wmempcpy_heap_after_end);
ATF_TC_HEAD(wmempcpy_heap_after_end,tc)40609cdbf04SKyle Evans ATF_TC_HEAD(wmempcpy_heap_after_end, tc)
40709cdbf04SKyle Evans {
40809cdbf04SKyle Evans }
ATF_TC_BODY(wmempcpy_heap_after_end,tc)409b53d7aa8SKyle Evans ATF_TC_BODY(wmempcpy_heap_after_end, tc)
410b53d7aa8SKyle Evans {
411b53d7aa8SKyle Evans #define BUF __stack.__buf
412b53d7aa8SKyle Evans struct {
413b53d7aa8SKyle Evans uint8_t padding_l;
414b53d7aa8SKyle Evans wchar_t * __buf;
415b53d7aa8SKyle Evans uint8_t padding_r;
416b53d7aa8SKyle Evans } __stack;
417b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
418b53d7aa8SKyle Evans const size_t __len = 42 + 1;
419b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
420b53d7aa8SKyle Evans pid_t __child;
421b53d7aa8SKyle Evans int __status;
422b53d7aa8SKyle Evans wchar_t src[__len + 10];
423b53d7aa8SKyle Evans
424b53d7aa8SKyle Evans __child = fork();
425b53d7aa8SKyle Evans ATF_REQUIRE(__child >= 0);
426b53d7aa8SKyle Evans if (__child > 0)
427b53d7aa8SKyle Evans goto monitor;
428b53d7aa8SKyle Evans
429b53d7aa8SKyle Evans /* Child */
430b53d7aa8SKyle Evans disable_coredumps();
431b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
432b53d7aa8SKyle Evans
433b53d7aa8SKyle Evans wmempcpy(__stack.__buf, src, __len);
434b53d7aa8SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
435b53d7aa8SKyle Evans
436b53d7aa8SKyle Evans monitor:
437b53d7aa8SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
438b53d7aa8SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
439b53d7aa8SKyle Evans }
440b53d7aa8SKyle Evans
441b53d7aa8SKyle Evans if (!WIFSIGNALED(__status)) {
442b53d7aa8SKyle Evans switch (WEXITSTATUS(__status)) {
443b53d7aa8SKyle Evans case EX_SOFTWARE:
444b53d7aa8SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
445b53d7aa8SKyle Evans break;
446b53d7aa8SKyle Evans case EX_OSERR:
447b53d7aa8SKyle Evans atf_tc_fail("setrlimit(2) failed");
448b53d7aa8SKyle Evans break;
449b53d7aa8SKyle Evans default:
450b53d7aa8SKyle Evans atf_tc_fail("child exited with status %d",
451b53d7aa8SKyle Evans WEXITSTATUS(__status));
452b53d7aa8SKyle Evans }
453b53d7aa8SKyle Evans } else {
454b53d7aa8SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
455b53d7aa8SKyle Evans }
456b53d7aa8SKyle Evans #undef BUF
457b53d7aa8SKyle Evans
458b53d7aa8SKyle Evans }
459b53d7aa8SKyle Evans
46009cdbf04SKyle Evans ATF_TC(wmemmove_before_end);
ATF_TC_HEAD(wmemmove_before_end,tc)46109cdbf04SKyle Evans ATF_TC_HEAD(wmemmove_before_end, tc)
46209cdbf04SKyle Evans {
46309cdbf04SKyle Evans }
ATF_TC_BODY(wmemmove_before_end,tc)464b53d7aa8SKyle Evans ATF_TC_BODY(wmemmove_before_end, tc)
465b53d7aa8SKyle Evans {
466b53d7aa8SKyle Evans #define BUF &__stack.__buf
467b53d7aa8SKyle Evans struct {
468b53d7aa8SKyle Evans uint8_t padding_l;
469b53d7aa8SKyle Evans wchar_t __buf[42];
470b53d7aa8SKyle Evans uint8_t padding_r;
471b53d7aa8SKyle Evans } __stack;
472b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
473b53d7aa8SKyle Evans const size_t __len = 42 - 1;
474b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
475b53d7aa8SKyle Evans wchar_t src[__len + 10];
476b53d7aa8SKyle Evans
477b53d7aa8SKyle Evans wmemmove(__stack.__buf, src, __len);
478b53d7aa8SKyle Evans #undef BUF
479b53d7aa8SKyle Evans
480b53d7aa8SKyle Evans }
481b53d7aa8SKyle Evans
48209cdbf04SKyle Evans ATF_TC(wmemmove_end);
ATF_TC_HEAD(wmemmove_end,tc)48309cdbf04SKyle Evans ATF_TC_HEAD(wmemmove_end, tc)
48409cdbf04SKyle Evans {
48509cdbf04SKyle Evans }
ATF_TC_BODY(wmemmove_end,tc)486b53d7aa8SKyle Evans ATF_TC_BODY(wmemmove_end, tc)
487b53d7aa8SKyle Evans {
488b53d7aa8SKyle Evans #define BUF &__stack.__buf
489b53d7aa8SKyle Evans struct {
490b53d7aa8SKyle Evans uint8_t padding_l;
491b53d7aa8SKyle Evans wchar_t __buf[42];
492b53d7aa8SKyle Evans uint8_t padding_r;
493b53d7aa8SKyle Evans } __stack;
494b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
495b53d7aa8SKyle Evans const size_t __len = 42;
496b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
497b53d7aa8SKyle Evans wchar_t src[__len + 10];
498b53d7aa8SKyle Evans
499b53d7aa8SKyle Evans wmemmove(__stack.__buf, src, __len);
500b53d7aa8SKyle Evans #undef BUF
501b53d7aa8SKyle Evans
502b53d7aa8SKyle Evans }
503b53d7aa8SKyle Evans
50409cdbf04SKyle Evans ATF_TC(wmemmove_heap_before_end);
ATF_TC_HEAD(wmemmove_heap_before_end,tc)50509cdbf04SKyle Evans ATF_TC_HEAD(wmemmove_heap_before_end, tc)
50609cdbf04SKyle Evans {
50709cdbf04SKyle Evans }
ATF_TC_BODY(wmemmove_heap_before_end,tc)508b53d7aa8SKyle Evans ATF_TC_BODY(wmemmove_heap_before_end, tc)
509b53d7aa8SKyle Evans {
510b53d7aa8SKyle Evans #define BUF __stack.__buf
511b53d7aa8SKyle Evans struct {
512b53d7aa8SKyle Evans uint8_t padding_l;
513b53d7aa8SKyle Evans wchar_t * __buf;
514b53d7aa8SKyle Evans uint8_t padding_r;
515b53d7aa8SKyle Evans } __stack;
516b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
517b53d7aa8SKyle Evans const size_t __len = 42 - 1;
518b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
519b53d7aa8SKyle Evans wchar_t src[__len + 10];
520b53d7aa8SKyle Evans
521b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
522b53d7aa8SKyle Evans
523b53d7aa8SKyle Evans wmemmove(__stack.__buf, src, __len);
524b53d7aa8SKyle Evans #undef BUF
525b53d7aa8SKyle Evans
526b53d7aa8SKyle Evans }
527b53d7aa8SKyle Evans
52809cdbf04SKyle Evans ATF_TC(wmemmove_heap_end);
ATF_TC_HEAD(wmemmove_heap_end,tc)52909cdbf04SKyle Evans ATF_TC_HEAD(wmemmove_heap_end, tc)
53009cdbf04SKyle Evans {
53109cdbf04SKyle Evans }
ATF_TC_BODY(wmemmove_heap_end,tc)532b53d7aa8SKyle Evans ATF_TC_BODY(wmemmove_heap_end, tc)
533b53d7aa8SKyle Evans {
534b53d7aa8SKyle Evans #define BUF __stack.__buf
535b53d7aa8SKyle Evans struct {
536b53d7aa8SKyle Evans uint8_t padding_l;
537b53d7aa8SKyle Evans wchar_t * __buf;
538b53d7aa8SKyle Evans uint8_t padding_r;
539b53d7aa8SKyle Evans } __stack;
540b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
541b53d7aa8SKyle Evans const size_t __len = 42;
542b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
543b53d7aa8SKyle Evans wchar_t src[__len + 10];
544b53d7aa8SKyle Evans
545b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
546b53d7aa8SKyle Evans
547b53d7aa8SKyle Evans wmemmove(__stack.__buf, src, __len);
548b53d7aa8SKyle Evans #undef BUF
549b53d7aa8SKyle Evans
550b53d7aa8SKyle Evans }
551b53d7aa8SKyle Evans
55209cdbf04SKyle Evans ATF_TC(wmemmove_heap_after_end);
ATF_TC_HEAD(wmemmove_heap_after_end,tc)55309cdbf04SKyle Evans ATF_TC_HEAD(wmemmove_heap_after_end, tc)
55409cdbf04SKyle Evans {
55509cdbf04SKyle Evans }
ATF_TC_BODY(wmemmove_heap_after_end,tc)556b53d7aa8SKyle Evans ATF_TC_BODY(wmemmove_heap_after_end, tc)
557b53d7aa8SKyle Evans {
558b53d7aa8SKyle Evans #define BUF __stack.__buf
559b53d7aa8SKyle Evans struct {
560b53d7aa8SKyle Evans uint8_t padding_l;
561b53d7aa8SKyle Evans wchar_t * __buf;
562b53d7aa8SKyle Evans uint8_t padding_r;
563b53d7aa8SKyle Evans } __stack;
564b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
565b53d7aa8SKyle Evans const size_t __len = 42 + 1;
566b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
567b53d7aa8SKyle Evans pid_t __child;
568b53d7aa8SKyle Evans int __status;
569b53d7aa8SKyle Evans wchar_t src[__len + 10];
570b53d7aa8SKyle Evans
571b53d7aa8SKyle Evans __child = fork();
572b53d7aa8SKyle Evans ATF_REQUIRE(__child >= 0);
573b53d7aa8SKyle Evans if (__child > 0)
574b53d7aa8SKyle Evans goto monitor;
575b53d7aa8SKyle Evans
576b53d7aa8SKyle Evans /* Child */
577b53d7aa8SKyle Evans disable_coredumps();
578b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
579b53d7aa8SKyle Evans
580b53d7aa8SKyle Evans wmemmove(__stack.__buf, src, __len);
581b53d7aa8SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
582b53d7aa8SKyle Evans
583b53d7aa8SKyle Evans monitor:
584b53d7aa8SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
585b53d7aa8SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
586b53d7aa8SKyle Evans }
587b53d7aa8SKyle Evans
588b53d7aa8SKyle Evans if (!WIFSIGNALED(__status)) {
589b53d7aa8SKyle Evans switch (WEXITSTATUS(__status)) {
590b53d7aa8SKyle Evans case EX_SOFTWARE:
591b53d7aa8SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
592b53d7aa8SKyle Evans break;
593b53d7aa8SKyle Evans case EX_OSERR:
594b53d7aa8SKyle Evans atf_tc_fail("setrlimit(2) failed");
595b53d7aa8SKyle Evans break;
596b53d7aa8SKyle Evans default:
597b53d7aa8SKyle Evans atf_tc_fail("child exited with status %d",
598b53d7aa8SKyle Evans WEXITSTATUS(__status));
599b53d7aa8SKyle Evans }
600b53d7aa8SKyle Evans } else {
601b53d7aa8SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
602b53d7aa8SKyle Evans }
603b53d7aa8SKyle Evans #undef BUF
604b53d7aa8SKyle Evans
605b53d7aa8SKyle Evans }
606b53d7aa8SKyle Evans
60709cdbf04SKyle Evans ATF_TC(wmemset_before_end);
ATF_TC_HEAD(wmemset_before_end,tc)60809cdbf04SKyle Evans ATF_TC_HEAD(wmemset_before_end, tc)
60909cdbf04SKyle Evans {
61009cdbf04SKyle Evans }
ATF_TC_BODY(wmemset_before_end,tc)611b53d7aa8SKyle Evans ATF_TC_BODY(wmemset_before_end, tc)
612b53d7aa8SKyle Evans {
613b53d7aa8SKyle Evans #define BUF &__stack.__buf
614b53d7aa8SKyle Evans struct {
615b53d7aa8SKyle Evans uint8_t padding_l;
616b53d7aa8SKyle Evans wchar_t __buf[42];
617b53d7aa8SKyle Evans uint8_t padding_r;
618b53d7aa8SKyle Evans } __stack;
619b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
620b53d7aa8SKyle Evans const size_t __len = 42 - 1;
621b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
622b53d7aa8SKyle Evans
623b53d7aa8SKyle Evans wmemset(__stack.__buf, L'0', __len);
624b53d7aa8SKyle Evans #undef BUF
625b53d7aa8SKyle Evans
626b53d7aa8SKyle Evans }
627b53d7aa8SKyle Evans
62809cdbf04SKyle Evans ATF_TC(wmemset_end);
ATF_TC_HEAD(wmemset_end,tc)62909cdbf04SKyle Evans ATF_TC_HEAD(wmemset_end, tc)
63009cdbf04SKyle Evans {
63109cdbf04SKyle Evans }
ATF_TC_BODY(wmemset_end,tc)632b53d7aa8SKyle Evans ATF_TC_BODY(wmemset_end, tc)
633b53d7aa8SKyle Evans {
634b53d7aa8SKyle Evans #define BUF &__stack.__buf
635b53d7aa8SKyle Evans struct {
636b53d7aa8SKyle Evans uint8_t padding_l;
637b53d7aa8SKyle Evans wchar_t __buf[42];
638b53d7aa8SKyle Evans uint8_t padding_r;
639b53d7aa8SKyle Evans } __stack;
640b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
641b53d7aa8SKyle Evans const size_t __len = 42;
642b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
643b53d7aa8SKyle Evans
644b53d7aa8SKyle Evans wmemset(__stack.__buf, L'0', __len);
645b53d7aa8SKyle Evans #undef BUF
646b53d7aa8SKyle Evans
647b53d7aa8SKyle Evans }
648b53d7aa8SKyle Evans
64909cdbf04SKyle Evans ATF_TC(wmemset_heap_before_end);
ATF_TC_HEAD(wmemset_heap_before_end,tc)65009cdbf04SKyle Evans ATF_TC_HEAD(wmemset_heap_before_end, tc)
65109cdbf04SKyle Evans {
65209cdbf04SKyle Evans }
ATF_TC_BODY(wmemset_heap_before_end,tc)653b53d7aa8SKyle Evans ATF_TC_BODY(wmemset_heap_before_end, tc)
654b53d7aa8SKyle Evans {
655b53d7aa8SKyle Evans #define BUF __stack.__buf
656b53d7aa8SKyle Evans struct {
657b53d7aa8SKyle Evans uint8_t padding_l;
658b53d7aa8SKyle Evans wchar_t * __buf;
659b53d7aa8SKyle Evans uint8_t padding_r;
660b53d7aa8SKyle Evans } __stack;
661b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
662b53d7aa8SKyle Evans const size_t __len = 42 - 1;
663b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
664b53d7aa8SKyle Evans
665b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
666b53d7aa8SKyle Evans
667b53d7aa8SKyle Evans wmemset(__stack.__buf, L'0', __len);
668b53d7aa8SKyle Evans #undef BUF
669b53d7aa8SKyle Evans
670b53d7aa8SKyle Evans }
671b53d7aa8SKyle Evans
67209cdbf04SKyle Evans ATF_TC(wmemset_heap_end);
ATF_TC_HEAD(wmemset_heap_end,tc)67309cdbf04SKyle Evans ATF_TC_HEAD(wmemset_heap_end, tc)
67409cdbf04SKyle Evans {
67509cdbf04SKyle Evans }
ATF_TC_BODY(wmemset_heap_end,tc)676b53d7aa8SKyle Evans ATF_TC_BODY(wmemset_heap_end, tc)
677b53d7aa8SKyle Evans {
678b53d7aa8SKyle Evans #define BUF __stack.__buf
679b53d7aa8SKyle Evans struct {
680b53d7aa8SKyle Evans uint8_t padding_l;
681b53d7aa8SKyle Evans wchar_t * __buf;
682b53d7aa8SKyle Evans uint8_t padding_r;
683b53d7aa8SKyle Evans } __stack;
684b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
685b53d7aa8SKyle Evans const size_t __len = 42;
686b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
687b53d7aa8SKyle Evans
688b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
689b53d7aa8SKyle Evans
690b53d7aa8SKyle Evans wmemset(__stack.__buf, L'0', __len);
691b53d7aa8SKyle Evans #undef BUF
692b53d7aa8SKyle Evans
693b53d7aa8SKyle Evans }
694b53d7aa8SKyle Evans
69509cdbf04SKyle Evans ATF_TC(wmemset_heap_after_end);
ATF_TC_HEAD(wmemset_heap_after_end,tc)69609cdbf04SKyle Evans ATF_TC_HEAD(wmemset_heap_after_end, tc)
69709cdbf04SKyle Evans {
69809cdbf04SKyle Evans }
ATF_TC_BODY(wmemset_heap_after_end,tc)699b53d7aa8SKyle Evans ATF_TC_BODY(wmemset_heap_after_end, tc)
700b53d7aa8SKyle Evans {
701b53d7aa8SKyle Evans #define BUF __stack.__buf
702b53d7aa8SKyle Evans struct {
703b53d7aa8SKyle Evans uint8_t padding_l;
704b53d7aa8SKyle Evans wchar_t * __buf;
705b53d7aa8SKyle Evans uint8_t padding_r;
706b53d7aa8SKyle Evans } __stack;
707b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
708b53d7aa8SKyle Evans const size_t __len = 42 + 1;
709b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
710b53d7aa8SKyle Evans pid_t __child;
711b53d7aa8SKyle Evans int __status;
712b53d7aa8SKyle Evans
713b53d7aa8SKyle Evans __child = fork();
714b53d7aa8SKyle Evans ATF_REQUIRE(__child >= 0);
715b53d7aa8SKyle Evans if (__child > 0)
716b53d7aa8SKyle Evans goto monitor;
717b53d7aa8SKyle Evans
718b53d7aa8SKyle Evans /* Child */
719b53d7aa8SKyle Evans disable_coredumps();
720b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
721b53d7aa8SKyle Evans
722b53d7aa8SKyle Evans wmemset(__stack.__buf, L'0', __len);
723b53d7aa8SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
724b53d7aa8SKyle Evans
725b53d7aa8SKyle Evans monitor:
726b53d7aa8SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
727b53d7aa8SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
728b53d7aa8SKyle Evans }
729b53d7aa8SKyle Evans
730b53d7aa8SKyle Evans if (!WIFSIGNALED(__status)) {
731b53d7aa8SKyle Evans switch (WEXITSTATUS(__status)) {
732b53d7aa8SKyle Evans case EX_SOFTWARE:
733b53d7aa8SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
734b53d7aa8SKyle Evans break;
735b53d7aa8SKyle Evans case EX_OSERR:
736b53d7aa8SKyle Evans atf_tc_fail("setrlimit(2) failed");
737b53d7aa8SKyle Evans break;
738b53d7aa8SKyle Evans default:
739b53d7aa8SKyle Evans atf_tc_fail("child exited with status %d",
740b53d7aa8SKyle Evans WEXITSTATUS(__status));
741b53d7aa8SKyle Evans }
742b53d7aa8SKyle Evans } else {
743b53d7aa8SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
744b53d7aa8SKyle Evans }
745b53d7aa8SKyle Evans #undef BUF
746b53d7aa8SKyle Evans
747b53d7aa8SKyle Evans }
748b53d7aa8SKyle Evans
74909cdbf04SKyle Evans ATF_TC(wcpcpy_before_end);
ATF_TC_HEAD(wcpcpy_before_end,tc)75009cdbf04SKyle Evans ATF_TC_HEAD(wcpcpy_before_end, tc)
75109cdbf04SKyle Evans {
75209cdbf04SKyle Evans }
ATF_TC_BODY(wcpcpy_before_end,tc)753b53d7aa8SKyle Evans ATF_TC_BODY(wcpcpy_before_end, tc)
754b53d7aa8SKyle Evans {
755b53d7aa8SKyle Evans #define BUF &__stack.__buf
756b53d7aa8SKyle Evans struct {
757b53d7aa8SKyle Evans uint8_t padding_l;
758b53d7aa8SKyle Evans wchar_t __buf[42];
759b53d7aa8SKyle Evans uint8_t padding_r;
760b53d7aa8SKyle Evans } __stack;
761b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
762b53d7aa8SKyle Evans const size_t __len = 42 - 1;
763b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
764b53d7aa8SKyle Evans wchar_t src[__len];
765b53d7aa8SKyle Evans
766b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
767b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
768b53d7aa8SKyle Evans src[__len - 1] = '\0';
769b53d7aa8SKyle Evans
770b53d7aa8SKyle Evans wcpcpy(__stack.__buf, src);
771b53d7aa8SKyle Evans #undef BUF
772b53d7aa8SKyle Evans
773b53d7aa8SKyle Evans }
774b53d7aa8SKyle Evans
77509cdbf04SKyle Evans ATF_TC(wcpcpy_end);
ATF_TC_HEAD(wcpcpy_end,tc)77609cdbf04SKyle Evans ATF_TC_HEAD(wcpcpy_end, tc)
77709cdbf04SKyle Evans {
77809cdbf04SKyle Evans }
ATF_TC_BODY(wcpcpy_end,tc)779b53d7aa8SKyle Evans ATF_TC_BODY(wcpcpy_end, tc)
780b53d7aa8SKyle Evans {
781b53d7aa8SKyle Evans #define BUF &__stack.__buf
782b53d7aa8SKyle Evans struct {
783b53d7aa8SKyle Evans uint8_t padding_l;
784b53d7aa8SKyle Evans wchar_t __buf[42];
785b53d7aa8SKyle Evans uint8_t padding_r;
786b53d7aa8SKyle Evans } __stack;
787b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
788b53d7aa8SKyle Evans const size_t __len = 42;
789b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
790b53d7aa8SKyle Evans wchar_t src[__len];
791b53d7aa8SKyle Evans
792b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
793b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
794b53d7aa8SKyle Evans src[__len - 1] = '\0';
795b53d7aa8SKyle Evans
796b53d7aa8SKyle Evans wcpcpy(__stack.__buf, src);
797b53d7aa8SKyle Evans #undef BUF
798b53d7aa8SKyle Evans
799b53d7aa8SKyle Evans }
800b53d7aa8SKyle Evans
80109cdbf04SKyle Evans ATF_TC(wcpcpy_heap_before_end);
ATF_TC_HEAD(wcpcpy_heap_before_end,tc)80209cdbf04SKyle Evans ATF_TC_HEAD(wcpcpy_heap_before_end, tc)
80309cdbf04SKyle Evans {
80409cdbf04SKyle Evans }
ATF_TC_BODY(wcpcpy_heap_before_end,tc)805b53d7aa8SKyle Evans ATF_TC_BODY(wcpcpy_heap_before_end, tc)
806b53d7aa8SKyle Evans {
807b53d7aa8SKyle Evans #define BUF __stack.__buf
808b53d7aa8SKyle Evans struct {
809b53d7aa8SKyle Evans uint8_t padding_l;
810b53d7aa8SKyle Evans wchar_t * __buf;
811b53d7aa8SKyle Evans uint8_t padding_r;
812b53d7aa8SKyle Evans } __stack;
813b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
814b53d7aa8SKyle Evans const size_t __len = 42 - 1;
815b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
816b53d7aa8SKyle Evans wchar_t src[__len];
817b53d7aa8SKyle Evans
818b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
819b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
820b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
821b53d7aa8SKyle Evans src[__len - 1] = '\0';
822b53d7aa8SKyle Evans
823b53d7aa8SKyle Evans wcpcpy(__stack.__buf, src);
824b53d7aa8SKyle Evans #undef BUF
825b53d7aa8SKyle Evans
826b53d7aa8SKyle Evans }
827b53d7aa8SKyle Evans
82809cdbf04SKyle Evans ATF_TC(wcpcpy_heap_end);
ATF_TC_HEAD(wcpcpy_heap_end,tc)82909cdbf04SKyle Evans ATF_TC_HEAD(wcpcpy_heap_end, tc)
83009cdbf04SKyle Evans {
83109cdbf04SKyle Evans }
ATF_TC_BODY(wcpcpy_heap_end,tc)832b53d7aa8SKyle Evans ATF_TC_BODY(wcpcpy_heap_end, tc)
833b53d7aa8SKyle Evans {
834b53d7aa8SKyle Evans #define BUF __stack.__buf
835b53d7aa8SKyle Evans struct {
836b53d7aa8SKyle Evans uint8_t padding_l;
837b53d7aa8SKyle Evans wchar_t * __buf;
838b53d7aa8SKyle Evans uint8_t padding_r;
839b53d7aa8SKyle Evans } __stack;
840b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
841b53d7aa8SKyle Evans const size_t __len = 42;
842b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
843b53d7aa8SKyle Evans wchar_t src[__len];
844b53d7aa8SKyle Evans
845b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
846b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
847b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
848b53d7aa8SKyle Evans src[__len - 1] = '\0';
849b53d7aa8SKyle Evans
850b53d7aa8SKyle Evans wcpcpy(__stack.__buf, src);
851b53d7aa8SKyle Evans #undef BUF
852b53d7aa8SKyle Evans
853b53d7aa8SKyle Evans }
854b53d7aa8SKyle Evans
85509cdbf04SKyle Evans ATF_TC(wcpcpy_heap_after_end);
ATF_TC_HEAD(wcpcpy_heap_after_end,tc)85609cdbf04SKyle Evans ATF_TC_HEAD(wcpcpy_heap_after_end, tc)
85709cdbf04SKyle Evans {
85809cdbf04SKyle Evans }
ATF_TC_BODY(wcpcpy_heap_after_end,tc)859b53d7aa8SKyle Evans ATF_TC_BODY(wcpcpy_heap_after_end, tc)
860b53d7aa8SKyle Evans {
861b53d7aa8SKyle Evans #define BUF __stack.__buf
862b53d7aa8SKyle Evans struct {
863b53d7aa8SKyle Evans uint8_t padding_l;
864b53d7aa8SKyle Evans wchar_t * __buf;
865b53d7aa8SKyle Evans uint8_t padding_r;
866b53d7aa8SKyle Evans } __stack;
867b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
868b53d7aa8SKyle Evans const size_t __len = 42 + 1;
869b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
870b53d7aa8SKyle Evans pid_t __child;
871b53d7aa8SKyle Evans int __status;
872b53d7aa8SKyle Evans wchar_t src[__len];
873b53d7aa8SKyle Evans
874b53d7aa8SKyle Evans __child = fork();
875b53d7aa8SKyle Evans ATF_REQUIRE(__child >= 0);
876b53d7aa8SKyle Evans if (__child > 0)
877b53d7aa8SKyle Evans goto monitor;
878b53d7aa8SKyle Evans
879b53d7aa8SKyle Evans /* Child */
880b53d7aa8SKyle Evans disable_coredumps();
881b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
882b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
883b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
884b53d7aa8SKyle Evans src[__len - 1] = '\0';
885b53d7aa8SKyle Evans
886b53d7aa8SKyle Evans wcpcpy(__stack.__buf, src);
887b53d7aa8SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
888b53d7aa8SKyle Evans
889b53d7aa8SKyle Evans monitor:
890b53d7aa8SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
891b53d7aa8SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
892b53d7aa8SKyle Evans }
893b53d7aa8SKyle Evans
894b53d7aa8SKyle Evans if (!WIFSIGNALED(__status)) {
895b53d7aa8SKyle Evans switch (WEXITSTATUS(__status)) {
896b53d7aa8SKyle Evans case EX_SOFTWARE:
897b53d7aa8SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
898b53d7aa8SKyle Evans break;
899b53d7aa8SKyle Evans case EX_OSERR:
900b53d7aa8SKyle Evans atf_tc_fail("setrlimit(2) failed");
901b53d7aa8SKyle Evans break;
902b53d7aa8SKyle Evans default:
903b53d7aa8SKyle Evans atf_tc_fail("child exited with status %d",
904b53d7aa8SKyle Evans WEXITSTATUS(__status));
905b53d7aa8SKyle Evans }
906b53d7aa8SKyle Evans } else {
907b53d7aa8SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
908b53d7aa8SKyle Evans }
909b53d7aa8SKyle Evans #undef BUF
910b53d7aa8SKyle Evans
911b53d7aa8SKyle Evans }
912b53d7aa8SKyle Evans
91309cdbf04SKyle Evans ATF_TC(wcpncpy_before_end);
ATF_TC_HEAD(wcpncpy_before_end,tc)91409cdbf04SKyle Evans ATF_TC_HEAD(wcpncpy_before_end, tc)
91509cdbf04SKyle Evans {
91609cdbf04SKyle Evans }
ATF_TC_BODY(wcpncpy_before_end,tc)917b53d7aa8SKyle Evans ATF_TC_BODY(wcpncpy_before_end, tc)
918b53d7aa8SKyle Evans {
919b53d7aa8SKyle Evans #define BUF &__stack.__buf
920b53d7aa8SKyle Evans struct {
921b53d7aa8SKyle Evans uint8_t padding_l;
922b53d7aa8SKyle Evans wchar_t __buf[42];
923b53d7aa8SKyle Evans uint8_t padding_r;
924b53d7aa8SKyle Evans } __stack;
925b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
926b53d7aa8SKyle Evans const size_t __len = 42 - 1;
927b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
928b53d7aa8SKyle Evans wchar_t src[__len];
929b53d7aa8SKyle Evans
930b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
931b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
932b53d7aa8SKyle Evans src[__len - 1] = '\0';
933b53d7aa8SKyle Evans
934b53d7aa8SKyle Evans wcpncpy(__stack.__buf, src, __len);
935b53d7aa8SKyle Evans #undef BUF
936b53d7aa8SKyle Evans
937b53d7aa8SKyle Evans }
938b53d7aa8SKyle Evans
93909cdbf04SKyle Evans ATF_TC(wcpncpy_end);
ATF_TC_HEAD(wcpncpy_end,tc)94009cdbf04SKyle Evans ATF_TC_HEAD(wcpncpy_end, tc)
94109cdbf04SKyle Evans {
94209cdbf04SKyle Evans }
ATF_TC_BODY(wcpncpy_end,tc)943b53d7aa8SKyle Evans ATF_TC_BODY(wcpncpy_end, tc)
944b53d7aa8SKyle Evans {
945b53d7aa8SKyle Evans #define BUF &__stack.__buf
946b53d7aa8SKyle Evans struct {
947b53d7aa8SKyle Evans uint8_t padding_l;
948b53d7aa8SKyle Evans wchar_t __buf[42];
949b53d7aa8SKyle Evans uint8_t padding_r;
950b53d7aa8SKyle Evans } __stack;
951b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
952b53d7aa8SKyle Evans const size_t __len = 42;
953b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
954b53d7aa8SKyle Evans wchar_t src[__len];
955b53d7aa8SKyle Evans
956b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
957b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
958b53d7aa8SKyle Evans src[__len - 1] = '\0';
959b53d7aa8SKyle Evans
960b53d7aa8SKyle Evans wcpncpy(__stack.__buf, src, __len);
961b53d7aa8SKyle Evans #undef BUF
962b53d7aa8SKyle Evans
963b53d7aa8SKyle Evans }
964b53d7aa8SKyle Evans
96509cdbf04SKyle Evans ATF_TC(wcpncpy_heap_before_end);
ATF_TC_HEAD(wcpncpy_heap_before_end,tc)96609cdbf04SKyle Evans ATF_TC_HEAD(wcpncpy_heap_before_end, tc)
96709cdbf04SKyle Evans {
96809cdbf04SKyle Evans }
ATF_TC_BODY(wcpncpy_heap_before_end,tc)969b53d7aa8SKyle Evans ATF_TC_BODY(wcpncpy_heap_before_end, tc)
970b53d7aa8SKyle Evans {
971b53d7aa8SKyle Evans #define BUF __stack.__buf
972b53d7aa8SKyle Evans struct {
973b53d7aa8SKyle Evans uint8_t padding_l;
974b53d7aa8SKyle Evans wchar_t * __buf;
975b53d7aa8SKyle Evans uint8_t padding_r;
976b53d7aa8SKyle Evans } __stack;
977b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
978b53d7aa8SKyle Evans const size_t __len = 42 - 1;
979b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
980b53d7aa8SKyle Evans wchar_t src[__len];
981b53d7aa8SKyle Evans
982b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
983b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
984b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
985b53d7aa8SKyle Evans src[__len - 1] = '\0';
986b53d7aa8SKyle Evans
987b53d7aa8SKyle Evans wcpncpy(__stack.__buf, src, __len);
988b53d7aa8SKyle Evans #undef BUF
989b53d7aa8SKyle Evans
990b53d7aa8SKyle Evans }
991b53d7aa8SKyle Evans
99209cdbf04SKyle Evans ATF_TC(wcpncpy_heap_end);
ATF_TC_HEAD(wcpncpy_heap_end,tc)99309cdbf04SKyle Evans ATF_TC_HEAD(wcpncpy_heap_end, tc)
99409cdbf04SKyle Evans {
99509cdbf04SKyle Evans }
ATF_TC_BODY(wcpncpy_heap_end,tc)996b53d7aa8SKyle Evans ATF_TC_BODY(wcpncpy_heap_end, tc)
997b53d7aa8SKyle Evans {
998b53d7aa8SKyle Evans #define BUF __stack.__buf
999b53d7aa8SKyle Evans struct {
1000b53d7aa8SKyle Evans uint8_t padding_l;
1001b53d7aa8SKyle Evans wchar_t * __buf;
1002b53d7aa8SKyle Evans uint8_t padding_r;
1003b53d7aa8SKyle Evans } __stack;
1004b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1005b53d7aa8SKyle Evans const size_t __len = 42;
1006b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1007b53d7aa8SKyle Evans wchar_t src[__len];
1008b53d7aa8SKyle Evans
1009b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
1010b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1011b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1012b53d7aa8SKyle Evans src[__len - 1] = '\0';
1013b53d7aa8SKyle Evans
1014b53d7aa8SKyle Evans wcpncpy(__stack.__buf, src, __len);
1015b53d7aa8SKyle Evans #undef BUF
1016b53d7aa8SKyle Evans
1017b53d7aa8SKyle Evans }
1018b53d7aa8SKyle Evans
101909cdbf04SKyle Evans ATF_TC(wcpncpy_heap_after_end);
ATF_TC_HEAD(wcpncpy_heap_after_end,tc)102009cdbf04SKyle Evans ATF_TC_HEAD(wcpncpy_heap_after_end, tc)
102109cdbf04SKyle Evans {
102209cdbf04SKyle Evans }
ATF_TC_BODY(wcpncpy_heap_after_end,tc)1023b53d7aa8SKyle Evans ATF_TC_BODY(wcpncpy_heap_after_end, tc)
1024b53d7aa8SKyle Evans {
1025b53d7aa8SKyle Evans #define BUF __stack.__buf
1026b53d7aa8SKyle Evans struct {
1027b53d7aa8SKyle Evans uint8_t padding_l;
1028b53d7aa8SKyle Evans wchar_t * __buf;
1029b53d7aa8SKyle Evans uint8_t padding_r;
1030b53d7aa8SKyle Evans } __stack;
1031b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1032b53d7aa8SKyle Evans const size_t __len = 42 + 1;
1033b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1034b53d7aa8SKyle Evans pid_t __child;
1035b53d7aa8SKyle Evans int __status;
1036b53d7aa8SKyle Evans wchar_t src[__len];
1037b53d7aa8SKyle Evans
1038b53d7aa8SKyle Evans __child = fork();
1039b53d7aa8SKyle Evans ATF_REQUIRE(__child >= 0);
1040b53d7aa8SKyle Evans if (__child > 0)
1041b53d7aa8SKyle Evans goto monitor;
1042b53d7aa8SKyle Evans
1043b53d7aa8SKyle Evans /* Child */
1044b53d7aa8SKyle Evans disable_coredumps();
1045b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
1046b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1047b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1048b53d7aa8SKyle Evans src[__len - 1] = '\0';
1049b53d7aa8SKyle Evans
1050b53d7aa8SKyle Evans wcpncpy(__stack.__buf, src, __len);
1051b53d7aa8SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
1052b53d7aa8SKyle Evans
1053b53d7aa8SKyle Evans monitor:
1054b53d7aa8SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
1055b53d7aa8SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
1056b53d7aa8SKyle Evans }
1057b53d7aa8SKyle Evans
1058b53d7aa8SKyle Evans if (!WIFSIGNALED(__status)) {
1059b53d7aa8SKyle Evans switch (WEXITSTATUS(__status)) {
1060b53d7aa8SKyle Evans case EX_SOFTWARE:
1061b53d7aa8SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
1062b53d7aa8SKyle Evans break;
1063b53d7aa8SKyle Evans case EX_OSERR:
1064b53d7aa8SKyle Evans atf_tc_fail("setrlimit(2) failed");
1065b53d7aa8SKyle Evans break;
1066b53d7aa8SKyle Evans default:
1067b53d7aa8SKyle Evans atf_tc_fail("child exited with status %d",
1068b53d7aa8SKyle Evans WEXITSTATUS(__status));
1069b53d7aa8SKyle Evans }
1070b53d7aa8SKyle Evans } else {
1071b53d7aa8SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
1072b53d7aa8SKyle Evans }
1073b53d7aa8SKyle Evans #undef BUF
1074b53d7aa8SKyle Evans
1075b53d7aa8SKyle Evans }
1076b53d7aa8SKyle Evans
107709cdbf04SKyle Evans ATF_TC(wcscat_before_end);
ATF_TC_HEAD(wcscat_before_end,tc)107809cdbf04SKyle Evans ATF_TC_HEAD(wcscat_before_end, tc)
107909cdbf04SKyle Evans {
108009cdbf04SKyle Evans }
ATF_TC_BODY(wcscat_before_end,tc)1081b53d7aa8SKyle Evans ATF_TC_BODY(wcscat_before_end, tc)
1082b53d7aa8SKyle Evans {
1083b53d7aa8SKyle Evans #define BUF &__stack.__buf
1084b53d7aa8SKyle Evans struct {
1085b53d7aa8SKyle Evans uint8_t padding_l;
1086b53d7aa8SKyle Evans wchar_t __buf[42];
1087b53d7aa8SKyle Evans uint8_t padding_r;
1088b53d7aa8SKyle Evans } __stack;
1089b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1090b53d7aa8SKyle Evans const size_t __len = 42 - 1;
1091b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1092b53d7aa8SKyle Evans wchar_t src[__len];
1093b53d7aa8SKyle Evans
1094b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1095b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1096b53d7aa8SKyle Evans src[__len - 1] = '\0';
1097b53d7aa8SKyle Evans
1098b53d7aa8SKyle Evans wcscat(__stack.__buf, src);
1099b53d7aa8SKyle Evans #undef BUF
1100b53d7aa8SKyle Evans
1101b53d7aa8SKyle Evans }
1102b53d7aa8SKyle Evans
110309cdbf04SKyle Evans ATF_TC(wcscat_end);
ATF_TC_HEAD(wcscat_end,tc)110409cdbf04SKyle Evans ATF_TC_HEAD(wcscat_end, tc)
110509cdbf04SKyle Evans {
110609cdbf04SKyle Evans }
ATF_TC_BODY(wcscat_end,tc)1107b53d7aa8SKyle Evans ATF_TC_BODY(wcscat_end, tc)
1108b53d7aa8SKyle Evans {
1109b53d7aa8SKyle Evans #define BUF &__stack.__buf
1110b53d7aa8SKyle Evans struct {
1111b53d7aa8SKyle Evans uint8_t padding_l;
1112b53d7aa8SKyle Evans wchar_t __buf[42];
1113b53d7aa8SKyle Evans uint8_t padding_r;
1114b53d7aa8SKyle Evans } __stack;
1115b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1116b53d7aa8SKyle Evans const size_t __len = 42;
1117b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1118b53d7aa8SKyle Evans wchar_t src[__len];
1119b53d7aa8SKyle Evans
1120b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1121b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1122b53d7aa8SKyle Evans src[__len - 1] = '\0';
1123b53d7aa8SKyle Evans
1124b53d7aa8SKyle Evans wcscat(__stack.__buf, src);
1125b53d7aa8SKyle Evans #undef BUF
1126b53d7aa8SKyle Evans
1127b53d7aa8SKyle Evans }
1128b53d7aa8SKyle Evans
112909cdbf04SKyle Evans ATF_TC(wcscat_heap_before_end);
ATF_TC_HEAD(wcscat_heap_before_end,tc)113009cdbf04SKyle Evans ATF_TC_HEAD(wcscat_heap_before_end, tc)
113109cdbf04SKyle Evans {
113209cdbf04SKyle Evans }
ATF_TC_BODY(wcscat_heap_before_end,tc)1133b53d7aa8SKyle Evans ATF_TC_BODY(wcscat_heap_before_end, tc)
1134b53d7aa8SKyle Evans {
1135b53d7aa8SKyle Evans #define BUF __stack.__buf
1136b53d7aa8SKyle Evans struct {
1137b53d7aa8SKyle Evans uint8_t padding_l;
1138b53d7aa8SKyle Evans wchar_t * __buf;
1139b53d7aa8SKyle Evans uint8_t padding_r;
1140b53d7aa8SKyle Evans } __stack;
1141b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1142b53d7aa8SKyle Evans const size_t __len = 42 - 1;
1143b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1144b53d7aa8SKyle Evans wchar_t src[__len];
1145b53d7aa8SKyle Evans
1146b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
1147b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1148b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1149b53d7aa8SKyle Evans src[__len - 1] = '\0';
1150b53d7aa8SKyle Evans
1151b53d7aa8SKyle Evans wcscat(__stack.__buf, src);
1152b53d7aa8SKyle Evans #undef BUF
1153b53d7aa8SKyle Evans
1154b53d7aa8SKyle Evans }
1155b53d7aa8SKyle Evans
115609cdbf04SKyle Evans ATF_TC(wcscat_heap_end);
ATF_TC_HEAD(wcscat_heap_end,tc)115709cdbf04SKyle Evans ATF_TC_HEAD(wcscat_heap_end, tc)
115809cdbf04SKyle Evans {
115909cdbf04SKyle Evans }
ATF_TC_BODY(wcscat_heap_end,tc)1160b53d7aa8SKyle Evans ATF_TC_BODY(wcscat_heap_end, tc)
1161b53d7aa8SKyle Evans {
1162b53d7aa8SKyle Evans #define BUF __stack.__buf
1163b53d7aa8SKyle Evans struct {
1164b53d7aa8SKyle Evans uint8_t padding_l;
1165b53d7aa8SKyle Evans wchar_t * __buf;
1166b53d7aa8SKyle Evans uint8_t padding_r;
1167b53d7aa8SKyle Evans } __stack;
1168b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1169b53d7aa8SKyle Evans const size_t __len = 42;
1170b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1171b53d7aa8SKyle Evans wchar_t src[__len];
1172b53d7aa8SKyle Evans
1173b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
1174b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1175b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1176b53d7aa8SKyle Evans src[__len - 1] = '\0';
1177b53d7aa8SKyle Evans
1178b53d7aa8SKyle Evans wcscat(__stack.__buf, src);
1179b53d7aa8SKyle Evans #undef BUF
1180b53d7aa8SKyle Evans
1181b53d7aa8SKyle Evans }
1182b53d7aa8SKyle Evans
118309cdbf04SKyle Evans ATF_TC(wcscat_heap_after_end);
ATF_TC_HEAD(wcscat_heap_after_end,tc)118409cdbf04SKyle Evans ATF_TC_HEAD(wcscat_heap_after_end, tc)
118509cdbf04SKyle Evans {
118609cdbf04SKyle Evans }
ATF_TC_BODY(wcscat_heap_after_end,tc)1187b53d7aa8SKyle Evans ATF_TC_BODY(wcscat_heap_after_end, tc)
1188b53d7aa8SKyle Evans {
1189b53d7aa8SKyle Evans #define BUF __stack.__buf
1190b53d7aa8SKyle Evans struct {
1191b53d7aa8SKyle Evans uint8_t padding_l;
1192b53d7aa8SKyle Evans wchar_t * __buf;
1193b53d7aa8SKyle Evans uint8_t padding_r;
1194b53d7aa8SKyle Evans } __stack;
1195b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1196b53d7aa8SKyle Evans const size_t __len = 42 + 1;
1197b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1198b53d7aa8SKyle Evans pid_t __child;
1199b53d7aa8SKyle Evans int __status;
1200b53d7aa8SKyle Evans wchar_t src[__len];
1201b53d7aa8SKyle Evans
1202b53d7aa8SKyle Evans __child = fork();
1203b53d7aa8SKyle Evans ATF_REQUIRE(__child >= 0);
1204b53d7aa8SKyle Evans if (__child > 0)
1205b53d7aa8SKyle Evans goto monitor;
1206b53d7aa8SKyle Evans
1207b53d7aa8SKyle Evans /* Child */
1208b53d7aa8SKyle Evans disable_coredumps();
1209b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
1210b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1211b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1212b53d7aa8SKyle Evans src[__len - 1] = '\0';
1213b53d7aa8SKyle Evans
1214b53d7aa8SKyle Evans wcscat(__stack.__buf, src);
1215b53d7aa8SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
1216b53d7aa8SKyle Evans
1217b53d7aa8SKyle Evans monitor:
1218b53d7aa8SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
1219b53d7aa8SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
1220b53d7aa8SKyle Evans }
1221b53d7aa8SKyle Evans
1222b53d7aa8SKyle Evans if (!WIFSIGNALED(__status)) {
1223b53d7aa8SKyle Evans switch (WEXITSTATUS(__status)) {
1224b53d7aa8SKyle Evans case EX_SOFTWARE:
1225b53d7aa8SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
1226b53d7aa8SKyle Evans break;
1227b53d7aa8SKyle Evans case EX_OSERR:
1228b53d7aa8SKyle Evans atf_tc_fail("setrlimit(2) failed");
1229b53d7aa8SKyle Evans break;
1230b53d7aa8SKyle Evans default:
1231b53d7aa8SKyle Evans atf_tc_fail("child exited with status %d",
1232b53d7aa8SKyle Evans WEXITSTATUS(__status));
1233b53d7aa8SKyle Evans }
1234b53d7aa8SKyle Evans } else {
1235b53d7aa8SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
1236b53d7aa8SKyle Evans }
1237b53d7aa8SKyle Evans #undef BUF
1238b53d7aa8SKyle Evans
1239b53d7aa8SKyle Evans }
1240b53d7aa8SKyle Evans
124109cdbf04SKyle Evans ATF_TC(wcslcat_before_end);
ATF_TC_HEAD(wcslcat_before_end,tc)124209cdbf04SKyle Evans ATF_TC_HEAD(wcslcat_before_end, tc)
124309cdbf04SKyle Evans {
124409cdbf04SKyle Evans }
ATF_TC_BODY(wcslcat_before_end,tc)1245b53d7aa8SKyle Evans ATF_TC_BODY(wcslcat_before_end, tc)
1246b53d7aa8SKyle Evans {
1247b53d7aa8SKyle Evans #define BUF &__stack.__buf
1248b53d7aa8SKyle Evans struct {
1249b53d7aa8SKyle Evans uint8_t padding_l;
1250b53d7aa8SKyle Evans wchar_t __buf[42];
1251b53d7aa8SKyle Evans uint8_t padding_r;
1252b53d7aa8SKyle Evans } __stack;
1253b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1254b53d7aa8SKyle Evans const size_t __len = 42 - 1;
1255b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1256b53d7aa8SKyle Evans wchar_t src[__len];
1257b53d7aa8SKyle Evans
1258b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1259b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1260b53d7aa8SKyle Evans src[__len - 1] = '\0';
1261b53d7aa8SKyle Evans
1262b53d7aa8SKyle Evans wcslcat(__stack.__buf, src, __len);
1263b53d7aa8SKyle Evans #undef BUF
1264b53d7aa8SKyle Evans
1265b53d7aa8SKyle Evans }
1266b53d7aa8SKyle Evans
126709cdbf04SKyle Evans ATF_TC(wcslcat_end);
ATF_TC_HEAD(wcslcat_end,tc)126809cdbf04SKyle Evans ATF_TC_HEAD(wcslcat_end, tc)
126909cdbf04SKyle Evans {
127009cdbf04SKyle Evans }
ATF_TC_BODY(wcslcat_end,tc)1271b53d7aa8SKyle Evans ATF_TC_BODY(wcslcat_end, tc)
1272b53d7aa8SKyle Evans {
1273b53d7aa8SKyle Evans #define BUF &__stack.__buf
1274b53d7aa8SKyle Evans struct {
1275b53d7aa8SKyle Evans uint8_t padding_l;
1276b53d7aa8SKyle Evans wchar_t __buf[42];
1277b53d7aa8SKyle Evans uint8_t padding_r;
1278b53d7aa8SKyle Evans } __stack;
1279b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1280b53d7aa8SKyle Evans const size_t __len = 42;
1281b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1282b53d7aa8SKyle Evans wchar_t src[__len];
1283b53d7aa8SKyle Evans
1284b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1285b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1286b53d7aa8SKyle Evans src[__len - 1] = '\0';
1287b53d7aa8SKyle Evans
1288b53d7aa8SKyle Evans wcslcat(__stack.__buf, src, __len);
1289b53d7aa8SKyle Evans #undef BUF
1290b53d7aa8SKyle Evans
1291b53d7aa8SKyle Evans }
1292b53d7aa8SKyle Evans
129309cdbf04SKyle Evans ATF_TC(wcslcat_heap_before_end);
ATF_TC_HEAD(wcslcat_heap_before_end,tc)129409cdbf04SKyle Evans ATF_TC_HEAD(wcslcat_heap_before_end, tc)
129509cdbf04SKyle Evans {
129609cdbf04SKyle Evans }
ATF_TC_BODY(wcslcat_heap_before_end,tc)1297b53d7aa8SKyle Evans ATF_TC_BODY(wcslcat_heap_before_end, tc)
1298b53d7aa8SKyle Evans {
1299b53d7aa8SKyle Evans #define BUF __stack.__buf
1300b53d7aa8SKyle Evans struct {
1301b53d7aa8SKyle Evans uint8_t padding_l;
1302b53d7aa8SKyle Evans wchar_t * __buf;
1303b53d7aa8SKyle Evans uint8_t padding_r;
1304b53d7aa8SKyle Evans } __stack;
1305b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1306b53d7aa8SKyle Evans const size_t __len = 42 - 1;
1307b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1308b53d7aa8SKyle Evans wchar_t src[__len];
1309b53d7aa8SKyle Evans
1310b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
1311b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1312b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1313b53d7aa8SKyle Evans src[__len - 1] = '\0';
1314b53d7aa8SKyle Evans
1315b53d7aa8SKyle Evans wcslcat(__stack.__buf, src, __len);
1316b53d7aa8SKyle Evans #undef BUF
1317b53d7aa8SKyle Evans
1318b53d7aa8SKyle Evans }
1319b53d7aa8SKyle Evans
132009cdbf04SKyle Evans ATF_TC(wcslcat_heap_end);
ATF_TC_HEAD(wcslcat_heap_end,tc)132109cdbf04SKyle Evans ATF_TC_HEAD(wcslcat_heap_end, tc)
132209cdbf04SKyle Evans {
132309cdbf04SKyle Evans }
ATF_TC_BODY(wcslcat_heap_end,tc)1324b53d7aa8SKyle Evans ATF_TC_BODY(wcslcat_heap_end, tc)
1325b53d7aa8SKyle Evans {
1326b53d7aa8SKyle Evans #define BUF __stack.__buf
1327b53d7aa8SKyle Evans struct {
1328b53d7aa8SKyle Evans uint8_t padding_l;
1329b53d7aa8SKyle Evans wchar_t * __buf;
1330b53d7aa8SKyle Evans uint8_t padding_r;
1331b53d7aa8SKyle Evans } __stack;
1332b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1333b53d7aa8SKyle Evans const size_t __len = 42;
1334b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1335b53d7aa8SKyle Evans wchar_t src[__len];
1336b53d7aa8SKyle Evans
1337b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
1338b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1339b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1340b53d7aa8SKyle Evans src[__len - 1] = '\0';
1341b53d7aa8SKyle Evans
1342b53d7aa8SKyle Evans wcslcat(__stack.__buf, src, __len);
1343b53d7aa8SKyle Evans #undef BUF
1344b53d7aa8SKyle Evans
1345b53d7aa8SKyle Evans }
1346b53d7aa8SKyle Evans
134709cdbf04SKyle Evans ATF_TC(wcslcat_heap_after_end);
ATF_TC_HEAD(wcslcat_heap_after_end,tc)134809cdbf04SKyle Evans ATF_TC_HEAD(wcslcat_heap_after_end, tc)
134909cdbf04SKyle Evans {
135009cdbf04SKyle Evans }
ATF_TC_BODY(wcslcat_heap_after_end,tc)1351b53d7aa8SKyle Evans ATF_TC_BODY(wcslcat_heap_after_end, tc)
1352b53d7aa8SKyle Evans {
1353b53d7aa8SKyle Evans #define BUF __stack.__buf
1354b53d7aa8SKyle Evans struct {
1355b53d7aa8SKyle Evans uint8_t padding_l;
1356b53d7aa8SKyle Evans wchar_t * __buf;
1357b53d7aa8SKyle Evans uint8_t padding_r;
1358b53d7aa8SKyle Evans } __stack;
1359b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1360b53d7aa8SKyle Evans const size_t __len = 42 + 1;
1361b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1362b53d7aa8SKyle Evans pid_t __child;
1363b53d7aa8SKyle Evans int __status;
1364b53d7aa8SKyle Evans wchar_t src[__len];
1365b53d7aa8SKyle Evans
1366b53d7aa8SKyle Evans __child = fork();
1367b53d7aa8SKyle Evans ATF_REQUIRE(__child >= 0);
1368b53d7aa8SKyle Evans if (__child > 0)
1369b53d7aa8SKyle Evans goto monitor;
1370b53d7aa8SKyle Evans
1371b53d7aa8SKyle Evans /* Child */
1372b53d7aa8SKyle Evans disable_coredumps();
1373b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
1374b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1375b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1376b53d7aa8SKyle Evans src[__len - 1] = '\0';
1377b53d7aa8SKyle Evans
1378b53d7aa8SKyle Evans wcslcat(__stack.__buf, src, __len);
1379b53d7aa8SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
1380b53d7aa8SKyle Evans
1381b53d7aa8SKyle Evans monitor:
1382b53d7aa8SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
1383b53d7aa8SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
1384b53d7aa8SKyle Evans }
1385b53d7aa8SKyle Evans
1386b53d7aa8SKyle Evans if (!WIFSIGNALED(__status)) {
1387b53d7aa8SKyle Evans switch (WEXITSTATUS(__status)) {
1388b53d7aa8SKyle Evans case EX_SOFTWARE:
1389b53d7aa8SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
1390b53d7aa8SKyle Evans break;
1391b53d7aa8SKyle Evans case EX_OSERR:
1392b53d7aa8SKyle Evans atf_tc_fail("setrlimit(2) failed");
1393b53d7aa8SKyle Evans break;
1394b53d7aa8SKyle Evans default:
1395b53d7aa8SKyle Evans atf_tc_fail("child exited with status %d",
1396b53d7aa8SKyle Evans WEXITSTATUS(__status));
1397b53d7aa8SKyle Evans }
1398b53d7aa8SKyle Evans } else {
1399b53d7aa8SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
1400b53d7aa8SKyle Evans }
1401b53d7aa8SKyle Evans #undef BUF
1402b53d7aa8SKyle Evans
1403b53d7aa8SKyle Evans }
1404b53d7aa8SKyle Evans
140509cdbf04SKyle Evans ATF_TC(wcsncat_before_end);
ATF_TC_HEAD(wcsncat_before_end,tc)140609cdbf04SKyle Evans ATF_TC_HEAD(wcsncat_before_end, tc)
140709cdbf04SKyle Evans {
140809cdbf04SKyle Evans }
ATF_TC_BODY(wcsncat_before_end,tc)1409b53d7aa8SKyle Evans ATF_TC_BODY(wcsncat_before_end, tc)
1410b53d7aa8SKyle Evans {
1411b53d7aa8SKyle Evans #define BUF &__stack.__buf
1412b53d7aa8SKyle Evans struct {
1413b53d7aa8SKyle Evans uint8_t padding_l;
1414b53d7aa8SKyle Evans wchar_t __buf[42];
1415b53d7aa8SKyle Evans uint8_t padding_r;
1416b53d7aa8SKyle Evans } __stack;
1417b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1418b53d7aa8SKyle Evans const size_t __len = 42 - 1;
1419b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1420b53d7aa8SKyle Evans wchar_t src[__len];
1421b53d7aa8SKyle Evans
1422b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1423b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1424b53d7aa8SKyle Evans src[__len - 1] = '\0';
1425b53d7aa8SKyle Evans
1426b53d7aa8SKyle Evans wcsncat(__stack.__buf, src, __len);
1427b53d7aa8SKyle Evans #undef BUF
1428b53d7aa8SKyle Evans
1429b53d7aa8SKyle Evans }
1430b53d7aa8SKyle Evans
143109cdbf04SKyle Evans ATF_TC(wcsncat_end);
ATF_TC_HEAD(wcsncat_end,tc)143209cdbf04SKyle Evans ATF_TC_HEAD(wcsncat_end, tc)
143309cdbf04SKyle Evans {
143409cdbf04SKyle Evans }
ATF_TC_BODY(wcsncat_end,tc)1435b53d7aa8SKyle Evans ATF_TC_BODY(wcsncat_end, tc)
1436b53d7aa8SKyle Evans {
1437b53d7aa8SKyle Evans #define BUF &__stack.__buf
1438b53d7aa8SKyle Evans struct {
1439b53d7aa8SKyle Evans uint8_t padding_l;
1440b53d7aa8SKyle Evans wchar_t __buf[42];
1441b53d7aa8SKyle Evans uint8_t padding_r;
1442b53d7aa8SKyle Evans } __stack;
1443b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1444b53d7aa8SKyle Evans const size_t __len = 42;
1445b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1446b53d7aa8SKyle Evans wchar_t src[__len];
1447b53d7aa8SKyle Evans
1448b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1449b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1450b53d7aa8SKyle Evans src[__len - 1] = '\0';
1451b53d7aa8SKyle Evans
1452b53d7aa8SKyle Evans wcsncat(__stack.__buf, src, __len);
1453b53d7aa8SKyle Evans #undef BUF
1454b53d7aa8SKyle Evans
1455b53d7aa8SKyle Evans }
1456b53d7aa8SKyle Evans
145709cdbf04SKyle Evans ATF_TC(wcsncat_heap_before_end);
ATF_TC_HEAD(wcsncat_heap_before_end,tc)145809cdbf04SKyle Evans ATF_TC_HEAD(wcsncat_heap_before_end, tc)
145909cdbf04SKyle Evans {
146009cdbf04SKyle Evans }
ATF_TC_BODY(wcsncat_heap_before_end,tc)1461b53d7aa8SKyle Evans ATF_TC_BODY(wcsncat_heap_before_end, tc)
1462b53d7aa8SKyle Evans {
1463b53d7aa8SKyle Evans #define BUF __stack.__buf
1464b53d7aa8SKyle Evans struct {
1465b53d7aa8SKyle Evans uint8_t padding_l;
1466b53d7aa8SKyle Evans wchar_t * __buf;
1467b53d7aa8SKyle Evans uint8_t padding_r;
1468b53d7aa8SKyle Evans } __stack;
1469b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1470b53d7aa8SKyle Evans const size_t __len = 42 - 1;
1471b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1472b53d7aa8SKyle Evans wchar_t src[__len];
1473b53d7aa8SKyle Evans
1474b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
1475b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1476b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1477b53d7aa8SKyle Evans src[__len - 1] = '\0';
1478b53d7aa8SKyle Evans
1479b53d7aa8SKyle Evans wcsncat(__stack.__buf, src, __len);
1480b53d7aa8SKyle Evans #undef BUF
1481b53d7aa8SKyle Evans
1482b53d7aa8SKyle Evans }
1483b53d7aa8SKyle Evans
148409cdbf04SKyle Evans ATF_TC(wcsncat_heap_end);
ATF_TC_HEAD(wcsncat_heap_end,tc)148509cdbf04SKyle Evans ATF_TC_HEAD(wcsncat_heap_end, tc)
148609cdbf04SKyle Evans {
148709cdbf04SKyle Evans }
ATF_TC_BODY(wcsncat_heap_end,tc)1488b53d7aa8SKyle Evans ATF_TC_BODY(wcsncat_heap_end, tc)
1489b53d7aa8SKyle Evans {
1490b53d7aa8SKyle Evans #define BUF __stack.__buf
1491b53d7aa8SKyle Evans struct {
1492b53d7aa8SKyle Evans uint8_t padding_l;
1493b53d7aa8SKyle Evans wchar_t * __buf;
1494b53d7aa8SKyle Evans uint8_t padding_r;
1495b53d7aa8SKyle Evans } __stack;
1496b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1497b53d7aa8SKyle Evans const size_t __len = 42;
1498b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1499b53d7aa8SKyle Evans wchar_t src[__len];
1500b53d7aa8SKyle Evans
1501b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
1502b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1503b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1504b53d7aa8SKyle Evans src[__len - 1] = '\0';
1505b53d7aa8SKyle Evans
1506b53d7aa8SKyle Evans wcsncat(__stack.__buf, src, __len);
1507b53d7aa8SKyle Evans #undef BUF
1508b53d7aa8SKyle Evans
1509b53d7aa8SKyle Evans }
1510b53d7aa8SKyle Evans
151109cdbf04SKyle Evans ATF_TC(wcsncat_heap_after_end);
ATF_TC_HEAD(wcsncat_heap_after_end,tc)151209cdbf04SKyle Evans ATF_TC_HEAD(wcsncat_heap_after_end, tc)
151309cdbf04SKyle Evans {
151409cdbf04SKyle Evans }
ATF_TC_BODY(wcsncat_heap_after_end,tc)1515b53d7aa8SKyle Evans ATF_TC_BODY(wcsncat_heap_after_end, tc)
1516b53d7aa8SKyle Evans {
1517b53d7aa8SKyle Evans #define BUF __stack.__buf
1518b53d7aa8SKyle Evans struct {
1519b53d7aa8SKyle Evans uint8_t padding_l;
1520b53d7aa8SKyle Evans wchar_t * __buf;
1521b53d7aa8SKyle Evans uint8_t padding_r;
1522b53d7aa8SKyle Evans } __stack;
1523b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1524b53d7aa8SKyle Evans const size_t __len = 42 + 1;
1525b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1526b53d7aa8SKyle Evans pid_t __child;
1527b53d7aa8SKyle Evans int __status;
1528b53d7aa8SKyle Evans wchar_t src[__len];
1529b53d7aa8SKyle Evans
1530b53d7aa8SKyle Evans __child = fork();
1531b53d7aa8SKyle Evans ATF_REQUIRE(__child >= 0);
1532b53d7aa8SKyle Evans if (__child > 0)
1533b53d7aa8SKyle Evans goto monitor;
1534b53d7aa8SKyle Evans
1535b53d7aa8SKyle Evans /* Child */
1536b53d7aa8SKyle Evans disable_coredumps();
1537b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
1538b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1539b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1540b53d7aa8SKyle Evans src[__len - 1] = '\0';
1541b53d7aa8SKyle Evans
1542b53d7aa8SKyle Evans wcsncat(__stack.__buf, src, __len);
1543b53d7aa8SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
1544b53d7aa8SKyle Evans
1545b53d7aa8SKyle Evans monitor:
1546b53d7aa8SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
1547b53d7aa8SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
1548b53d7aa8SKyle Evans }
1549b53d7aa8SKyle Evans
1550b53d7aa8SKyle Evans if (!WIFSIGNALED(__status)) {
1551b53d7aa8SKyle Evans switch (WEXITSTATUS(__status)) {
1552b53d7aa8SKyle Evans case EX_SOFTWARE:
1553b53d7aa8SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
1554b53d7aa8SKyle Evans break;
1555b53d7aa8SKyle Evans case EX_OSERR:
1556b53d7aa8SKyle Evans atf_tc_fail("setrlimit(2) failed");
1557b53d7aa8SKyle Evans break;
1558b53d7aa8SKyle Evans default:
1559b53d7aa8SKyle Evans atf_tc_fail("child exited with status %d",
1560b53d7aa8SKyle Evans WEXITSTATUS(__status));
1561b53d7aa8SKyle Evans }
1562b53d7aa8SKyle Evans } else {
1563b53d7aa8SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
1564b53d7aa8SKyle Evans }
1565b53d7aa8SKyle Evans #undef BUF
1566b53d7aa8SKyle Evans
1567b53d7aa8SKyle Evans }
1568b53d7aa8SKyle Evans
156909cdbf04SKyle Evans ATF_TC(wcscpy_before_end);
ATF_TC_HEAD(wcscpy_before_end,tc)157009cdbf04SKyle Evans ATF_TC_HEAD(wcscpy_before_end, tc)
157109cdbf04SKyle Evans {
157209cdbf04SKyle Evans }
ATF_TC_BODY(wcscpy_before_end,tc)1573b53d7aa8SKyle Evans ATF_TC_BODY(wcscpy_before_end, tc)
1574b53d7aa8SKyle Evans {
1575b53d7aa8SKyle Evans #define BUF &__stack.__buf
1576b53d7aa8SKyle Evans struct {
1577b53d7aa8SKyle Evans uint8_t padding_l;
1578b53d7aa8SKyle Evans wchar_t __buf[42];
1579b53d7aa8SKyle Evans uint8_t padding_r;
1580b53d7aa8SKyle Evans } __stack;
1581b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1582b53d7aa8SKyle Evans const size_t __len = 42 - 1;
1583b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1584b53d7aa8SKyle Evans wchar_t src[__len];
1585b53d7aa8SKyle Evans
1586b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1587b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1588b53d7aa8SKyle Evans src[__len - 1] = '\0';
1589b53d7aa8SKyle Evans
1590b53d7aa8SKyle Evans wcscpy(__stack.__buf, src);
1591b53d7aa8SKyle Evans #undef BUF
1592b53d7aa8SKyle Evans
1593b53d7aa8SKyle Evans }
1594b53d7aa8SKyle Evans
159509cdbf04SKyle Evans ATF_TC(wcscpy_end);
ATF_TC_HEAD(wcscpy_end,tc)159609cdbf04SKyle Evans ATF_TC_HEAD(wcscpy_end, tc)
159709cdbf04SKyle Evans {
159809cdbf04SKyle Evans }
ATF_TC_BODY(wcscpy_end,tc)1599b53d7aa8SKyle Evans ATF_TC_BODY(wcscpy_end, tc)
1600b53d7aa8SKyle Evans {
1601b53d7aa8SKyle Evans #define BUF &__stack.__buf
1602b53d7aa8SKyle Evans struct {
1603b53d7aa8SKyle Evans uint8_t padding_l;
1604b53d7aa8SKyle Evans wchar_t __buf[42];
1605b53d7aa8SKyle Evans uint8_t padding_r;
1606b53d7aa8SKyle Evans } __stack;
1607b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1608b53d7aa8SKyle Evans const size_t __len = 42;
1609b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1610b53d7aa8SKyle Evans wchar_t src[__len];
1611b53d7aa8SKyle Evans
1612b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1613b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1614b53d7aa8SKyle Evans src[__len - 1] = '\0';
1615b53d7aa8SKyle Evans
1616b53d7aa8SKyle Evans wcscpy(__stack.__buf, src);
1617b53d7aa8SKyle Evans #undef BUF
1618b53d7aa8SKyle Evans
1619b53d7aa8SKyle Evans }
1620b53d7aa8SKyle Evans
162109cdbf04SKyle Evans ATF_TC(wcscpy_heap_before_end);
ATF_TC_HEAD(wcscpy_heap_before_end,tc)162209cdbf04SKyle Evans ATF_TC_HEAD(wcscpy_heap_before_end, tc)
162309cdbf04SKyle Evans {
162409cdbf04SKyle Evans }
ATF_TC_BODY(wcscpy_heap_before_end,tc)1625b53d7aa8SKyle Evans ATF_TC_BODY(wcscpy_heap_before_end, tc)
1626b53d7aa8SKyle Evans {
1627b53d7aa8SKyle Evans #define BUF __stack.__buf
1628b53d7aa8SKyle Evans struct {
1629b53d7aa8SKyle Evans uint8_t padding_l;
1630b53d7aa8SKyle Evans wchar_t * __buf;
1631b53d7aa8SKyle Evans uint8_t padding_r;
1632b53d7aa8SKyle Evans } __stack;
1633b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1634b53d7aa8SKyle Evans const size_t __len = 42 - 1;
1635b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1636b53d7aa8SKyle Evans wchar_t src[__len];
1637b53d7aa8SKyle Evans
1638b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
1639b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1640b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1641b53d7aa8SKyle Evans src[__len - 1] = '\0';
1642b53d7aa8SKyle Evans
1643b53d7aa8SKyle Evans wcscpy(__stack.__buf, src);
1644b53d7aa8SKyle Evans #undef BUF
1645b53d7aa8SKyle Evans
1646b53d7aa8SKyle Evans }
1647b53d7aa8SKyle Evans
164809cdbf04SKyle Evans ATF_TC(wcscpy_heap_end);
ATF_TC_HEAD(wcscpy_heap_end,tc)164909cdbf04SKyle Evans ATF_TC_HEAD(wcscpy_heap_end, tc)
165009cdbf04SKyle Evans {
165109cdbf04SKyle Evans }
ATF_TC_BODY(wcscpy_heap_end,tc)1652b53d7aa8SKyle Evans ATF_TC_BODY(wcscpy_heap_end, tc)
1653b53d7aa8SKyle Evans {
1654b53d7aa8SKyle Evans #define BUF __stack.__buf
1655b53d7aa8SKyle Evans struct {
1656b53d7aa8SKyle Evans uint8_t padding_l;
1657b53d7aa8SKyle Evans wchar_t * __buf;
1658b53d7aa8SKyle Evans uint8_t padding_r;
1659b53d7aa8SKyle Evans } __stack;
1660b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1661b53d7aa8SKyle Evans const size_t __len = 42;
1662b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1663b53d7aa8SKyle Evans wchar_t src[__len];
1664b53d7aa8SKyle Evans
1665b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
1666b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1667b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1668b53d7aa8SKyle Evans src[__len - 1] = '\0';
1669b53d7aa8SKyle Evans
1670b53d7aa8SKyle Evans wcscpy(__stack.__buf, src);
1671b53d7aa8SKyle Evans #undef BUF
1672b53d7aa8SKyle Evans
1673b53d7aa8SKyle Evans }
1674b53d7aa8SKyle Evans
167509cdbf04SKyle Evans ATF_TC(wcscpy_heap_after_end);
ATF_TC_HEAD(wcscpy_heap_after_end,tc)167609cdbf04SKyle Evans ATF_TC_HEAD(wcscpy_heap_after_end, tc)
167709cdbf04SKyle Evans {
167809cdbf04SKyle Evans }
ATF_TC_BODY(wcscpy_heap_after_end,tc)1679b53d7aa8SKyle Evans ATF_TC_BODY(wcscpy_heap_after_end, tc)
1680b53d7aa8SKyle Evans {
1681b53d7aa8SKyle Evans #define BUF __stack.__buf
1682b53d7aa8SKyle Evans struct {
1683b53d7aa8SKyle Evans uint8_t padding_l;
1684b53d7aa8SKyle Evans wchar_t * __buf;
1685b53d7aa8SKyle Evans uint8_t padding_r;
1686b53d7aa8SKyle Evans } __stack;
1687b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1688b53d7aa8SKyle Evans const size_t __len = 42 + 1;
1689b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1690b53d7aa8SKyle Evans pid_t __child;
1691b53d7aa8SKyle Evans int __status;
1692b53d7aa8SKyle Evans wchar_t src[__len];
1693b53d7aa8SKyle Evans
1694b53d7aa8SKyle Evans __child = fork();
1695b53d7aa8SKyle Evans ATF_REQUIRE(__child >= 0);
1696b53d7aa8SKyle Evans if (__child > 0)
1697b53d7aa8SKyle Evans goto monitor;
1698b53d7aa8SKyle Evans
1699b53d7aa8SKyle Evans /* Child */
1700b53d7aa8SKyle Evans disable_coredumps();
1701b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
1702b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1703b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1704b53d7aa8SKyle Evans src[__len - 1] = '\0';
1705b53d7aa8SKyle Evans
1706b53d7aa8SKyle Evans wcscpy(__stack.__buf, src);
1707b53d7aa8SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
1708b53d7aa8SKyle Evans
1709b53d7aa8SKyle Evans monitor:
1710b53d7aa8SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
1711b53d7aa8SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
1712b53d7aa8SKyle Evans }
1713b53d7aa8SKyle Evans
1714b53d7aa8SKyle Evans if (!WIFSIGNALED(__status)) {
1715b53d7aa8SKyle Evans switch (WEXITSTATUS(__status)) {
1716b53d7aa8SKyle Evans case EX_SOFTWARE:
1717b53d7aa8SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
1718b53d7aa8SKyle Evans break;
1719b53d7aa8SKyle Evans case EX_OSERR:
1720b53d7aa8SKyle Evans atf_tc_fail("setrlimit(2) failed");
1721b53d7aa8SKyle Evans break;
1722b53d7aa8SKyle Evans default:
1723b53d7aa8SKyle Evans atf_tc_fail("child exited with status %d",
1724b53d7aa8SKyle Evans WEXITSTATUS(__status));
1725b53d7aa8SKyle Evans }
1726b53d7aa8SKyle Evans } else {
1727b53d7aa8SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
1728b53d7aa8SKyle Evans }
1729b53d7aa8SKyle Evans #undef BUF
1730b53d7aa8SKyle Evans
1731b53d7aa8SKyle Evans }
1732b53d7aa8SKyle Evans
173309cdbf04SKyle Evans ATF_TC(wcslcpy_before_end);
ATF_TC_HEAD(wcslcpy_before_end,tc)173409cdbf04SKyle Evans ATF_TC_HEAD(wcslcpy_before_end, tc)
173509cdbf04SKyle Evans {
173609cdbf04SKyle Evans }
ATF_TC_BODY(wcslcpy_before_end,tc)1737b53d7aa8SKyle Evans ATF_TC_BODY(wcslcpy_before_end, tc)
1738b53d7aa8SKyle Evans {
1739b53d7aa8SKyle Evans #define BUF &__stack.__buf
1740b53d7aa8SKyle Evans struct {
1741b53d7aa8SKyle Evans uint8_t padding_l;
1742b53d7aa8SKyle Evans wchar_t __buf[42];
1743b53d7aa8SKyle Evans uint8_t padding_r;
1744b53d7aa8SKyle Evans } __stack;
1745b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1746b53d7aa8SKyle Evans const size_t __len = 42 - 1;
1747b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1748b53d7aa8SKyle Evans wchar_t src[__len];
1749b53d7aa8SKyle Evans
1750b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1751b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1752b53d7aa8SKyle Evans src[__len - 1] = '\0';
1753b53d7aa8SKyle Evans
1754b53d7aa8SKyle Evans wcslcpy(__stack.__buf, src, __len);
1755b53d7aa8SKyle Evans #undef BUF
1756b53d7aa8SKyle Evans
1757b53d7aa8SKyle Evans }
1758b53d7aa8SKyle Evans
175909cdbf04SKyle Evans ATF_TC(wcslcpy_end);
ATF_TC_HEAD(wcslcpy_end,tc)176009cdbf04SKyle Evans ATF_TC_HEAD(wcslcpy_end, tc)
176109cdbf04SKyle Evans {
176209cdbf04SKyle Evans }
ATF_TC_BODY(wcslcpy_end,tc)1763b53d7aa8SKyle Evans ATF_TC_BODY(wcslcpy_end, tc)
1764b53d7aa8SKyle Evans {
1765b53d7aa8SKyle Evans #define BUF &__stack.__buf
1766b53d7aa8SKyle Evans struct {
1767b53d7aa8SKyle Evans uint8_t padding_l;
1768b53d7aa8SKyle Evans wchar_t __buf[42];
1769b53d7aa8SKyle Evans uint8_t padding_r;
1770b53d7aa8SKyle Evans } __stack;
1771b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1772b53d7aa8SKyle Evans const size_t __len = 42;
1773b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1774b53d7aa8SKyle Evans wchar_t src[__len];
1775b53d7aa8SKyle Evans
1776b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1777b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1778b53d7aa8SKyle Evans src[__len - 1] = '\0';
1779b53d7aa8SKyle Evans
1780b53d7aa8SKyle Evans wcslcpy(__stack.__buf, src, __len);
1781b53d7aa8SKyle Evans #undef BUF
1782b53d7aa8SKyle Evans
1783b53d7aa8SKyle Evans }
1784b53d7aa8SKyle Evans
178509cdbf04SKyle Evans ATF_TC(wcslcpy_heap_before_end);
ATF_TC_HEAD(wcslcpy_heap_before_end,tc)178609cdbf04SKyle Evans ATF_TC_HEAD(wcslcpy_heap_before_end, tc)
178709cdbf04SKyle Evans {
178809cdbf04SKyle Evans }
ATF_TC_BODY(wcslcpy_heap_before_end,tc)1789b53d7aa8SKyle Evans ATF_TC_BODY(wcslcpy_heap_before_end, tc)
1790b53d7aa8SKyle Evans {
1791b53d7aa8SKyle Evans #define BUF __stack.__buf
1792b53d7aa8SKyle Evans struct {
1793b53d7aa8SKyle Evans uint8_t padding_l;
1794b53d7aa8SKyle Evans wchar_t * __buf;
1795b53d7aa8SKyle Evans uint8_t padding_r;
1796b53d7aa8SKyle Evans } __stack;
1797b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1798b53d7aa8SKyle Evans const size_t __len = 42 - 1;
1799b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1800b53d7aa8SKyle Evans wchar_t src[__len];
1801b53d7aa8SKyle Evans
1802b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
1803b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1804b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1805b53d7aa8SKyle Evans src[__len - 1] = '\0';
1806b53d7aa8SKyle Evans
1807b53d7aa8SKyle Evans wcslcpy(__stack.__buf, src, __len);
1808b53d7aa8SKyle Evans #undef BUF
1809b53d7aa8SKyle Evans
1810b53d7aa8SKyle Evans }
1811b53d7aa8SKyle Evans
181209cdbf04SKyle Evans ATF_TC(wcslcpy_heap_end);
ATF_TC_HEAD(wcslcpy_heap_end,tc)181309cdbf04SKyle Evans ATF_TC_HEAD(wcslcpy_heap_end, tc)
181409cdbf04SKyle Evans {
181509cdbf04SKyle Evans }
ATF_TC_BODY(wcslcpy_heap_end,tc)1816b53d7aa8SKyle Evans ATF_TC_BODY(wcslcpy_heap_end, tc)
1817b53d7aa8SKyle Evans {
1818b53d7aa8SKyle Evans #define BUF __stack.__buf
1819b53d7aa8SKyle Evans struct {
1820b53d7aa8SKyle Evans uint8_t padding_l;
1821b53d7aa8SKyle Evans wchar_t * __buf;
1822b53d7aa8SKyle Evans uint8_t padding_r;
1823b53d7aa8SKyle Evans } __stack;
1824b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1825b53d7aa8SKyle Evans const size_t __len = 42;
1826b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1827b53d7aa8SKyle Evans wchar_t src[__len];
1828b53d7aa8SKyle Evans
1829b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
1830b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1831b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1832b53d7aa8SKyle Evans src[__len - 1] = '\0';
1833b53d7aa8SKyle Evans
1834b53d7aa8SKyle Evans wcslcpy(__stack.__buf, src, __len);
1835b53d7aa8SKyle Evans #undef BUF
1836b53d7aa8SKyle Evans
1837b53d7aa8SKyle Evans }
1838b53d7aa8SKyle Evans
183909cdbf04SKyle Evans ATF_TC(wcslcpy_heap_after_end);
ATF_TC_HEAD(wcslcpy_heap_after_end,tc)184009cdbf04SKyle Evans ATF_TC_HEAD(wcslcpy_heap_after_end, tc)
184109cdbf04SKyle Evans {
184209cdbf04SKyle Evans }
ATF_TC_BODY(wcslcpy_heap_after_end,tc)1843b53d7aa8SKyle Evans ATF_TC_BODY(wcslcpy_heap_after_end, tc)
1844b53d7aa8SKyle Evans {
1845b53d7aa8SKyle Evans #define BUF __stack.__buf
1846b53d7aa8SKyle Evans struct {
1847b53d7aa8SKyle Evans uint8_t padding_l;
1848b53d7aa8SKyle Evans wchar_t * __buf;
1849b53d7aa8SKyle Evans uint8_t padding_r;
1850b53d7aa8SKyle Evans } __stack;
1851b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1852b53d7aa8SKyle Evans const size_t __len = 42 + 1;
1853b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1854b53d7aa8SKyle Evans pid_t __child;
1855b53d7aa8SKyle Evans int __status;
1856b53d7aa8SKyle Evans wchar_t src[__len];
1857b53d7aa8SKyle Evans
1858b53d7aa8SKyle Evans __child = fork();
1859b53d7aa8SKyle Evans ATF_REQUIRE(__child >= 0);
1860b53d7aa8SKyle Evans if (__child > 0)
1861b53d7aa8SKyle Evans goto monitor;
1862b53d7aa8SKyle Evans
1863b53d7aa8SKyle Evans /* Child */
1864b53d7aa8SKyle Evans disable_coredumps();
1865b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
1866b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1867b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1868b53d7aa8SKyle Evans src[__len - 1] = '\0';
1869b53d7aa8SKyle Evans
1870b53d7aa8SKyle Evans wcslcpy(__stack.__buf, src, __len);
1871b53d7aa8SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
1872b53d7aa8SKyle Evans
1873b53d7aa8SKyle Evans monitor:
1874b53d7aa8SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
1875b53d7aa8SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
1876b53d7aa8SKyle Evans }
1877b53d7aa8SKyle Evans
1878b53d7aa8SKyle Evans if (!WIFSIGNALED(__status)) {
1879b53d7aa8SKyle Evans switch (WEXITSTATUS(__status)) {
1880b53d7aa8SKyle Evans case EX_SOFTWARE:
1881b53d7aa8SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
1882b53d7aa8SKyle Evans break;
1883b53d7aa8SKyle Evans case EX_OSERR:
1884b53d7aa8SKyle Evans atf_tc_fail("setrlimit(2) failed");
1885b53d7aa8SKyle Evans break;
1886b53d7aa8SKyle Evans default:
1887b53d7aa8SKyle Evans atf_tc_fail("child exited with status %d",
1888b53d7aa8SKyle Evans WEXITSTATUS(__status));
1889b53d7aa8SKyle Evans }
1890b53d7aa8SKyle Evans } else {
1891b53d7aa8SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
1892b53d7aa8SKyle Evans }
1893b53d7aa8SKyle Evans #undef BUF
1894b53d7aa8SKyle Evans
1895b53d7aa8SKyle Evans }
1896b53d7aa8SKyle Evans
189709cdbf04SKyle Evans ATF_TC(wcsncpy_before_end);
ATF_TC_HEAD(wcsncpy_before_end,tc)189809cdbf04SKyle Evans ATF_TC_HEAD(wcsncpy_before_end, tc)
189909cdbf04SKyle Evans {
190009cdbf04SKyle Evans }
ATF_TC_BODY(wcsncpy_before_end,tc)1901b53d7aa8SKyle Evans ATF_TC_BODY(wcsncpy_before_end, tc)
1902b53d7aa8SKyle Evans {
1903b53d7aa8SKyle Evans #define BUF &__stack.__buf
1904b53d7aa8SKyle Evans struct {
1905b53d7aa8SKyle Evans uint8_t padding_l;
1906b53d7aa8SKyle Evans wchar_t __buf[42];
1907b53d7aa8SKyle Evans uint8_t padding_r;
1908b53d7aa8SKyle Evans } __stack;
1909b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1910b53d7aa8SKyle Evans const size_t __len = 42 - 1;
1911b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1912b53d7aa8SKyle Evans wchar_t src[__len];
1913b53d7aa8SKyle Evans
1914b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1915b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1916b53d7aa8SKyle Evans src[__len - 1] = '\0';
1917b53d7aa8SKyle Evans
1918b53d7aa8SKyle Evans wcsncpy(__stack.__buf, src, __len);
1919b53d7aa8SKyle Evans #undef BUF
1920b53d7aa8SKyle Evans
1921b53d7aa8SKyle Evans }
1922b53d7aa8SKyle Evans
192309cdbf04SKyle Evans ATF_TC(wcsncpy_end);
ATF_TC_HEAD(wcsncpy_end,tc)192409cdbf04SKyle Evans ATF_TC_HEAD(wcsncpy_end, tc)
192509cdbf04SKyle Evans {
192609cdbf04SKyle Evans }
ATF_TC_BODY(wcsncpy_end,tc)1927b53d7aa8SKyle Evans ATF_TC_BODY(wcsncpy_end, tc)
1928b53d7aa8SKyle Evans {
1929b53d7aa8SKyle Evans #define BUF &__stack.__buf
1930b53d7aa8SKyle Evans struct {
1931b53d7aa8SKyle Evans uint8_t padding_l;
1932b53d7aa8SKyle Evans wchar_t __buf[42];
1933b53d7aa8SKyle Evans uint8_t padding_r;
1934b53d7aa8SKyle Evans } __stack;
1935b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1936b53d7aa8SKyle Evans const size_t __len = 42;
1937b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1938b53d7aa8SKyle Evans wchar_t src[__len];
1939b53d7aa8SKyle Evans
1940b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1941b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1942b53d7aa8SKyle Evans src[__len - 1] = '\0';
1943b53d7aa8SKyle Evans
1944b53d7aa8SKyle Evans wcsncpy(__stack.__buf, src, __len);
1945b53d7aa8SKyle Evans #undef BUF
1946b53d7aa8SKyle Evans
1947b53d7aa8SKyle Evans }
1948b53d7aa8SKyle Evans
194909cdbf04SKyle Evans ATF_TC(wcsncpy_heap_before_end);
ATF_TC_HEAD(wcsncpy_heap_before_end,tc)195009cdbf04SKyle Evans ATF_TC_HEAD(wcsncpy_heap_before_end, tc)
195109cdbf04SKyle Evans {
195209cdbf04SKyle Evans }
ATF_TC_BODY(wcsncpy_heap_before_end,tc)1953b53d7aa8SKyle Evans ATF_TC_BODY(wcsncpy_heap_before_end, tc)
1954b53d7aa8SKyle Evans {
1955b53d7aa8SKyle Evans #define BUF __stack.__buf
1956b53d7aa8SKyle Evans struct {
1957b53d7aa8SKyle Evans uint8_t padding_l;
1958b53d7aa8SKyle Evans wchar_t * __buf;
1959b53d7aa8SKyle Evans uint8_t padding_r;
1960b53d7aa8SKyle Evans } __stack;
1961b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1962b53d7aa8SKyle Evans const size_t __len = 42 - 1;
1963b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1964b53d7aa8SKyle Evans wchar_t src[__len];
1965b53d7aa8SKyle Evans
1966b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
1967b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1968b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1969b53d7aa8SKyle Evans src[__len - 1] = '\0';
1970b53d7aa8SKyle Evans
1971b53d7aa8SKyle Evans wcsncpy(__stack.__buf, src, __len);
1972b53d7aa8SKyle Evans #undef BUF
1973b53d7aa8SKyle Evans
1974b53d7aa8SKyle Evans }
1975b53d7aa8SKyle Evans
197609cdbf04SKyle Evans ATF_TC(wcsncpy_heap_end);
ATF_TC_HEAD(wcsncpy_heap_end,tc)197709cdbf04SKyle Evans ATF_TC_HEAD(wcsncpy_heap_end, tc)
197809cdbf04SKyle Evans {
197909cdbf04SKyle Evans }
ATF_TC_BODY(wcsncpy_heap_end,tc)1980b53d7aa8SKyle Evans ATF_TC_BODY(wcsncpy_heap_end, tc)
1981b53d7aa8SKyle Evans {
1982b53d7aa8SKyle Evans #define BUF __stack.__buf
1983b53d7aa8SKyle Evans struct {
1984b53d7aa8SKyle Evans uint8_t padding_l;
1985b53d7aa8SKyle Evans wchar_t * __buf;
1986b53d7aa8SKyle Evans uint8_t padding_r;
1987b53d7aa8SKyle Evans } __stack;
1988b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1989b53d7aa8SKyle Evans const size_t __len = 42;
1990b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
1991b53d7aa8SKyle Evans wchar_t src[__len];
1992b53d7aa8SKyle Evans
1993b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
1994b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
1995b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
1996b53d7aa8SKyle Evans src[__len - 1] = '\0';
1997b53d7aa8SKyle Evans
1998b53d7aa8SKyle Evans wcsncpy(__stack.__buf, src, __len);
1999b53d7aa8SKyle Evans #undef BUF
2000b53d7aa8SKyle Evans
2001b53d7aa8SKyle Evans }
2002b53d7aa8SKyle Evans
200309cdbf04SKyle Evans ATF_TC(wcsncpy_heap_after_end);
ATF_TC_HEAD(wcsncpy_heap_after_end,tc)200409cdbf04SKyle Evans ATF_TC_HEAD(wcsncpy_heap_after_end, tc)
200509cdbf04SKyle Evans {
200609cdbf04SKyle Evans }
ATF_TC_BODY(wcsncpy_heap_after_end,tc)2007b53d7aa8SKyle Evans ATF_TC_BODY(wcsncpy_heap_after_end, tc)
2008b53d7aa8SKyle Evans {
2009b53d7aa8SKyle Evans #define BUF __stack.__buf
2010b53d7aa8SKyle Evans struct {
2011b53d7aa8SKyle Evans uint8_t padding_l;
2012b53d7aa8SKyle Evans wchar_t * __buf;
2013b53d7aa8SKyle Evans uint8_t padding_r;
2014b53d7aa8SKyle Evans } __stack;
2015b53d7aa8SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
2016b53d7aa8SKyle Evans const size_t __len = 42 + 1;
2017b53d7aa8SKyle Evans const size_t __idx __unused = __len - 1;
2018b53d7aa8SKyle Evans pid_t __child;
2019b53d7aa8SKyle Evans int __status;
2020b53d7aa8SKyle Evans wchar_t src[__len];
2021b53d7aa8SKyle Evans
2022b53d7aa8SKyle Evans __child = fork();
2023b53d7aa8SKyle Evans ATF_REQUIRE(__child >= 0);
2024b53d7aa8SKyle Evans if (__child > 0)
2025b53d7aa8SKyle Evans goto monitor;
2026b53d7aa8SKyle Evans
2027b53d7aa8SKyle Evans /* Child */
2028b53d7aa8SKyle Evans disable_coredumps();
2029b53d7aa8SKyle Evans __stack.__buf = malloc(__bufsz);
2030b53d7aa8SKyle Evans wmemset(__stack.__buf, 0, __len);
2031b53d7aa8SKyle Evans wmemset(src, 'A', __len - 1);
2032b53d7aa8SKyle Evans src[__len - 1] = '\0';
2033b53d7aa8SKyle Evans
2034b53d7aa8SKyle Evans wcsncpy(__stack.__buf, src, __len);
2035b53d7aa8SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
2036b53d7aa8SKyle Evans
2037b53d7aa8SKyle Evans monitor:
2038b53d7aa8SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
2039b53d7aa8SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
2040b53d7aa8SKyle Evans }
2041b53d7aa8SKyle Evans
2042b53d7aa8SKyle Evans if (!WIFSIGNALED(__status)) {
2043b53d7aa8SKyle Evans switch (WEXITSTATUS(__status)) {
2044b53d7aa8SKyle Evans case EX_SOFTWARE:
2045b53d7aa8SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
2046b53d7aa8SKyle Evans break;
2047b53d7aa8SKyle Evans case EX_OSERR:
2048b53d7aa8SKyle Evans atf_tc_fail("setrlimit(2) failed");
2049b53d7aa8SKyle Evans break;
2050b53d7aa8SKyle Evans default:
2051b53d7aa8SKyle Evans atf_tc_fail("child exited with status %d",
2052b53d7aa8SKyle Evans WEXITSTATUS(__status));
2053b53d7aa8SKyle Evans }
2054b53d7aa8SKyle Evans } else {
2055b53d7aa8SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
2056b53d7aa8SKyle Evans }
2057b53d7aa8SKyle Evans #undef BUF
2058b53d7aa8SKyle Evans
2059b53d7aa8SKyle Evans }
2060b53d7aa8SKyle Evans
ATF_TP_ADD_TCS(tp)2061b53d7aa8SKyle Evans ATF_TP_ADD_TCS(tp)
2062b53d7aa8SKyle Evans {
2063b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmemcpy_before_end);
2064b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmemcpy_end);
2065b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmemcpy_heap_before_end);
2066b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmemcpy_heap_end);
2067b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmemcpy_heap_after_end);
2068b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmempcpy_before_end);
2069b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmempcpy_end);
2070b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmempcpy_heap_before_end);
2071b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmempcpy_heap_end);
2072b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmempcpy_heap_after_end);
2073b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmemmove_before_end);
2074b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmemmove_end);
2075b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmemmove_heap_before_end);
2076b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmemmove_heap_end);
2077b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmemmove_heap_after_end);
2078b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmemset_before_end);
2079b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmemset_end);
2080b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmemset_heap_before_end);
2081b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmemset_heap_end);
2082b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wmemset_heap_after_end);
2083b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcpcpy_before_end);
2084b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcpcpy_end);
2085b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcpcpy_heap_before_end);
2086b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcpcpy_heap_end);
2087b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcpcpy_heap_after_end);
2088b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcpncpy_before_end);
2089b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcpncpy_end);
2090b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcpncpy_heap_before_end);
2091b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcpncpy_heap_end);
2092b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcpncpy_heap_after_end);
2093b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcscat_before_end);
2094b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcscat_end);
2095b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcscat_heap_before_end);
2096b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcscat_heap_end);
2097b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcscat_heap_after_end);
2098b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcslcat_before_end);
2099b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcslcat_end);
2100b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcslcat_heap_before_end);
2101b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcslcat_heap_end);
2102b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcslcat_heap_after_end);
2103b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcsncat_before_end);
2104b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcsncat_end);
2105b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcsncat_heap_before_end);
2106b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcsncat_heap_end);
2107b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcsncat_heap_after_end);
2108b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcscpy_before_end);
2109b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcscpy_end);
2110b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcscpy_heap_before_end);
2111b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcscpy_heap_end);
2112b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcscpy_heap_after_end);
2113b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcslcpy_before_end);
2114b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcslcpy_end);
2115b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcslcpy_heap_before_end);
2116b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcslcpy_heap_end);
2117b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcslcpy_heap_after_end);
2118b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcsncpy_before_end);
2119b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcsncpy_end);
2120b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcsncpy_heap_before_end);
2121b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcsncpy_heap_end);
2122b53d7aa8SKyle Evans ATF_TP_ADD_TC(tp, wcsncpy_heap_after_end);
2123b53d7aa8SKyle Evans return (atf_no_error());
2124b53d7aa8SKyle Evans }
2125