1020d003cSKyle Evans /* @generated by `generate-fortify-tests.lua "string"` */
2020d003cSKyle Evans
3020d003cSKyle Evans #define _FORTIFY_SOURCE 2
4020d003cSKyle Evans #define TMPFILE_SIZE (1024 * 32)
5020d003cSKyle Evans
6020d003cSKyle Evans #include <sys/param.h>
7*22178cb2SKyle Evans #include <sys/jail.h>
8062d9380SKyle Evans #include <sys/random.h>
9020d003cSKyle Evans #include <sys/resource.h>
102aba0eeaSKyle Evans #include <sys/select.h>
111f155d48SKyle Evans #include <sys/socket.h>
12020d003cSKyle Evans #include <sys/time.h>
131ace24b3SKyle Evans #include <sys/uio.h>
14020d003cSKyle Evans #include <sys/wait.h>
15020d003cSKyle Evans #include <dirent.h>
16020d003cSKyle Evans #include <errno.h>
17020d003cSKyle Evans #include <fcntl.h>
18020d003cSKyle Evans #include <limits.h>
1988276dfbSKyle Evans #include <poll.h>
20020d003cSKyle Evans #include <signal.h>
21020d003cSKyle Evans #include <stdio.h>
22020d003cSKyle Evans #include <stdlib.h>
23020d003cSKyle Evans #include <string.h>
24020d003cSKyle Evans #include <strings.h>
25020d003cSKyle Evans #include <sysexits.h>
26020d003cSKyle Evans #include <unistd.h>
27b53d7aa8SKyle Evans #include <wchar.h>
28020d003cSKyle Evans #include <atf-c.h>
29020d003cSKyle Evans
30cf8e5289SKyle Evans static FILE * __unused
new_fp(size_t __len)31cf8e5289SKyle Evans new_fp(size_t __len)
32cf8e5289SKyle Evans {
33cf8e5289SKyle Evans static char fpbuf[LINE_MAX];
34cf8e5289SKyle Evans FILE *fp;
35cf8e5289SKyle Evans
36cf8e5289SKyle Evans ATF_REQUIRE(__len <= sizeof(fpbuf));
37cf8e5289SKyle Evans
38cf8e5289SKyle Evans memset(fpbuf, 'A', sizeof(fpbuf) - 1);
39cf8e5289SKyle Evans fpbuf[sizeof(fpbuf) - 1] = '\0';
40cf8e5289SKyle Evans
41cf8e5289SKyle Evans fp = fmemopen(fpbuf, sizeof(fpbuf), "rb");
42cf8e5289SKyle Evans ATF_REQUIRE(fp != NULL);
43cf8e5289SKyle Evans
44cf8e5289SKyle Evans return (fp);
45cf8e5289SKyle Evans }
46cf8e5289SKyle Evans
47020d003cSKyle Evans /*
48020d003cSKyle Evans * Create a new symlink to use for readlink(2) style tests, we'll just use a
49020d003cSKyle Evans * random target name to have something interesting to look at.
50020d003cSKyle Evans */
51020d003cSKyle Evans static const char * __unused
new_symlink(size_t __len)52020d003cSKyle Evans new_symlink(size_t __len)
53020d003cSKyle Evans {
54020d003cSKyle Evans static const char linkname[] = "link";
55020d003cSKyle Evans char target[MAXNAMLEN];
56020d003cSKyle Evans int error;
57020d003cSKyle Evans
58020d003cSKyle Evans ATF_REQUIRE(__len <= sizeof(target));
59020d003cSKyle Evans
60020d003cSKyle Evans arc4random_buf(target, sizeof(target));
61020d003cSKyle Evans
62020d003cSKyle Evans error = unlink(linkname);
63020d003cSKyle Evans ATF_REQUIRE(error == 0 || errno == ENOENT);
64020d003cSKyle Evans
65020d003cSKyle Evans error = symlink(target, linkname);
66020d003cSKyle Evans ATF_REQUIRE(error == 0);
67020d003cSKyle Evans
68020d003cSKyle Evans return (linkname);
69020d003cSKyle Evans }
70020d003cSKyle Evans
71020d003cSKyle 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 /*
116020d003cSKyle Evans * Constructs a tmpfile that we can use for testing read(2) and friends.
117020d003cSKyle Evans */
118020d003cSKyle Evans static int __unused
new_tmpfile(void)119020d003cSKyle Evans new_tmpfile(void)
120020d003cSKyle Evans {
121020d003cSKyle Evans char buf[1024];
122020d003cSKyle Evans ssize_t rv;
123020d003cSKyle Evans size_t written;
124020d003cSKyle Evans int fd;
125020d003cSKyle Evans
126020d003cSKyle Evans fd = open("tmpfile", O_RDWR | O_CREAT | O_TRUNC, 0644);
127020d003cSKyle Evans ATF_REQUIRE(fd >= 0);
128020d003cSKyle Evans
129020d003cSKyle Evans written = 0;
130020d003cSKyle Evans while (written < TMPFILE_SIZE) {
131020d003cSKyle Evans rv = write(fd, buf, sizeof(buf));
132020d003cSKyle Evans ATF_REQUIRE(rv > 0);
133020d003cSKyle Evans
134020d003cSKyle Evans written += rv;
135020d003cSKyle Evans }
136020d003cSKyle Evans
137020d003cSKyle Evans ATF_REQUIRE_EQ(0, lseek(fd, 0, SEEK_SET));
138020d003cSKyle Evans return (fd);
139020d003cSKyle Evans }
140020d003cSKyle Evans
141020d003cSKyle Evans static void
disable_coredumps(void)142020d003cSKyle Evans disable_coredumps(void)
143020d003cSKyle Evans {
144020d003cSKyle Evans struct rlimit rl = { 0 };
145020d003cSKyle Evans
146020d003cSKyle Evans if (setrlimit(RLIMIT_CORE, &rl) == -1)
147020d003cSKyle Evans _exit(EX_OSERR);
148020d003cSKyle Evans }
149020d003cSKyle Evans
150cf8e5289SKyle Evans /*
151cf8e5289SKyle Evans * Replaces stdin with a file that we can actually read from, for tests where
152cf8e5289SKyle Evans * we want a FILE * or fd that we can get data from.
153cf8e5289SKyle Evans */
154cf8e5289SKyle Evans static void __unused
replace_stdin(void)155cf8e5289SKyle Evans replace_stdin(void)
156cf8e5289SKyle Evans {
157cf8e5289SKyle Evans int fd;
158cf8e5289SKyle Evans
159cf8e5289SKyle Evans fd = new_tmpfile();
160cf8e5289SKyle Evans
161cf8e5289SKyle Evans (void)dup2(fd, STDIN_FILENO);
162cf8e5289SKyle Evans if (fd != STDIN_FILENO)
163cf8e5289SKyle Evans close(fd);
164cf8e5289SKyle Evans }
165cf8e5289SKyle Evans
16609cdbf04SKyle Evans ATF_TC(memcpy_before_end);
ATF_TC_HEAD(memcpy_before_end,tc)16709cdbf04SKyle Evans ATF_TC_HEAD(memcpy_before_end, tc)
16809cdbf04SKyle Evans {
16909cdbf04SKyle Evans }
ATF_TC_BODY(memcpy_before_end,tc)170020d003cSKyle Evans ATF_TC_BODY(memcpy_before_end, tc)
171020d003cSKyle Evans {
172020d003cSKyle Evans #define BUF &__stack.__buf
173020d003cSKyle Evans struct {
174020d003cSKyle Evans uint8_t padding_l;
175020d003cSKyle Evans unsigned char __buf[42];
176020d003cSKyle Evans uint8_t padding_r;
177020d003cSKyle Evans } __stack;
178020d003cSKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
179020d003cSKyle Evans const size_t __len = 42 - 1;
180020d003cSKyle Evans const size_t __idx __unused = __len - 1;
181020d003cSKyle Evans char src[__len + 10];
182020d003cSKyle Evans
183020d003cSKyle Evans memcpy(__stack.__buf, src, __len);
184020d003cSKyle Evans #undef BUF
185020d003cSKyle Evans
186020d003cSKyle Evans }
187020d003cSKyle Evans
18809cdbf04SKyle Evans ATF_TC(memcpy_end);
ATF_TC_HEAD(memcpy_end,tc)18909cdbf04SKyle Evans ATF_TC_HEAD(memcpy_end, tc)
19009cdbf04SKyle Evans {
19109cdbf04SKyle Evans }
ATF_TC_BODY(memcpy_end,tc)192020d003cSKyle Evans ATF_TC_BODY(memcpy_end, tc)
193020d003cSKyle Evans {
194020d003cSKyle Evans #define BUF &__stack.__buf
195020d003cSKyle Evans struct {
196020d003cSKyle Evans uint8_t padding_l;
197020d003cSKyle Evans unsigned char __buf[42];
198020d003cSKyle Evans uint8_t padding_r;
199020d003cSKyle Evans } __stack;
200020d003cSKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
201020d003cSKyle Evans const size_t __len = 42;
202020d003cSKyle Evans const size_t __idx __unused = __len - 1;
203020d003cSKyle Evans char src[__len + 10];
204020d003cSKyle Evans
205020d003cSKyle Evans memcpy(__stack.__buf, src, __len);
206020d003cSKyle Evans #undef BUF
207020d003cSKyle Evans
208020d003cSKyle Evans }
209020d003cSKyle Evans
21009cdbf04SKyle Evans ATF_TC(memcpy_heap_before_end);
ATF_TC_HEAD(memcpy_heap_before_end,tc)21109cdbf04SKyle Evans ATF_TC_HEAD(memcpy_heap_before_end, tc)
21209cdbf04SKyle Evans {
21309cdbf04SKyle Evans }
ATF_TC_BODY(memcpy_heap_before_end,tc)214020d003cSKyle Evans ATF_TC_BODY(memcpy_heap_before_end, tc)
215020d003cSKyle Evans {
216020d003cSKyle Evans #define BUF __stack.__buf
217020d003cSKyle Evans struct {
218020d003cSKyle Evans uint8_t padding_l;
219020d003cSKyle Evans unsigned char * __buf;
220020d003cSKyle Evans uint8_t padding_r;
221020d003cSKyle Evans } __stack;
222020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
223020d003cSKyle Evans const size_t __len = 42 - 1;
224020d003cSKyle Evans const size_t __idx __unused = __len - 1;
225020d003cSKyle Evans char src[__len + 10];
226020d003cSKyle Evans
227020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
228020d003cSKyle Evans
229020d003cSKyle Evans memcpy(__stack.__buf, src, __len);
230020d003cSKyle Evans #undef BUF
231020d003cSKyle Evans
232020d003cSKyle Evans }
233020d003cSKyle Evans
23409cdbf04SKyle Evans ATF_TC(memcpy_heap_end);
ATF_TC_HEAD(memcpy_heap_end,tc)23509cdbf04SKyle Evans ATF_TC_HEAD(memcpy_heap_end, tc)
23609cdbf04SKyle Evans {
23709cdbf04SKyle Evans }
ATF_TC_BODY(memcpy_heap_end,tc)238020d003cSKyle Evans ATF_TC_BODY(memcpy_heap_end, tc)
239020d003cSKyle Evans {
240020d003cSKyle Evans #define BUF __stack.__buf
241020d003cSKyle Evans struct {
242020d003cSKyle Evans uint8_t padding_l;
243020d003cSKyle Evans unsigned char * __buf;
244020d003cSKyle Evans uint8_t padding_r;
245020d003cSKyle Evans } __stack;
246020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
247020d003cSKyle Evans const size_t __len = 42;
248020d003cSKyle Evans const size_t __idx __unused = __len - 1;
249020d003cSKyle Evans char src[__len + 10];
250020d003cSKyle Evans
251020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
252020d003cSKyle Evans
253020d003cSKyle Evans memcpy(__stack.__buf, src, __len);
254020d003cSKyle Evans #undef BUF
255020d003cSKyle Evans
256020d003cSKyle Evans }
257020d003cSKyle Evans
25809cdbf04SKyle Evans ATF_TC(memcpy_heap_after_end);
ATF_TC_HEAD(memcpy_heap_after_end,tc)25909cdbf04SKyle Evans ATF_TC_HEAD(memcpy_heap_after_end, tc)
26009cdbf04SKyle Evans {
26109cdbf04SKyle Evans }
ATF_TC_BODY(memcpy_heap_after_end,tc)262020d003cSKyle Evans ATF_TC_BODY(memcpy_heap_after_end, tc)
263020d003cSKyle Evans {
264020d003cSKyle Evans #define BUF __stack.__buf
265020d003cSKyle Evans struct {
266020d003cSKyle Evans uint8_t padding_l;
267020d003cSKyle Evans unsigned char * __buf;
268020d003cSKyle Evans uint8_t padding_r;
269020d003cSKyle Evans } __stack;
270020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
271020d003cSKyle Evans const size_t __len = 42 + 1;
272020d003cSKyle Evans const size_t __idx __unused = __len - 1;
273020d003cSKyle Evans pid_t __child;
274020d003cSKyle Evans int __status;
275020d003cSKyle Evans char src[__len + 10];
276020d003cSKyle Evans
277020d003cSKyle Evans __child = fork();
278020d003cSKyle Evans ATF_REQUIRE(__child >= 0);
279020d003cSKyle Evans if (__child > 0)
280020d003cSKyle Evans goto monitor;
281020d003cSKyle Evans
282020d003cSKyle Evans /* Child */
283020d003cSKyle Evans disable_coredumps();
284020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
285020d003cSKyle Evans
286020d003cSKyle Evans memcpy(__stack.__buf, src, __len);
287020d003cSKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
288020d003cSKyle Evans
289020d003cSKyle Evans monitor:
290020d003cSKyle Evans while (waitpid(__child, &__status, 0) != __child) {
291020d003cSKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
292020d003cSKyle Evans }
293020d003cSKyle Evans
294020d003cSKyle Evans if (!WIFSIGNALED(__status)) {
295020d003cSKyle Evans switch (WEXITSTATUS(__status)) {
296020d003cSKyle Evans case EX_SOFTWARE:
297020d003cSKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
298020d003cSKyle Evans break;
299020d003cSKyle Evans case EX_OSERR:
300020d003cSKyle Evans atf_tc_fail("setrlimit(2) failed");
301020d003cSKyle Evans break;
302020d003cSKyle Evans default:
303020d003cSKyle Evans atf_tc_fail("child exited with status %d",
304020d003cSKyle Evans WEXITSTATUS(__status));
305020d003cSKyle Evans }
306020d003cSKyle Evans } else {
307020d003cSKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
308020d003cSKyle Evans }
309020d003cSKyle Evans #undef BUF
310020d003cSKyle Evans
311020d003cSKyle Evans }
312020d003cSKyle Evans
31309cdbf04SKyle Evans ATF_TC(mempcpy_before_end);
ATF_TC_HEAD(mempcpy_before_end,tc)31409cdbf04SKyle Evans ATF_TC_HEAD(mempcpy_before_end, tc)
31509cdbf04SKyle Evans {
31609cdbf04SKyle Evans }
ATF_TC_BODY(mempcpy_before_end,tc)317cf8e5289SKyle Evans ATF_TC_BODY(mempcpy_before_end, tc)
318cf8e5289SKyle Evans {
319cf8e5289SKyle Evans #define BUF &__stack.__buf
320cf8e5289SKyle Evans struct {
321cf8e5289SKyle Evans uint8_t padding_l;
322cf8e5289SKyle Evans unsigned char __buf[42];
323cf8e5289SKyle Evans uint8_t padding_r;
324cf8e5289SKyle Evans } __stack;
325cf8e5289SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
326cf8e5289SKyle Evans const size_t __len = 42 - 1;
327cf8e5289SKyle Evans const size_t __idx __unused = __len - 1;
328cf8e5289SKyle Evans char src[__len + 10];
329cf8e5289SKyle Evans
330cf8e5289SKyle Evans mempcpy(__stack.__buf, src, __len);
331cf8e5289SKyle Evans #undef BUF
332cf8e5289SKyle Evans
333cf8e5289SKyle Evans }
334cf8e5289SKyle Evans
33509cdbf04SKyle Evans ATF_TC(mempcpy_end);
ATF_TC_HEAD(mempcpy_end,tc)33609cdbf04SKyle Evans ATF_TC_HEAD(mempcpy_end, tc)
33709cdbf04SKyle Evans {
33809cdbf04SKyle Evans }
ATF_TC_BODY(mempcpy_end,tc)339cf8e5289SKyle Evans ATF_TC_BODY(mempcpy_end, tc)
340cf8e5289SKyle Evans {
341cf8e5289SKyle Evans #define BUF &__stack.__buf
342cf8e5289SKyle Evans struct {
343cf8e5289SKyle Evans uint8_t padding_l;
344cf8e5289SKyle Evans unsigned char __buf[42];
345cf8e5289SKyle Evans uint8_t padding_r;
346cf8e5289SKyle Evans } __stack;
347cf8e5289SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
348cf8e5289SKyle Evans const size_t __len = 42;
349cf8e5289SKyle Evans const size_t __idx __unused = __len - 1;
350cf8e5289SKyle Evans char src[__len + 10];
351cf8e5289SKyle Evans
352cf8e5289SKyle Evans mempcpy(__stack.__buf, src, __len);
353cf8e5289SKyle Evans #undef BUF
354cf8e5289SKyle Evans
355cf8e5289SKyle Evans }
356cf8e5289SKyle Evans
35709cdbf04SKyle Evans ATF_TC(mempcpy_heap_before_end);
ATF_TC_HEAD(mempcpy_heap_before_end,tc)35809cdbf04SKyle Evans ATF_TC_HEAD(mempcpy_heap_before_end, tc)
35909cdbf04SKyle Evans {
36009cdbf04SKyle Evans }
ATF_TC_BODY(mempcpy_heap_before_end,tc)361cf8e5289SKyle Evans ATF_TC_BODY(mempcpy_heap_before_end, tc)
362cf8e5289SKyle Evans {
363cf8e5289SKyle Evans #define BUF __stack.__buf
364cf8e5289SKyle Evans struct {
365cf8e5289SKyle Evans uint8_t padding_l;
366cf8e5289SKyle Evans unsigned char * __buf;
367cf8e5289SKyle Evans uint8_t padding_r;
368cf8e5289SKyle Evans } __stack;
369cf8e5289SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
370cf8e5289SKyle Evans const size_t __len = 42 - 1;
371cf8e5289SKyle Evans const size_t __idx __unused = __len - 1;
372cf8e5289SKyle Evans char src[__len + 10];
373cf8e5289SKyle Evans
374cf8e5289SKyle Evans __stack.__buf = malloc(__bufsz);
375cf8e5289SKyle Evans
376cf8e5289SKyle Evans mempcpy(__stack.__buf, src, __len);
377cf8e5289SKyle Evans #undef BUF
378cf8e5289SKyle Evans
379cf8e5289SKyle Evans }
380cf8e5289SKyle Evans
38109cdbf04SKyle Evans ATF_TC(mempcpy_heap_end);
ATF_TC_HEAD(mempcpy_heap_end,tc)38209cdbf04SKyle Evans ATF_TC_HEAD(mempcpy_heap_end, tc)
38309cdbf04SKyle Evans {
38409cdbf04SKyle Evans }
ATF_TC_BODY(mempcpy_heap_end,tc)385cf8e5289SKyle Evans ATF_TC_BODY(mempcpy_heap_end, tc)
386cf8e5289SKyle Evans {
387cf8e5289SKyle Evans #define BUF __stack.__buf
388cf8e5289SKyle Evans struct {
389cf8e5289SKyle Evans uint8_t padding_l;
390cf8e5289SKyle Evans unsigned char * __buf;
391cf8e5289SKyle Evans uint8_t padding_r;
392cf8e5289SKyle Evans } __stack;
393cf8e5289SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
394cf8e5289SKyle Evans const size_t __len = 42;
395cf8e5289SKyle Evans const size_t __idx __unused = __len - 1;
396cf8e5289SKyle Evans char src[__len + 10];
397cf8e5289SKyle Evans
398cf8e5289SKyle Evans __stack.__buf = malloc(__bufsz);
399cf8e5289SKyle Evans
400cf8e5289SKyle Evans mempcpy(__stack.__buf, src, __len);
401cf8e5289SKyle Evans #undef BUF
402cf8e5289SKyle Evans
403cf8e5289SKyle Evans }
404cf8e5289SKyle Evans
40509cdbf04SKyle Evans ATF_TC(mempcpy_heap_after_end);
ATF_TC_HEAD(mempcpy_heap_after_end,tc)40609cdbf04SKyle Evans ATF_TC_HEAD(mempcpy_heap_after_end, tc)
40709cdbf04SKyle Evans {
40809cdbf04SKyle Evans }
ATF_TC_BODY(mempcpy_heap_after_end,tc)409cf8e5289SKyle Evans ATF_TC_BODY(mempcpy_heap_after_end, tc)
410cf8e5289SKyle Evans {
411cf8e5289SKyle Evans #define BUF __stack.__buf
412cf8e5289SKyle Evans struct {
413cf8e5289SKyle Evans uint8_t padding_l;
414cf8e5289SKyle Evans unsigned char * __buf;
415cf8e5289SKyle Evans uint8_t padding_r;
416cf8e5289SKyle Evans } __stack;
417cf8e5289SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
418cf8e5289SKyle Evans const size_t __len = 42 + 1;
419cf8e5289SKyle Evans const size_t __idx __unused = __len - 1;
420cf8e5289SKyle Evans pid_t __child;
421cf8e5289SKyle Evans int __status;
422cf8e5289SKyle Evans char src[__len + 10];
423cf8e5289SKyle Evans
424cf8e5289SKyle Evans __child = fork();
425cf8e5289SKyle Evans ATF_REQUIRE(__child >= 0);
426cf8e5289SKyle Evans if (__child > 0)
427cf8e5289SKyle Evans goto monitor;
428cf8e5289SKyle Evans
429cf8e5289SKyle Evans /* Child */
430cf8e5289SKyle Evans disable_coredumps();
431cf8e5289SKyle Evans __stack.__buf = malloc(__bufsz);
432cf8e5289SKyle Evans
433cf8e5289SKyle Evans mempcpy(__stack.__buf, src, __len);
434cf8e5289SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
435cf8e5289SKyle Evans
436cf8e5289SKyle Evans monitor:
437cf8e5289SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
438cf8e5289SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
439cf8e5289SKyle Evans }
440cf8e5289SKyle Evans
441cf8e5289SKyle Evans if (!WIFSIGNALED(__status)) {
442cf8e5289SKyle Evans switch (WEXITSTATUS(__status)) {
443cf8e5289SKyle Evans case EX_SOFTWARE:
444cf8e5289SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
445cf8e5289SKyle Evans break;
446cf8e5289SKyle Evans case EX_OSERR:
447cf8e5289SKyle Evans atf_tc_fail("setrlimit(2) failed");
448cf8e5289SKyle Evans break;
449cf8e5289SKyle Evans default:
450cf8e5289SKyle Evans atf_tc_fail("child exited with status %d",
451cf8e5289SKyle Evans WEXITSTATUS(__status));
452cf8e5289SKyle Evans }
453cf8e5289SKyle Evans } else {
454cf8e5289SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
455cf8e5289SKyle Evans }
456cf8e5289SKyle Evans #undef BUF
457cf8e5289SKyle Evans
458cf8e5289SKyle Evans }
459cf8e5289SKyle Evans
46009cdbf04SKyle Evans ATF_TC(memmove_before_end);
ATF_TC_HEAD(memmove_before_end,tc)46109cdbf04SKyle Evans ATF_TC_HEAD(memmove_before_end, tc)
46209cdbf04SKyle Evans {
46309cdbf04SKyle Evans }
ATF_TC_BODY(memmove_before_end,tc)464020d003cSKyle Evans ATF_TC_BODY(memmove_before_end, tc)
465020d003cSKyle Evans {
466020d003cSKyle Evans #define BUF &__stack.__buf
467020d003cSKyle Evans struct {
468020d003cSKyle Evans uint8_t padding_l;
469020d003cSKyle Evans unsigned char __buf[42];
470020d003cSKyle Evans uint8_t padding_r;
471020d003cSKyle Evans } __stack;
472020d003cSKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
473020d003cSKyle Evans const size_t __len = 42 - 1;
474020d003cSKyle Evans const size_t __idx __unused = __len - 1;
475020d003cSKyle Evans char src[__len + 10];
476020d003cSKyle Evans
477020d003cSKyle Evans memmove(__stack.__buf, src, __len);
478020d003cSKyle Evans #undef BUF
479020d003cSKyle Evans
480020d003cSKyle Evans }
481020d003cSKyle Evans
48209cdbf04SKyle Evans ATF_TC(memmove_end);
ATF_TC_HEAD(memmove_end,tc)48309cdbf04SKyle Evans ATF_TC_HEAD(memmove_end, tc)
48409cdbf04SKyle Evans {
48509cdbf04SKyle Evans }
ATF_TC_BODY(memmove_end,tc)486020d003cSKyle Evans ATF_TC_BODY(memmove_end, tc)
487020d003cSKyle Evans {
488020d003cSKyle Evans #define BUF &__stack.__buf
489020d003cSKyle Evans struct {
490020d003cSKyle Evans uint8_t padding_l;
491020d003cSKyle Evans unsigned char __buf[42];
492020d003cSKyle Evans uint8_t padding_r;
493020d003cSKyle Evans } __stack;
494020d003cSKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
495020d003cSKyle Evans const size_t __len = 42;
496020d003cSKyle Evans const size_t __idx __unused = __len - 1;
497020d003cSKyle Evans char src[__len + 10];
498020d003cSKyle Evans
499020d003cSKyle Evans memmove(__stack.__buf, src, __len);
500020d003cSKyle Evans #undef BUF
501020d003cSKyle Evans
502020d003cSKyle Evans }
503020d003cSKyle Evans
50409cdbf04SKyle Evans ATF_TC(memmove_heap_before_end);
ATF_TC_HEAD(memmove_heap_before_end,tc)50509cdbf04SKyle Evans ATF_TC_HEAD(memmove_heap_before_end, tc)
50609cdbf04SKyle Evans {
50709cdbf04SKyle Evans }
ATF_TC_BODY(memmove_heap_before_end,tc)508020d003cSKyle Evans ATF_TC_BODY(memmove_heap_before_end, tc)
509020d003cSKyle Evans {
510020d003cSKyle Evans #define BUF __stack.__buf
511020d003cSKyle Evans struct {
512020d003cSKyle Evans uint8_t padding_l;
513020d003cSKyle Evans unsigned char * __buf;
514020d003cSKyle Evans uint8_t padding_r;
515020d003cSKyle Evans } __stack;
516020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
517020d003cSKyle Evans const size_t __len = 42 - 1;
518020d003cSKyle Evans const size_t __idx __unused = __len - 1;
519020d003cSKyle Evans char src[__len + 10];
520020d003cSKyle Evans
521020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
522020d003cSKyle Evans
523020d003cSKyle Evans memmove(__stack.__buf, src, __len);
524020d003cSKyle Evans #undef BUF
525020d003cSKyle Evans
526020d003cSKyle Evans }
527020d003cSKyle Evans
52809cdbf04SKyle Evans ATF_TC(memmove_heap_end);
ATF_TC_HEAD(memmove_heap_end,tc)52909cdbf04SKyle Evans ATF_TC_HEAD(memmove_heap_end, tc)
53009cdbf04SKyle Evans {
53109cdbf04SKyle Evans }
ATF_TC_BODY(memmove_heap_end,tc)532020d003cSKyle Evans ATF_TC_BODY(memmove_heap_end, tc)
533020d003cSKyle Evans {
534020d003cSKyle Evans #define BUF __stack.__buf
535020d003cSKyle Evans struct {
536020d003cSKyle Evans uint8_t padding_l;
537020d003cSKyle Evans unsigned char * __buf;
538020d003cSKyle Evans uint8_t padding_r;
539020d003cSKyle Evans } __stack;
540020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
541020d003cSKyle Evans const size_t __len = 42;
542020d003cSKyle Evans const size_t __idx __unused = __len - 1;
543020d003cSKyle Evans char src[__len + 10];
544020d003cSKyle Evans
545020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
546020d003cSKyle Evans
547020d003cSKyle Evans memmove(__stack.__buf, src, __len);
548020d003cSKyle Evans #undef BUF
549020d003cSKyle Evans
550020d003cSKyle Evans }
551020d003cSKyle Evans
55209cdbf04SKyle Evans ATF_TC(memmove_heap_after_end);
ATF_TC_HEAD(memmove_heap_after_end,tc)55309cdbf04SKyle Evans ATF_TC_HEAD(memmove_heap_after_end, tc)
55409cdbf04SKyle Evans {
55509cdbf04SKyle Evans }
ATF_TC_BODY(memmove_heap_after_end,tc)556020d003cSKyle Evans ATF_TC_BODY(memmove_heap_after_end, tc)
557020d003cSKyle Evans {
558020d003cSKyle Evans #define BUF __stack.__buf
559020d003cSKyle Evans struct {
560020d003cSKyle Evans uint8_t padding_l;
561020d003cSKyle Evans unsigned char * __buf;
562020d003cSKyle Evans uint8_t padding_r;
563020d003cSKyle Evans } __stack;
564020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
565020d003cSKyle Evans const size_t __len = 42 + 1;
566020d003cSKyle Evans const size_t __idx __unused = __len - 1;
567020d003cSKyle Evans pid_t __child;
568020d003cSKyle Evans int __status;
569020d003cSKyle Evans char src[__len + 10];
570020d003cSKyle Evans
571020d003cSKyle Evans __child = fork();
572020d003cSKyle Evans ATF_REQUIRE(__child >= 0);
573020d003cSKyle Evans if (__child > 0)
574020d003cSKyle Evans goto monitor;
575020d003cSKyle Evans
576020d003cSKyle Evans /* Child */
577020d003cSKyle Evans disable_coredumps();
578020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
579020d003cSKyle Evans
580020d003cSKyle Evans memmove(__stack.__buf, src, __len);
581020d003cSKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
582020d003cSKyle Evans
583020d003cSKyle Evans monitor:
584020d003cSKyle Evans while (waitpid(__child, &__status, 0) != __child) {
585020d003cSKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
586020d003cSKyle Evans }
587020d003cSKyle Evans
588020d003cSKyle Evans if (!WIFSIGNALED(__status)) {
589020d003cSKyle Evans switch (WEXITSTATUS(__status)) {
590020d003cSKyle Evans case EX_SOFTWARE:
591020d003cSKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
592020d003cSKyle Evans break;
593020d003cSKyle Evans case EX_OSERR:
594020d003cSKyle Evans atf_tc_fail("setrlimit(2) failed");
595020d003cSKyle Evans break;
596020d003cSKyle Evans default:
597020d003cSKyle Evans atf_tc_fail("child exited with status %d",
598020d003cSKyle Evans WEXITSTATUS(__status));
599020d003cSKyle Evans }
600020d003cSKyle Evans } else {
601020d003cSKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
602020d003cSKyle Evans }
603020d003cSKyle Evans #undef BUF
604020d003cSKyle Evans
605020d003cSKyle Evans }
606020d003cSKyle Evans
60709cdbf04SKyle Evans ATF_TC(memset_before_end);
ATF_TC_HEAD(memset_before_end,tc)60809cdbf04SKyle Evans ATF_TC_HEAD(memset_before_end, tc)
60909cdbf04SKyle Evans {
61009cdbf04SKyle Evans }
ATF_TC_BODY(memset_before_end,tc)611020d003cSKyle Evans ATF_TC_BODY(memset_before_end, tc)
612020d003cSKyle Evans {
613020d003cSKyle Evans #define BUF &__stack.__buf
614020d003cSKyle Evans struct {
615020d003cSKyle Evans uint8_t padding_l;
616020d003cSKyle Evans unsigned char __buf[42];
617020d003cSKyle Evans uint8_t padding_r;
618020d003cSKyle Evans } __stack;
619020d003cSKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
620020d003cSKyle Evans const size_t __len = 42 - 1;
621020d003cSKyle Evans const size_t __idx __unused = __len - 1;
622020d003cSKyle Evans
623020d003cSKyle Evans memset(__stack.__buf, 0, __len);
624020d003cSKyle Evans #undef BUF
625020d003cSKyle Evans
626020d003cSKyle Evans }
627020d003cSKyle Evans
62809cdbf04SKyle Evans ATF_TC(memset_end);
ATF_TC_HEAD(memset_end,tc)62909cdbf04SKyle Evans ATF_TC_HEAD(memset_end, tc)
63009cdbf04SKyle Evans {
63109cdbf04SKyle Evans }
ATF_TC_BODY(memset_end,tc)632020d003cSKyle Evans ATF_TC_BODY(memset_end, tc)
633020d003cSKyle Evans {
634020d003cSKyle Evans #define BUF &__stack.__buf
635020d003cSKyle Evans struct {
636020d003cSKyle Evans uint8_t padding_l;
637020d003cSKyle Evans unsigned char __buf[42];
638020d003cSKyle Evans uint8_t padding_r;
639020d003cSKyle Evans } __stack;
640020d003cSKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
641020d003cSKyle Evans const size_t __len = 42;
642020d003cSKyle Evans const size_t __idx __unused = __len - 1;
643020d003cSKyle Evans
644020d003cSKyle Evans memset(__stack.__buf, 0, __len);
645020d003cSKyle Evans #undef BUF
646020d003cSKyle Evans
647020d003cSKyle Evans }
648020d003cSKyle Evans
64909cdbf04SKyle Evans ATF_TC(memset_heap_before_end);
ATF_TC_HEAD(memset_heap_before_end,tc)65009cdbf04SKyle Evans ATF_TC_HEAD(memset_heap_before_end, tc)
65109cdbf04SKyle Evans {
65209cdbf04SKyle Evans }
ATF_TC_BODY(memset_heap_before_end,tc)653020d003cSKyle Evans ATF_TC_BODY(memset_heap_before_end, tc)
654020d003cSKyle Evans {
655020d003cSKyle Evans #define BUF __stack.__buf
656020d003cSKyle Evans struct {
657020d003cSKyle Evans uint8_t padding_l;
658020d003cSKyle Evans unsigned char * __buf;
659020d003cSKyle Evans uint8_t padding_r;
660020d003cSKyle Evans } __stack;
661020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
662020d003cSKyle Evans const size_t __len = 42 - 1;
663020d003cSKyle Evans const size_t __idx __unused = __len - 1;
664020d003cSKyle Evans
665020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
666020d003cSKyle Evans
667020d003cSKyle Evans memset(__stack.__buf, 0, __len);
668020d003cSKyle Evans #undef BUF
669020d003cSKyle Evans
670020d003cSKyle Evans }
671020d003cSKyle Evans
67209cdbf04SKyle Evans ATF_TC(memset_heap_end);
ATF_TC_HEAD(memset_heap_end,tc)67309cdbf04SKyle Evans ATF_TC_HEAD(memset_heap_end, tc)
67409cdbf04SKyle Evans {
67509cdbf04SKyle Evans }
ATF_TC_BODY(memset_heap_end,tc)676020d003cSKyle Evans ATF_TC_BODY(memset_heap_end, tc)
677020d003cSKyle Evans {
678020d003cSKyle Evans #define BUF __stack.__buf
679020d003cSKyle Evans struct {
680020d003cSKyle Evans uint8_t padding_l;
681020d003cSKyle Evans unsigned char * __buf;
682020d003cSKyle Evans uint8_t padding_r;
683020d003cSKyle Evans } __stack;
684020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
685020d003cSKyle Evans const size_t __len = 42;
686020d003cSKyle Evans const size_t __idx __unused = __len - 1;
687020d003cSKyle Evans
688020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
689020d003cSKyle Evans
690020d003cSKyle Evans memset(__stack.__buf, 0, __len);
691020d003cSKyle Evans #undef BUF
692020d003cSKyle Evans
693020d003cSKyle Evans }
694020d003cSKyle Evans
69509cdbf04SKyle Evans ATF_TC(memset_heap_after_end);
ATF_TC_HEAD(memset_heap_after_end,tc)69609cdbf04SKyle Evans ATF_TC_HEAD(memset_heap_after_end, tc)
69709cdbf04SKyle Evans {
69809cdbf04SKyle Evans }
ATF_TC_BODY(memset_heap_after_end,tc)699020d003cSKyle Evans ATF_TC_BODY(memset_heap_after_end, tc)
700020d003cSKyle Evans {
701020d003cSKyle Evans #define BUF __stack.__buf
702020d003cSKyle Evans struct {
703020d003cSKyle Evans uint8_t padding_l;
704020d003cSKyle Evans unsigned char * __buf;
705020d003cSKyle Evans uint8_t padding_r;
706020d003cSKyle Evans } __stack;
707020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
708020d003cSKyle Evans const size_t __len = 42 + 1;
709020d003cSKyle Evans const size_t __idx __unused = __len - 1;
710020d003cSKyle Evans pid_t __child;
711020d003cSKyle Evans int __status;
712020d003cSKyle Evans
713020d003cSKyle Evans __child = fork();
714020d003cSKyle Evans ATF_REQUIRE(__child >= 0);
715020d003cSKyle Evans if (__child > 0)
716020d003cSKyle Evans goto monitor;
717020d003cSKyle Evans
718020d003cSKyle Evans /* Child */
719020d003cSKyle Evans disable_coredumps();
720020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
721020d003cSKyle Evans
722020d003cSKyle Evans memset(__stack.__buf, 0, __len);
723020d003cSKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
724020d003cSKyle Evans
725020d003cSKyle Evans monitor:
726020d003cSKyle Evans while (waitpid(__child, &__status, 0) != __child) {
727020d003cSKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
728020d003cSKyle Evans }
729020d003cSKyle Evans
730020d003cSKyle Evans if (!WIFSIGNALED(__status)) {
731020d003cSKyle Evans switch (WEXITSTATUS(__status)) {
732020d003cSKyle Evans case EX_SOFTWARE:
733020d003cSKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
734020d003cSKyle Evans break;
735020d003cSKyle Evans case EX_OSERR:
736020d003cSKyle Evans atf_tc_fail("setrlimit(2) failed");
737020d003cSKyle Evans break;
738020d003cSKyle Evans default:
739020d003cSKyle Evans atf_tc_fail("child exited with status %d",
740020d003cSKyle Evans WEXITSTATUS(__status));
741020d003cSKyle Evans }
742020d003cSKyle Evans } else {
743020d003cSKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
744020d003cSKyle Evans }
745020d003cSKyle Evans #undef BUF
746020d003cSKyle Evans
747020d003cSKyle Evans }
748020d003cSKyle Evans
74909cdbf04SKyle Evans ATF_TC(memset_explicit_before_end);
ATF_TC_HEAD(memset_explicit_before_end,tc)75009cdbf04SKyle Evans ATF_TC_HEAD(memset_explicit_before_end, tc)
75109cdbf04SKyle Evans {
75209cdbf04SKyle Evans }
ATF_TC_BODY(memset_explicit_before_end,tc)7538983acc8SRobert Clausecker ATF_TC_BODY(memset_explicit_before_end, tc)
7548983acc8SRobert Clausecker {
7558983acc8SRobert Clausecker #define BUF &__stack.__buf
7568983acc8SRobert Clausecker struct {
7578983acc8SRobert Clausecker uint8_t padding_l;
7588983acc8SRobert Clausecker unsigned char __buf[42];
7598983acc8SRobert Clausecker uint8_t padding_r;
7608983acc8SRobert Clausecker } __stack;
7618983acc8SRobert Clausecker const size_t __bufsz __unused = sizeof(__stack.__buf);
7628983acc8SRobert Clausecker const size_t __len = 42 - 1;
7638983acc8SRobert Clausecker const size_t __idx __unused = __len - 1;
7648983acc8SRobert Clausecker
7658983acc8SRobert Clausecker memset_explicit(__stack.__buf, 0, __len);
7668983acc8SRobert Clausecker #undef BUF
7678983acc8SRobert Clausecker
7688983acc8SRobert Clausecker }
7698983acc8SRobert Clausecker
77009cdbf04SKyle Evans ATF_TC(memset_explicit_end);
ATF_TC_HEAD(memset_explicit_end,tc)77109cdbf04SKyle Evans ATF_TC_HEAD(memset_explicit_end, tc)
77209cdbf04SKyle Evans {
77309cdbf04SKyle Evans }
ATF_TC_BODY(memset_explicit_end,tc)7748983acc8SRobert Clausecker ATF_TC_BODY(memset_explicit_end, tc)
7758983acc8SRobert Clausecker {
7768983acc8SRobert Clausecker #define BUF &__stack.__buf
7778983acc8SRobert Clausecker struct {
7788983acc8SRobert Clausecker uint8_t padding_l;
7798983acc8SRobert Clausecker unsigned char __buf[42];
7808983acc8SRobert Clausecker uint8_t padding_r;
7818983acc8SRobert Clausecker } __stack;
7828983acc8SRobert Clausecker const size_t __bufsz __unused = sizeof(__stack.__buf);
7838983acc8SRobert Clausecker const size_t __len = 42;
7848983acc8SRobert Clausecker const size_t __idx __unused = __len - 1;
7858983acc8SRobert Clausecker
7868983acc8SRobert Clausecker memset_explicit(__stack.__buf, 0, __len);
7878983acc8SRobert Clausecker #undef BUF
7888983acc8SRobert Clausecker
7898983acc8SRobert Clausecker }
7908983acc8SRobert Clausecker
79109cdbf04SKyle Evans ATF_TC(memset_explicit_heap_before_end);
ATF_TC_HEAD(memset_explicit_heap_before_end,tc)79209cdbf04SKyle Evans ATF_TC_HEAD(memset_explicit_heap_before_end, tc)
79309cdbf04SKyle Evans {
79409cdbf04SKyle Evans }
ATF_TC_BODY(memset_explicit_heap_before_end,tc)7958983acc8SRobert Clausecker ATF_TC_BODY(memset_explicit_heap_before_end, tc)
7968983acc8SRobert Clausecker {
7978983acc8SRobert Clausecker #define BUF __stack.__buf
7988983acc8SRobert Clausecker struct {
7998983acc8SRobert Clausecker uint8_t padding_l;
8008983acc8SRobert Clausecker unsigned char * __buf;
8018983acc8SRobert Clausecker uint8_t padding_r;
8028983acc8SRobert Clausecker } __stack;
8038983acc8SRobert Clausecker const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
8048983acc8SRobert Clausecker const size_t __len = 42 - 1;
8058983acc8SRobert Clausecker const size_t __idx __unused = __len - 1;
8068983acc8SRobert Clausecker
8078983acc8SRobert Clausecker __stack.__buf = malloc(__bufsz);
8088983acc8SRobert Clausecker
8098983acc8SRobert Clausecker memset_explicit(__stack.__buf, 0, __len);
8108983acc8SRobert Clausecker #undef BUF
8118983acc8SRobert Clausecker
8128983acc8SRobert Clausecker }
8138983acc8SRobert Clausecker
81409cdbf04SKyle Evans ATF_TC(memset_explicit_heap_end);
ATF_TC_HEAD(memset_explicit_heap_end,tc)81509cdbf04SKyle Evans ATF_TC_HEAD(memset_explicit_heap_end, tc)
81609cdbf04SKyle Evans {
81709cdbf04SKyle Evans }
ATF_TC_BODY(memset_explicit_heap_end,tc)8188983acc8SRobert Clausecker ATF_TC_BODY(memset_explicit_heap_end, tc)
8198983acc8SRobert Clausecker {
8208983acc8SRobert Clausecker #define BUF __stack.__buf
8218983acc8SRobert Clausecker struct {
8228983acc8SRobert Clausecker uint8_t padding_l;
8238983acc8SRobert Clausecker unsigned char * __buf;
8248983acc8SRobert Clausecker uint8_t padding_r;
8258983acc8SRobert Clausecker } __stack;
8268983acc8SRobert Clausecker const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
8278983acc8SRobert Clausecker const size_t __len = 42;
8288983acc8SRobert Clausecker const size_t __idx __unused = __len - 1;
8298983acc8SRobert Clausecker
8308983acc8SRobert Clausecker __stack.__buf = malloc(__bufsz);
8318983acc8SRobert Clausecker
8328983acc8SRobert Clausecker memset_explicit(__stack.__buf, 0, __len);
8338983acc8SRobert Clausecker #undef BUF
8348983acc8SRobert Clausecker
8358983acc8SRobert Clausecker }
8368983acc8SRobert Clausecker
83709cdbf04SKyle Evans ATF_TC(memset_explicit_heap_after_end);
ATF_TC_HEAD(memset_explicit_heap_after_end,tc)83809cdbf04SKyle Evans ATF_TC_HEAD(memset_explicit_heap_after_end, tc)
83909cdbf04SKyle Evans {
84009cdbf04SKyle Evans }
ATF_TC_BODY(memset_explicit_heap_after_end,tc)8418983acc8SRobert Clausecker ATF_TC_BODY(memset_explicit_heap_after_end, tc)
8428983acc8SRobert Clausecker {
8438983acc8SRobert Clausecker #define BUF __stack.__buf
8448983acc8SRobert Clausecker struct {
8458983acc8SRobert Clausecker uint8_t padding_l;
8468983acc8SRobert Clausecker unsigned char * __buf;
8478983acc8SRobert Clausecker uint8_t padding_r;
8488983acc8SRobert Clausecker } __stack;
8498983acc8SRobert Clausecker const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
8508983acc8SRobert Clausecker const size_t __len = 42 + 1;
8518983acc8SRobert Clausecker const size_t __idx __unused = __len - 1;
8528983acc8SRobert Clausecker pid_t __child;
8538983acc8SRobert Clausecker int __status;
8548983acc8SRobert Clausecker
8558983acc8SRobert Clausecker __child = fork();
8568983acc8SRobert Clausecker ATF_REQUIRE(__child >= 0);
8578983acc8SRobert Clausecker if (__child > 0)
8588983acc8SRobert Clausecker goto monitor;
8598983acc8SRobert Clausecker
8608983acc8SRobert Clausecker /* Child */
8618983acc8SRobert Clausecker disable_coredumps();
8628983acc8SRobert Clausecker __stack.__buf = malloc(__bufsz);
8638983acc8SRobert Clausecker
8648983acc8SRobert Clausecker memset_explicit(__stack.__buf, 0, __len);
8658983acc8SRobert Clausecker _exit(EX_SOFTWARE); /* Should have aborted. */
8668983acc8SRobert Clausecker
8678983acc8SRobert Clausecker monitor:
8688983acc8SRobert Clausecker while (waitpid(__child, &__status, 0) != __child) {
8698983acc8SRobert Clausecker ATF_REQUIRE_EQ(EINTR, errno);
8708983acc8SRobert Clausecker }
8718983acc8SRobert Clausecker
8728983acc8SRobert Clausecker if (!WIFSIGNALED(__status)) {
8738983acc8SRobert Clausecker switch (WEXITSTATUS(__status)) {
8748983acc8SRobert Clausecker case EX_SOFTWARE:
8758983acc8SRobert Clausecker atf_tc_fail("FORTIFY_SOURCE failed to abort");
8768983acc8SRobert Clausecker break;
8778983acc8SRobert Clausecker case EX_OSERR:
8788983acc8SRobert Clausecker atf_tc_fail("setrlimit(2) failed");
8798983acc8SRobert Clausecker break;
8808983acc8SRobert Clausecker default:
8818983acc8SRobert Clausecker atf_tc_fail("child exited with status %d",
8828983acc8SRobert Clausecker WEXITSTATUS(__status));
8838983acc8SRobert Clausecker }
8848983acc8SRobert Clausecker } else {
8858983acc8SRobert Clausecker ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
8868983acc8SRobert Clausecker }
8878983acc8SRobert Clausecker #undef BUF
8888983acc8SRobert Clausecker
8898983acc8SRobert Clausecker }
8908983acc8SRobert Clausecker
89109cdbf04SKyle Evans ATF_TC(stpcpy_before_end);
ATF_TC_HEAD(stpcpy_before_end,tc)89209cdbf04SKyle Evans ATF_TC_HEAD(stpcpy_before_end, tc)
89309cdbf04SKyle Evans {
89409cdbf04SKyle Evans }
ATF_TC_BODY(stpcpy_before_end,tc)895020d003cSKyle Evans ATF_TC_BODY(stpcpy_before_end, tc)
896020d003cSKyle Evans {
897020d003cSKyle Evans #define BUF &__stack.__buf
898020d003cSKyle Evans struct {
899020d003cSKyle Evans uint8_t padding_l;
900020d003cSKyle Evans unsigned char __buf[42];
901020d003cSKyle Evans uint8_t padding_r;
902020d003cSKyle Evans } __stack;
903020d003cSKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
904020d003cSKyle Evans const size_t __len = 42 - 1;
905020d003cSKyle Evans const size_t __idx __unused = __len - 1;
906020d003cSKyle Evans char src[__len];
907020d003cSKyle Evans
908020d003cSKyle Evans memset(__stack.__buf, 0, __len);
909020d003cSKyle Evans memset(src, 'A', __len - 1);
910020d003cSKyle Evans src[__len - 1] = '\0';
911020d003cSKyle Evans
912020d003cSKyle Evans stpcpy(__stack.__buf, src);
913020d003cSKyle Evans #undef BUF
914020d003cSKyle Evans
915020d003cSKyle Evans }
916020d003cSKyle Evans
91709cdbf04SKyle Evans ATF_TC(stpcpy_end);
ATF_TC_HEAD(stpcpy_end,tc)91809cdbf04SKyle Evans ATF_TC_HEAD(stpcpy_end, tc)
91909cdbf04SKyle Evans {
92009cdbf04SKyle Evans }
ATF_TC_BODY(stpcpy_end,tc)921020d003cSKyle Evans ATF_TC_BODY(stpcpy_end, tc)
922020d003cSKyle Evans {
923020d003cSKyle Evans #define BUF &__stack.__buf
924020d003cSKyle Evans struct {
925020d003cSKyle Evans uint8_t padding_l;
926020d003cSKyle Evans unsigned char __buf[42];
927020d003cSKyle Evans uint8_t padding_r;
928020d003cSKyle Evans } __stack;
929020d003cSKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
930020d003cSKyle Evans const size_t __len = 42;
931020d003cSKyle Evans const size_t __idx __unused = __len - 1;
932020d003cSKyle Evans char src[__len];
933020d003cSKyle Evans
934020d003cSKyle Evans memset(__stack.__buf, 0, __len);
935020d003cSKyle Evans memset(src, 'A', __len - 1);
936020d003cSKyle Evans src[__len - 1] = '\0';
937020d003cSKyle Evans
938020d003cSKyle Evans stpcpy(__stack.__buf, src);
939020d003cSKyle Evans #undef BUF
940020d003cSKyle Evans
941020d003cSKyle Evans }
942020d003cSKyle Evans
94309cdbf04SKyle Evans ATF_TC(stpcpy_heap_before_end);
ATF_TC_HEAD(stpcpy_heap_before_end,tc)94409cdbf04SKyle Evans ATF_TC_HEAD(stpcpy_heap_before_end, tc)
94509cdbf04SKyle Evans {
94609cdbf04SKyle Evans }
ATF_TC_BODY(stpcpy_heap_before_end,tc)947020d003cSKyle Evans ATF_TC_BODY(stpcpy_heap_before_end, tc)
948020d003cSKyle Evans {
949020d003cSKyle Evans #define BUF __stack.__buf
950020d003cSKyle Evans struct {
951020d003cSKyle Evans uint8_t padding_l;
952020d003cSKyle Evans unsigned char * __buf;
953020d003cSKyle Evans uint8_t padding_r;
954020d003cSKyle Evans } __stack;
955020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
956020d003cSKyle Evans const size_t __len = 42 - 1;
957020d003cSKyle Evans const size_t __idx __unused = __len - 1;
958020d003cSKyle Evans char src[__len];
959020d003cSKyle Evans
960020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
961020d003cSKyle Evans memset(__stack.__buf, 0, __len);
962020d003cSKyle Evans memset(src, 'A', __len - 1);
963020d003cSKyle Evans src[__len - 1] = '\0';
964020d003cSKyle Evans
965020d003cSKyle Evans stpcpy(__stack.__buf, src);
966020d003cSKyle Evans #undef BUF
967020d003cSKyle Evans
968020d003cSKyle Evans }
969020d003cSKyle Evans
97009cdbf04SKyle Evans ATF_TC(stpcpy_heap_end);
ATF_TC_HEAD(stpcpy_heap_end,tc)97109cdbf04SKyle Evans ATF_TC_HEAD(stpcpy_heap_end, tc)
97209cdbf04SKyle Evans {
97309cdbf04SKyle Evans }
ATF_TC_BODY(stpcpy_heap_end,tc)974020d003cSKyle Evans ATF_TC_BODY(stpcpy_heap_end, tc)
975020d003cSKyle Evans {
976020d003cSKyle Evans #define BUF __stack.__buf
977020d003cSKyle Evans struct {
978020d003cSKyle Evans uint8_t padding_l;
979020d003cSKyle Evans unsigned char * __buf;
980020d003cSKyle Evans uint8_t padding_r;
981020d003cSKyle Evans } __stack;
982020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
983020d003cSKyle Evans const size_t __len = 42;
984020d003cSKyle Evans const size_t __idx __unused = __len - 1;
985020d003cSKyle Evans char src[__len];
986020d003cSKyle Evans
987020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
988020d003cSKyle Evans memset(__stack.__buf, 0, __len);
989020d003cSKyle Evans memset(src, 'A', __len - 1);
990020d003cSKyle Evans src[__len - 1] = '\0';
991020d003cSKyle Evans
992020d003cSKyle Evans stpcpy(__stack.__buf, src);
993020d003cSKyle Evans #undef BUF
994020d003cSKyle Evans
995020d003cSKyle Evans }
996020d003cSKyle Evans
99709cdbf04SKyle Evans ATF_TC(stpcpy_heap_after_end);
ATF_TC_HEAD(stpcpy_heap_after_end,tc)99809cdbf04SKyle Evans ATF_TC_HEAD(stpcpy_heap_after_end, tc)
99909cdbf04SKyle Evans {
100009cdbf04SKyle Evans }
ATF_TC_BODY(stpcpy_heap_after_end,tc)1001020d003cSKyle Evans ATF_TC_BODY(stpcpy_heap_after_end, tc)
1002020d003cSKyle Evans {
1003020d003cSKyle Evans #define BUF __stack.__buf
1004020d003cSKyle Evans struct {
1005020d003cSKyle Evans uint8_t padding_l;
1006020d003cSKyle Evans unsigned char * __buf;
1007020d003cSKyle Evans uint8_t padding_r;
1008020d003cSKyle Evans } __stack;
1009020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1010020d003cSKyle Evans const size_t __len = 42 + 1;
1011020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1012020d003cSKyle Evans pid_t __child;
1013020d003cSKyle Evans int __status;
1014020d003cSKyle Evans char src[__len];
1015020d003cSKyle Evans
1016020d003cSKyle Evans __child = fork();
1017020d003cSKyle Evans ATF_REQUIRE(__child >= 0);
1018020d003cSKyle Evans if (__child > 0)
1019020d003cSKyle Evans goto monitor;
1020020d003cSKyle Evans
1021020d003cSKyle Evans /* Child */
1022020d003cSKyle Evans disable_coredumps();
1023020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
1024020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1025020d003cSKyle Evans memset(src, 'A', __len - 1);
1026020d003cSKyle Evans src[__len - 1] = '\0';
1027020d003cSKyle Evans
1028020d003cSKyle Evans stpcpy(__stack.__buf, src);
1029020d003cSKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
1030020d003cSKyle Evans
1031020d003cSKyle Evans monitor:
1032020d003cSKyle Evans while (waitpid(__child, &__status, 0) != __child) {
1033020d003cSKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
1034020d003cSKyle Evans }
1035020d003cSKyle Evans
1036020d003cSKyle Evans if (!WIFSIGNALED(__status)) {
1037020d003cSKyle Evans switch (WEXITSTATUS(__status)) {
1038020d003cSKyle Evans case EX_SOFTWARE:
1039020d003cSKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
1040020d003cSKyle Evans break;
1041020d003cSKyle Evans case EX_OSERR:
1042020d003cSKyle Evans atf_tc_fail("setrlimit(2) failed");
1043020d003cSKyle Evans break;
1044020d003cSKyle Evans default:
1045020d003cSKyle Evans atf_tc_fail("child exited with status %d",
1046020d003cSKyle Evans WEXITSTATUS(__status));
1047020d003cSKyle Evans }
1048020d003cSKyle Evans } else {
1049020d003cSKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
1050020d003cSKyle Evans }
1051020d003cSKyle Evans #undef BUF
1052020d003cSKyle Evans
1053020d003cSKyle Evans }
1054020d003cSKyle Evans
105509cdbf04SKyle Evans ATF_TC(stpncpy_before_end);
ATF_TC_HEAD(stpncpy_before_end,tc)105609cdbf04SKyle Evans ATF_TC_HEAD(stpncpy_before_end, tc)
105709cdbf04SKyle Evans {
105809cdbf04SKyle Evans }
ATF_TC_BODY(stpncpy_before_end,tc)1059020d003cSKyle Evans ATF_TC_BODY(stpncpy_before_end, tc)
1060020d003cSKyle Evans {
1061020d003cSKyle Evans #define BUF &__stack.__buf
1062020d003cSKyle Evans struct {
1063020d003cSKyle Evans uint8_t padding_l;
1064020d003cSKyle Evans unsigned char __buf[42];
1065020d003cSKyle Evans uint8_t padding_r;
1066020d003cSKyle Evans } __stack;
1067020d003cSKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1068020d003cSKyle Evans const size_t __len = 42 - 1;
1069020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1070020d003cSKyle Evans char src[__len];
1071020d003cSKyle Evans
1072020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1073020d003cSKyle Evans memset(src, 'A', __len - 1);
1074020d003cSKyle Evans src[__len - 1] = '\0';
1075020d003cSKyle Evans
1076020d003cSKyle Evans stpncpy(__stack.__buf, src, __len);
1077020d003cSKyle Evans #undef BUF
1078020d003cSKyle Evans
1079020d003cSKyle Evans }
1080020d003cSKyle Evans
108109cdbf04SKyle Evans ATF_TC(stpncpy_end);
ATF_TC_HEAD(stpncpy_end,tc)108209cdbf04SKyle Evans ATF_TC_HEAD(stpncpy_end, tc)
108309cdbf04SKyle Evans {
108409cdbf04SKyle Evans }
ATF_TC_BODY(stpncpy_end,tc)1085020d003cSKyle Evans ATF_TC_BODY(stpncpy_end, tc)
1086020d003cSKyle Evans {
1087020d003cSKyle Evans #define BUF &__stack.__buf
1088020d003cSKyle Evans struct {
1089020d003cSKyle Evans uint8_t padding_l;
1090020d003cSKyle Evans unsigned char __buf[42];
1091020d003cSKyle Evans uint8_t padding_r;
1092020d003cSKyle Evans } __stack;
1093020d003cSKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1094020d003cSKyle Evans const size_t __len = 42;
1095020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1096020d003cSKyle Evans char src[__len];
1097020d003cSKyle Evans
1098020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1099020d003cSKyle Evans memset(src, 'A', __len - 1);
1100020d003cSKyle Evans src[__len - 1] = '\0';
1101020d003cSKyle Evans
1102020d003cSKyle Evans stpncpy(__stack.__buf, src, __len);
1103020d003cSKyle Evans #undef BUF
1104020d003cSKyle Evans
1105020d003cSKyle Evans }
1106020d003cSKyle Evans
110709cdbf04SKyle Evans ATF_TC(stpncpy_heap_before_end);
ATF_TC_HEAD(stpncpy_heap_before_end,tc)110809cdbf04SKyle Evans ATF_TC_HEAD(stpncpy_heap_before_end, tc)
110909cdbf04SKyle Evans {
111009cdbf04SKyle Evans }
ATF_TC_BODY(stpncpy_heap_before_end,tc)1111020d003cSKyle Evans ATF_TC_BODY(stpncpy_heap_before_end, tc)
1112020d003cSKyle Evans {
1113020d003cSKyle Evans #define BUF __stack.__buf
1114020d003cSKyle Evans struct {
1115020d003cSKyle Evans uint8_t padding_l;
1116020d003cSKyle Evans unsigned char * __buf;
1117020d003cSKyle Evans uint8_t padding_r;
1118020d003cSKyle Evans } __stack;
1119020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1120020d003cSKyle Evans const size_t __len = 42 - 1;
1121020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1122020d003cSKyle Evans char src[__len];
1123020d003cSKyle Evans
1124020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
1125020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1126020d003cSKyle Evans memset(src, 'A', __len - 1);
1127020d003cSKyle Evans src[__len - 1] = '\0';
1128020d003cSKyle Evans
1129020d003cSKyle Evans stpncpy(__stack.__buf, src, __len);
1130020d003cSKyle Evans #undef BUF
1131020d003cSKyle Evans
1132020d003cSKyle Evans }
1133020d003cSKyle Evans
113409cdbf04SKyle Evans ATF_TC(stpncpy_heap_end);
ATF_TC_HEAD(stpncpy_heap_end,tc)113509cdbf04SKyle Evans ATF_TC_HEAD(stpncpy_heap_end, tc)
113609cdbf04SKyle Evans {
113709cdbf04SKyle Evans }
ATF_TC_BODY(stpncpy_heap_end,tc)1138020d003cSKyle Evans ATF_TC_BODY(stpncpy_heap_end, tc)
1139020d003cSKyle Evans {
1140020d003cSKyle Evans #define BUF __stack.__buf
1141020d003cSKyle Evans struct {
1142020d003cSKyle Evans uint8_t padding_l;
1143020d003cSKyle Evans unsigned char * __buf;
1144020d003cSKyle Evans uint8_t padding_r;
1145020d003cSKyle Evans } __stack;
1146020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1147020d003cSKyle Evans const size_t __len = 42;
1148020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1149020d003cSKyle Evans char src[__len];
1150020d003cSKyle Evans
1151020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
1152020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1153020d003cSKyle Evans memset(src, 'A', __len - 1);
1154020d003cSKyle Evans src[__len - 1] = '\0';
1155020d003cSKyle Evans
1156020d003cSKyle Evans stpncpy(__stack.__buf, src, __len);
1157020d003cSKyle Evans #undef BUF
1158020d003cSKyle Evans
1159020d003cSKyle Evans }
1160020d003cSKyle Evans
116109cdbf04SKyle Evans ATF_TC(stpncpy_heap_after_end);
ATF_TC_HEAD(stpncpy_heap_after_end,tc)116209cdbf04SKyle Evans ATF_TC_HEAD(stpncpy_heap_after_end, tc)
116309cdbf04SKyle Evans {
116409cdbf04SKyle Evans }
ATF_TC_BODY(stpncpy_heap_after_end,tc)1165020d003cSKyle Evans ATF_TC_BODY(stpncpy_heap_after_end, tc)
1166020d003cSKyle Evans {
1167020d003cSKyle Evans #define BUF __stack.__buf
1168020d003cSKyle Evans struct {
1169020d003cSKyle Evans uint8_t padding_l;
1170020d003cSKyle Evans unsigned char * __buf;
1171020d003cSKyle Evans uint8_t padding_r;
1172020d003cSKyle Evans } __stack;
1173020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1174020d003cSKyle Evans const size_t __len = 42 + 1;
1175020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1176020d003cSKyle Evans pid_t __child;
1177020d003cSKyle Evans int __status;
1178020d003cSKyle Evans char src[__len];
1179020d003cSKyle Evans
1180020d003cSKyle Evans __child = fork();
1181020d003cSKyle Evans ATF_REQUIRE(__child >= 0);
1182020d003cSKyle Evans if (__child > 0)
1183020d003cSKyle Evans goto monitor;
1184020d003cSKyle Evans
1185020d003cSKyle Evans /* Child */
1186020d003cSKyle Evans disable_coredumps();
1187020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
1188020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1189020d003cSKyle Evans memset(src, 'A', __len - 1);
1190020d003cSKyle Evans src[__len - 1] = '\0';
1191020d003cSKyle Evans
1192020d003cSKyle Evans stpncpy(__stack.__buf, src, __len);
1193020d003cSKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
1194020d003cSKyle Evans
1195020d003cSKyle Evans monitor:
1196020d003cSKyle Evans while (waitpid(__child, &__status, 0) != __child) {
1197020d003cSKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
1198020d003cSKyle Evans }
1199020d003cSKyle Evans
1200020d003cSKyle Evans if (!WIFSIGNALED(__status)) {
1201020d003cSKyle Evans switch (WEXITSTATUS(__status)) {
1202020d003cSKyle Evans case EX_SOFTWARE:
1203020d003cSKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
1204020d003cSKyle Evans break;
1205020d003cSKyle Evans case EX_OSERR:
1206020d003cSKyle Evans atf_tc_fail("setrlimit(2) failed");
1207020d003cSKyle Evans break;
1208020d003cSKyle Evans default:
1209020d003cSKyle Evans atf_tc_fail("child exited with status %d",
1210020d003cSKyle Evans WEXITSTATUS(__status));
1211020d003cSKyle Evans }
1212020d003cSKyle Evans } else {
1213020d003cSKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
1214020d003cSKyle Evans }
1215020d003cSKyle Evans #undef BUF
1216020d003cSKyle Evans
1217020d003cSKyle Evans }
1218020d003cSKyle Evans
121909cdbf04SKyle Evans ATF_TC(strcat_before_end);
ATF_TC_HEAD(strcat_before_end,tc)122009cdbf04SKyle Evans ATF_TC_HEAD(strcat_before_end, tc)
122109cdbf04SKyle Evans {
122209cdbf04SKyle Evans }
ATF_TC_BODY(strcat_before_end,tc)1223020d003cSKyle Evans ATF_TC_BODY(strcat_before_end, tc)
1224020d003cSKyle Evans {
1225020d003cSKyle Evans #define BUF &__stack.__buf
1226020d003cSKyle Evans struct {
1227020d003cSKyle Evans uint8_t padding_l;
1228020d003cSKyle Evans unsigned char __buf[42];
1229020d003cSKyle Evans uint8_t padding_r;
1230020d003cSKyle Evans } __stack;
1231020d003cSKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1232020d003cSKyle Evans const size_t __len = 42 - 1;
1233020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1234020d003cSKyle Evans char src[__len];
1235020d003cSKyle Evans
1236020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1237020d003cSKyle Evans memset(src, 'A', __len - 1);
1238020d003cSKyle Evans src[__len - 1] = '\0';
1239020d003cSKyle Evans
1240020d003cSKyle Evans strcat(__stack.__buf, src);
1241020d003cSKyle Evans #undef BUF
1242020d003cSKyle Evans
1243020d003cSKyle Evans }
1244020d003cSKyle Evans
124509cdbf04SKyle Evans ATF_TC(strcat_end);
ATF_TC_HEAD(strcat_end,tc)124609cdbf04SKyle Evans ATF_TC_HEAD(strcat_end, tc)
124709cdbf04SKyle Evans {
124809cdbf04SKyle Evans }
ATF_TC_BODY(strcat_end,tc)1249020d003cSKyle Evans ATF_TC_BODY(strcat_end, tc)
1250020d003cSKyle Evans {
1251020d003cSKyle Evans #define BUF &__stack.__buf
1252020d003cSKyle Evans struct {
1253020d003cSKyle Evans uint8_t padding_l;
1254020d003cSKyle Evans unsigned char __buf[42];
1255020d003cSKyle Evans uint8_t padding_r;
1256020d003cSKyle Evans } __stack;
1257020d003cSKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1258020d003cSKyle Evans const size_t __len = 42;
1259020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1260020d003cSKyle Evans char src[__len];
1261020d003cSKyle Evans
1262020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1263020d003cSKyle Evans memset(src, 'A', __len - 1);
1264020d003cSKyle Evans src[__len - 1] = '\0';
1265020d003cSKyle Evans
1266020d003cSKyle Evans strcat(__stack.__buf, src);
1267020d003cSKyle Evans #undef BUF
1268020d003cSKyle Evans
1269020d003cSKyle Evans }
1270020d003cSKyle Evans
127109cdbf04SKyle Evans ATF_TC(strcat_heap_before_end);
ATF_TC_HEAD(strcat_heap_before_end,tc)127209cdbf04SKyle Evans ATF_TC_HEAD(strcat_heap_before_end, tc)
127309cdbf04SKyle Evans {
127409cdbf04SKyle Evans }
ATF_TC_BODY(strcat_heap_before_end,tc)1275020d003cSKyle Evans ATF_TC_BODY(strcat_heap_before_end, tc)
1276020d003cSKyle Evans {
1277020d003cSKyle Evans #define BUF __stack.__buf
1278020d003cSKyle Evans struct {
1279020d003cSKyle Evans uint8_t padding_l;
1280020d003cSKyle Evans unsigned char * __buf;
1281020d003cSKyle Evans uint8_t padding_r;
1282020d003cSKyle Evans } __stack;
1283020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1284020d003cSKyle Evans const size_t __len = 42 - 1;
1285020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1286020d003cSKyle Evans char src[__len];
1287020d003cSKyle Evans
1288020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
1289020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1290020d003cSKyle Evans memset(src, 'A', __len - 1);
1291020d003cSKyle Evans src[__len - 1] = '\0';
1292020d003cSKyle Evans
1293020d003cSKyle Evans strcat(__stack.__buf, src);
1294020d003cSKyle Evans #undef BUF
1295020d003cSKyle Evans
1296020d003cSKyle Evans }
1297020d003cSKyle Evans
129809cdbf04SKyle Evans ATF_TC(strcat_heap_end);
ATF_TC_HEAD(strcat_heap_end,tc)129909cdbf04SKyle Evans ATF_TC_HEAD(strcat_heap_end, tc)
130009cdbf04SKyle Evans {
130109cdbf04SKyle Evans }
ATF_TC_BODY(strcat_heap_end,tc)1302020d003cSKyle Evans ATF_TC_BODY(strcat_heap_end, tc)
1303020d003cSKyle Evans {
1304020d003cSKyle Evans #define BUF __stack.__buf
1305020d003cSKyle Evans struct {
1306020d003cSKyle Evans uint8_t padding_l;
1307020d003cSKyle Evans unsigned char * __buf;
1308020d003cSKyle Evans uint8_t padding_r;
1309020d003cSKyle Evans } __stack;
1310020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1311020d003cSKyle Evans const size_t __len = 42;
1312020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1313020d003cSKyle Evans char src[__len];
1314020d003cSKyle Evans
1315020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
1316020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1317020d003cSKyle Evans memset(src, 'A', __len - 1);
1318020d003cSKyle Evans src[__len - 1] = '\0';
1319020d003cSKyle Evans
1320020d003cSKyle Evans strcat(__stack.__buf, src);
1321020d003cSKyle Evans #undef BUF
1322020d003cSKyle Evans
1323020d003cSKyle Evans }
1324020d003cSKyle Evans
132509cdbf04SKyle Evans ATF_TC(strcat_heap_after_end);
ATF_TC_HEAD(strcat_heap_after_end,tc)132609cdbf04SKyle Evans ATF_TC_HEAD(strcat_heap_after_end, tc)
132709cdbf04SKyle Evans {
132809cdbf04SKyle Evans }
ATF_TC_BODY(strcat_heap_after_end,tc)1329020d003cSKyle Evans ATF_TC_BODY(strcat_heap_after_end, tc)
1330020d003cSKyle Evans {
1331020d003cSKyle Evans #define BUF __stack.__buf
1332020d003cSKyle Evans struct {
1333020d003cSKyle Evans uint8_t padding_l;
1334020d003cSKyle Evans unsigned char * __buf;
1335020d003cSKyle Evans uint8_t padding_r;
1336020d003cSKyle Evans } __stack;
1337020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1338020d003cSKyle Evans const size_t __len = 42 + 1;
1339020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1340020d003cSKyle Evans pid_t __child;
1341020d003cSKyle Evans int __status;
1342020d003cSKyle Evans char src[__len];
1343020d003cSKyle Evans
1344020d003cSKyle Evans __child = fork();
1345020d003cSKyle Evans ATF_REQUIRE(__child >= 0);
1346020d003cSKyle Evans if (__child > 0)
1347020d003cSKyle Evans goto monitor;
1348020d003cSKyle Evans
1349020d003cSKyle Evans /* Child */
1350020d003cSKyle Evans disable_coredumps();
1351020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
1352020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1353020d003cSKyle Evans memset(src, 'A', __len - 1);
1354020d003cSKyle Evans src[__len - 1] = '\0';
1355020d003cSKyle Evans
1356020d003cSKyle Evans strcat(__stack.__buf, src);
1357020d003cSKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
1358020d003cSKyle Evans
1359020d003cSKyle Evans monitor:
1360020d003cSKyle Evans while (waitpid(__child, &__status, 0) != __child) {
1361020d003cSKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
1362020d003cSKyle Evans }
1363020d003cSKyle Evans
1364020d003cSKyle Evans if (!WIFSIGNALED(__status)) {
1365020d003cSKyle Evans switch (WEXITSTATUS(__status)) {
1366020d003cSKyle Evans case EX_SOFTWARE:
1367020d003cSKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
1368020d003cSKyle Evans break;
1369020d003cSKyle Evans case EX_OSERR:
1370020d003cSKyle Evans atf_tc_fail("setrlimit(2) failed");
1371020d003cSKyle Evans break;
1372020d003cSKyle Evans default:
1373020d003cSKyle Evans atf_tc_fail("child exited with status %d",
1374020d003cSKyle Evans WEXITSTATUS(__status));
1375020d003cSKyle Evans }
1376020d003cSKyle Evans } else {
1377020d003cSKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
1378020d003cSKyle Evans }
1379020d003cSKyle Evans #undef BUF
1380020d003cSKyle Evans
1381020d003cSKyle Evans }
1382020d003cSKyle Evans
138309cdbf04SKyle Evans ATF_TC(strlcat_before_end);
ATF_TC_HEAD(strlcat_before_end,tc)138409cdbf04SKyle Evans ATF_TC_HEAD(strlcat_before_end, tc)
138509cdbf04SKyle Evans {
138609cdbf04SKyle Evans }
ATF_TC_BODY(strlcat_before_end,tc)1387cf8e5289SKyle Evans ATF_TC_BODY(strlcat_before_end, tc)
1388cf8e5289SKyle Evans {
1389cf8e5289SKyle Evans #define BUF &__stack.__buf
1390cf8e5289SKyle Evans struct {
1391cf8e5289SKyle Evans uint8_t padding_l;
1392cf8e5289SKyle Evans unsigned char __buf[42];
1393cf8e5289SKyle Evans uint8_t padding_r;
1394cf8e5289SKyle Evans } __stack;
1395cf8e5289SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1396cf8e5289SKyle Evans const size_t __len = 42 - 1;
1397cf8e5289SKyle Evans const size_t __idx __unused = __len - 1;
1398cf8e5289SKyle Evans char src[__len];
1399cf8e5289SKyle Evans
1400cf8e5289SKyle Evans memset(__stack.__buf, 0, __len);
1401cf8e5289SKyle Evans memset(src, 'A', __len - 1);
1402cf8e5289SKyle Evans src[__len - 1] = '\0';
1403cf8e5289SKyle Evans
1404cf8e5289SKyle Evans strlcat(__stack.__buf, src, __len);
1405cf8e5289SKyle Evans #undef BUF
1406cf8e5289SKyle Evans
1407cf8e5289SKyle Evans }
1408cf8e5289SKyle Evans
140909cdbf04SKyle Evans ATF_TC(strlcat_end);
ATF_TC_HEAD(strlcat_end,tc)141009cdbf04SKyle Evans ATF_TC_HEAD(strlcat_end, tc)
141109cdbf04SKyle Evans {
141209cdbf04SKyle Evans }
ATF_TC_BODY(strlcat_end,tc)1413cf8e5289SKyle Evans ATF_TC_BODY(strlcat_end, tc)
1414cf8e5289SKyle Evans {
1415cf8e5289SKyle Evans #define BUF &__stack.__buf
1416cf8e5289SKyle Evans struct {
1417cf8e5289SKyle Evans uint8_t padding_l;
1418cf8e5289SKyle Evans unsigned char __buf[42];
1419cf8e5289SKyle Evans uint8_t padding_r;
1420cf8e5289SKyle Evans } __stack;
1421cf8e5289SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1422cf8e5289SKyle Evans const size_t __len = 42;
1423cf8e5289SKyle Evans const size_t __idx __unused = __len - 1;
1424cf8e5289SKyle Evans char src[__len];
1425cf8e5289SKyle Evans
1426cf8e5289SKyle Evans memset(__stack.__buf, 0, __len);
1427cf8e5289SKyle Evans memset(src, 'A', __len - 1);
1428cf8e5289SKyle Evans src[__len - 1] = '\0';
1429cf8e5289SKyle Evans
1430cf8e5289SKyle Evans strlcat(__stack.__buf, src, __len);
1431cf8e5289SKyle Evans #undef BUF
1432cf8e5289SKyle Evans
1433cf8e5289SKyle Evans }
1434cf8e5289SKyle Evans
143509cdbf04SKyle Evans ATF_TC(strlcat_heap_before_end);
ATF_TC_HEAD(strlcat_heap_before_end,tc)143609cdbf04SKyle Evans ATF_TC_HEAD(strlcat_heap_before_end, tc)
143709cdbf04SKyle Evans {
143809cdbf04SKyle Evans }
ATF_TC_BODY(strlcat_heap_before_end,tc)1439cf8e5289SKyle Evans ATF_TC_BODY(strlcat_heap_before_end, tc)
1440cf8e5289SKyle Evans {
1441cf8e5289SKyle Evans #define BUF __stack.__buf
1442cf8e5289SKyle Evans struct {
1443cf8e5289SKyle Evans uint8_t padding_l;
1444cf8e5289SKyle Evans unsigned char * __buf;
1445cf8e5289SKyle Evans uint8_t padding_r;
1446cf8e5289SKyle Evans } __stack;
1447cf8e5289SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1448cf8e5289SKyle Evans const size_t __len = 42 - 1;
1449cf8e5289SKyle Evans const size_t __idx __unused = __len - 1;
1450cf8e5289SKyle Evans char src[__len];
1451cf8e5289SKyle Evans
1452cf8e5289SKyle Evans __stack.__buf = malloc(__bufsz);
1453cf8e5289SKyle Evans memset(__stack.__buf, 0, __len);
1454cf8e5289SKyle Evans memset(src, 'A', __len - 1);
1455cf8e5289SKyle Evans src[__len - 1] = '\0';
1456cf8e5289SKyle Evans
1457cf8e5289SKyle Evans strlcat(__stack.__buf, src, __len);
1458cf8e5289SKyle Evans #undef BUF
1459cf8e5289SKyle Evans
1460cf8e5289SKyle Evans }
1461cf8e5289SKyle Evans
146209cdbf04SKyle Evans ATF_TC(strlcat_heap_end);
ATF_TC_HEAD(strlcat_heap_end,tc)146309cdbf04SKyle Evans ATF_TC_HEAD(strlcat_heap_end, tc)
146409cdbf04SKyle Evans {
146509cdbf04SKyle Evans }
ATF_TC_BODY(strlcat_heap_end,tc)1466cf8e5289SKyle Evans ATF_TC_BODY(strlcat_heap_end, tc)
1467cf8e5289SKyle Evans {
1468cf8e5289SKyle Evans #define BUF __stack.__buf
1469cf8e5289SKyle Evans struct {
1470cf8e5289SKyle Evans uint8_t padding_l;
1471cf8e5289SKyle Evans unsigned char * __buf;
1472cf8e5289SKyle Evans uint8_t padding_r;
1473cf8e5289SKyle Evans } __stack;
1474cf8e5289SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1475cf8e5289SKyle Evans const size_t __len = 42;
1476cf8e5289SKyle Evans const size_t __idx __unused = __len - 1;
1477cf8e5289SKyle Evans char src[__len];
1478cf8e5289SKyle Evans
1479cf8e5289SKyle Evans __stack.__buf = malloc(__bufsz);
1480cf8e5289SKyle Evans memset(__stack.__buf, 0, __len);
1481cf8e5289SKyle Evans memset(src, 'A', __len - 1);
1482cf8e5289SKyle Evans src[__len - 1] = '\0';
1483cf8e5289SKyle Evans
1484cf8e5289SKyle Evans strlcat(__stack.__buf, src, __len);
1485cf8e5289SKyle Evans #undef BUF
1486cf8e5289SKyle Evans
1487cf8e5289SKyle Evans }
1488cf8e5289SKyle Evans
148909cdbf04SKyle Evans ATF_TC(strlcat_heap_after_end);
ATF_TC_HEAD(strlcat_heap_after_end,tc)149009cdbf04SKyle Evans ATF_TC_HEAD(strlcat_heap_after_end, tc)
149109cdbf04SKyle Evans {
149209cdbf04SKyle Evans }
ATF_TC_BODY(strlcat_heap_after_end,tc)1493cf8e5289SKyle Evans ATF_TC_BODY(strlcat_heap_after_end, tc)
1494cf8e5289SKyle Evans {
1495cf8e5289SKyle Evans #define BUF __stack.__buf
1496cf8e5289SKyle Evans struct {
1497cf8e5289SKyle Evans uint8_t padding_l;
1498cf8e5289SKyle Evans unsigned char * __buf;
1499cf8e5289SKyle Evans uint8_t padding_r;
1500cf8e5289SKyle Evans } __stack;
1501cf8e5289SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1502cf8e5289SKyle Evans const size_t __len = 42 + 1;
1503cf8e5289SKyle Evans const size_t __idx __unused = __len - 1;
1504cf8e5289SKyle Evans pid_t __child;
1505cf8e5289SKyle Evans int __status;
1506cf8e5289SKyle Evans char src[__len];
1507cf8e5289SKyle Evans
1508cf8e5289SKyle Evans __child = fork();
1509cf8e5289SKyle Evans ATF_REQUIRE(__child >= 0);
1510cf8e5289SKyle Evans if (__child > 0)
1511cf8e5289SKyle Evans goto monitor;
1512cf8e5289SKyle Evans
1513cf8e5289SKyle Evans /* Child */
1514cf8e5289SKyle Evans disable_coredumps();
1515cf8e5289SKyle Evans __stack.__buf = malloc(__bufsz);
1516cf8e5289SKyle Evans memset(__stack.__buf, 0, __len);
1517cf8e5289SKyle Evans memset(src, 'A', __len - 1);
1518cf8e5289SKyle Evans src[__len - 1] = '\0';
1519cf8e5289SKyle Evans
1520cf8e5289SKyle Evans strlcat(__stack.__buf, src, __len);
1521cf8e5289SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
1522cf8e5289SKyle Evans
1523cf8e5289SKyle Evans monitor:
1524cf8e5289SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
1525cf8e5289SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
1526cf8e5289SKyle Evans }
1527cf8e5289SKyle Evans
1528cf8e5289SKyle Evans if (!WIFSIGNALED(__status)) {
1529cf8e5289SKyle Evans switch (WEXITSTATUS(__status)) {
1530cf8e5289SKyle Evans case EX_SOFTWARE:
1531cf8e5289SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
1532cf8e5289SKyle Evans break;
1533cf8e5289SKyle Evans case EX_OSERR:
1534cf8e5289SKyle Evans atf_tc_fail("setrlimit(2) failed");
1535cf8e5289SKyle Evans break;
1536cf8e5289SKyle Evans default:
1537cf8e5289SKyle Evans atf_tc_fail("child exited with status %d",
1538cf8e5289SKyle Evans WEXITSTATUS(__status));
1539cf8e5289SKyle Evans }
1540cf8e5289SKyle Evans } else {
1541cf8e5289SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
1542cf8e5289SKyle Evans }
1543cf8e5289SKyle Evans #undef BUF
1544cf8e5289SKyle Evans
1545cf8e5289SKyle Evans }
1546cf8e5289SKyle Evans
154709cdbf04SKyle Evans ATF_TC(strncat_before_end);
ATF_TC_HEAD(strncat_before_end,tc)154809cdbf04SKyle Evans ATF_TC_HEAD(strncat_before_end, tc)
154909cdbf04SKyle Evans {
155009cdbf04SKyle Evans }
ATF_TC_BODY(strncat_before_end,tc)1551020d003cSKyle Evans ATF_TC_BODY(strncat_before_end, tc)
1552020d003cSKyle Evans {
1553020d003cSKyle Evans #define BUF &__stack.__buf
1554020d003cSKyle Evans struct {
1555020d003cSKyle Evans uint8_t padding_l;
1556020d003cSKyle Evans unsigned char __buf[42];
1557020d003cSKyle Evans uint8_t padding_r;
1558020d003cSKyle Evans } __stack;
1559020d003cSKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1560020d003cSKyle Evans const size_t __len = 42 - 1;
1561020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1562020d003cSKyle Evans char src[__len];
1563020d003cSKyle Evans
1564020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1565020d003cSKyle Evans memset(src, 'A', __len - 1);
1566020d003cSKyle Evans src[__len - 1] = '\0';
1567020d003cSKyle Evans
1568020d003cSKyle Evans strncat(__stack.__buf, src, __len);
1569020d003cSKyle Evans #undef BUF
1570020d003cSKyle Evans
1571020d003cSKyle Evans }
1572020d003cSKyle Evans
157309cdbf04SKyle Evans ATF_TC(strncat_end);
ATF_TC_HEAD(strncat_end,tc)157409cdbf04SKyle Evans ATF_TC_HEAD(strncat_end, tc)
157509cdbf04SKyle Evans {
157609cdbf04SKyle Evans }
ATF_TC_BODY(strncat_end,tc)1577020d003cSKyle Evans ATF_TC_BODY(strncat_end, tc)
1578020d003cSKyle Evans {
1579020d003cSKyle Evans #define BUF &__stack.__buf
1580020d003cSKyle Evans struct {
1581020d003cSKyle Evans uint8_t padding_l;
1582020d003cSKyle Evans unsigned char __buf[42];
1583020d003cSKyle Evans uint8_t padding_r;
1584020d003cSKyle Evans } __stack;
1585020d003cSKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1586020d003cSKyle Evans const size_t __len = 42;
1587020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1588020d003cSKyle Evans char src[__len];
1589020d003cSKyle Evans
1590020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1591020d003cSKyle Evans memset(src, 'A', __len - 1);
1592020d003cSKyle Evans src[__len - 1] = '\0';
1593020d003cSKyle Evans
1594020d003cSKyle Evans strncat(__stack.__buf, src, __len);
1595020d003cSKyle Evans #undef BUF
1596020d003cSKyle Evans
1597020d003cSKyle Evans }
1598020d003cSKyle Evans
159909cdbf04SKyle Evans ATF_TC(strncat_heap_before_end);
ATF_TC_HEAD(strncat_heap_before_end,tc)160009cdbf04SKyle Evans ATF_TC_HEAD(strncat_heap_before_end, tc)
160109cdbf04SKyle Evans {
160209cdbf04SKyle Evans }
ATF_TC_BODY(strncat_heap_before_end,tc)1603020d003cSKyle Evans ATF_TC_BODY(strncat_heap_before_end, tc)
1604020d003cSKyle Evans {
1605020d003cSKyle Evans #define BUF __stack.__buf
1606020d003cSKyle Evans struct {
1607020d003cSKyle Evans uint8_t padding_l;
1608020d003cSKyle Evans unsigned char * __buf;
1609020d003cSKyle Evans uint8_t padding_r;
1610020d003cSKyle Evans } __stack;
1611020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1612020d003cSKyle Evans const size_t __len = 42 - 1;
1613020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1614020d003cSKyle Evans char src[__len];
1615020d003cSKyle Evans
1616020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
1617020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1618020d003cSKyle Evans memset(src, 'A', __len - 1);
1619020d003cSKyle Evans src[__len - 1] = '\0';
1620020d003cSKyle Evans
1621020d003cSKyle Evans strncat(__stack.__buf, src, __len);
1622020d003cSKyle Evans #undef BUF
1623020d003cSKyle Evans
1624020d003cSKyle Evans }
1625020d003cSKyle Evans
162609cdbf04SKyle Evans ATF_TC(strncat_heap_end);
ATF_TC_HEAD(strncat_heap_end,tc)162709cdbf04SKyle Evans ATF_TC_HEAD(strncat_heap_end, tc)
162809cdbf04SKyle Evans {
162909cdbf04SKyle Evans }
ATF_TC_BODY(strncat_heap_end,tc)1630020d003cSKyle Evans ATF_TC_BODY(strncat_heap_end, tc)
1631020d003cSKyle Evans {
1632020d003cSKyle Evans #define BUF __stack.__buf
1633020d003cSKyle Evans struct {
1634020d003cSKyle Evans uint8_t padding_l;
1635020d003cSKyle Evans unsigned char * __buf;
1636020d003cSKyle Evans uint8_t padding_r;
1637020d003cSKyle Evans } __stack;
1638020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1639020d003cSKyle Evans const size_t __len = 42;
1640020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1641020d003cSKyle Evans char src[__len];
1642020d003cSKyle Evans
1643020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
1644020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1645020d003cSKyle Evans memset(src, 'A', __len - 1);
1646020d003cSKyle Evans src[__len - 1] = '\0';
1647020d003cSKyle Evans
1648020d003cSKyle Evans strncat(__stack.__buf, src, __len);
1649020d003cSKyle Evans #undef BUF
1650020d003cSKyle Evans
1651020d003cSKyle Evans }
1652020d003cSKyle Evans
165309cdbf04SKyle Evans ATF_TC(strncat_heap_after_end);
ATF_TC_HEAD(strncat_heap_after_end,tc)165409cdbf04SKyle Evans ATF_TC_HEAD(strncat_heap_after_end, tc)
165509cdbf04SKyle Evans {
165609cdbf04SKyle Evans }
ATF_TC_BODY(strncat_heap_after_end,tc)1657020d003cSKyle Evans ATF_TC_BODY(strncat_heap_after_end, tc)
1658020d003cSKyle Evans {
1659020d003cSKyle Evans #define BUF __stack.__buf
1660020d003cSKyle Evans struct {
1661020d003cSKyle Evans uint8_t padding_l;
1662020d003cSKyle Evans unsigned char * __buf;
1663020d003cSKyle Evans uint8_t padding_r;
1664020d003cSKyle Evans } __stack;
1665020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1666020d003cSKyle Evans const size_t __len = 42 + 1;
1667020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1668020d003cSKyle Evans pid_t __child;
1669020d003cSKyle Evans int __status;
1670020d003cSKyle Evans char src[__len];
1671020d003cSKyle Evans
1672020d003cSKyle Evans __child = fork();
1673020d003cSKyle Evans ATF_REQUIRE(__child >= 0);
1674020d003cSKyle Evans if (__child > 0)
1675020d003cSKyle Evans goto monitor;
1676020d003cSKyle Evans
1677020d003cSKyle Evans /* Child */
1678020d003cSKyle Evans disable_coredumps();
1679020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
1680020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1681020d003cSKyle Evans memset(src, 'A', __len - 1);
1682020d003cSKyle Evans src[__len - 1] = '\0';
1683020d003cSKyle Evans
1684020d003cSKyle Evans strncat(__stack.__buf, src, __len);
1685020d003cSKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
1686020d003cSKyle Evans
1687020d003cSKyle Evans monitor:
1688020d003cSKyle Evans while (waitpid(__child, &__status, 0) != __child) {
1689020d003cSKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
1690020d003cSKyle Evans }
1691020d003cSKyle Evans
1692020d003cSKyle Evans if (!WIFSIGNALED(__status)) {
1693020d003cSKyle Evans switch (WEXITSTATUS(__status)) {
1694020d003cSKyle Evans case EX_SOFTWARE:
1695020d003cSKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
1696020d003cSKyle Evans break;
1697020d003cSKyle Evans case EX_OSERR:
1698020d003cSKyle Evans atf_tc_fail("setrlimit(2) failed");
1699020d003cSKyle Evans break;
1700020d003cSKyle Evans default:
1701020d003cSKyle Evans atf_tc_fail("child exited with status %d",
1702020d003cSKyle Evans WEXITSTATUS(__status));
1703020d003cSKyle Evans }
1704020d003cSKyle Evans } else {
1705020d003cSKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
1706020d003cSKyle Evans }
1707020d003cSKyle Evans #undef BUF
1708020d003cSKyle Evans
1709020d003cSKyle Evans }
1710020d003cSKyle Evans
171109cdbf04SKyle Evans ATF_TC(strcpy_before_end);
ATF_TC_HEAD(strcpy_before_end,tc)171209cdbf04SKyle Evans ATF_TC_HEAD(strcpy_before_end, tc)
171309cdbf04SKyle Evans {
171409cdbf04SKyle Evans }
ATF_TC_BODY(strcpy_before_end,tc)1715020d003cSKyle Evans ATF_TC_BODY(strcpy_before_end, tc)
1716020d003cSKyle Evans {
1717020d003cSKyle Evans #define BUF &__stack.__buf
1718020d003cSKyle Evans struct {
1719020d003cSKyle Evans uint8_t padding_l;
1720020d003cSKyle Evans unsigned char __buf[42];
1721020d003cSKyle Evans uint8_t padding_r;
1722020d003cSKyle Evans } __stack;
1723020d003cSKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1724020d003cSKyle Evans const size_t __len = 42 - 1;
1725020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1726020d003cSKyle Evans char src[__len];
1727020d003cSKyle Evans
1728020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1729020d003cSKyle Evans memset(src, 'A', __len - 1);
1730020d003cSKyle Evans src[__len - 1] = '\0';
1731020d003cSKyle Evans
1732020d003cSKyle Evans strcpy(__stack.__buf, src);
1733020d003cSKyle Evans #undef BUF
1734020d003cSKyle Evans
1735020d003cSKyle Evans }
1736020d003cSKyle Evans
173709cdbf04SKyle Evans ATF_TC(strcpy_end);
ATF_TC_HEAD(strcpy_end,tc)173809cdbf04SKyle Evans ATF_TC_HEAD(strcpy_end, tc)
173909cdbf04SKyle Evans {
174009cdbf04SKyle Evans }
ATF_TC_BODY(strcpy_end,tc)1741020d003cSKyle Evans ATF_TC_BODY(strcpy_end, tc)
1742020d003cSKyle Evans {
1743020d003cSKyle Evans #define BUF &__stack.__buf
1744020d003cSKyle Evans struct {
1745020d003cSKyle Evans uint8_t padding_l;
1746020d003cSKyle Evans unsigned char __buf[42];
1747020d003cSKyle Evans uint8_t padding_r;
1748020d003cSKyle Evans } __stack;
1749020d003cSKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1750020d003cSKyle Evans const size_t __len = 42;
1751020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1752020d003cSKyle Evans char src[__len];
1753020d003cSKyle Evans
1754020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1755020d003cSKyle Evans memset(src, 'A', __len - 1);
1756020d003cSKyle Evans src[__len - 1] = '\0';
1757020d003cSKyle Evans
1758020d003cSKyle Evans strcpy(__stack.__buf, src);
1759020d003cSKyle Evans #undef BUF
1760020d003cSKyle Evans
1761020d003cSKyle Evans }
1762020d003cSKyle Evans
176309cdbf04SKyle Evans ATF_TC(strcpy_heap_before_end);
ATF_TC_HEAD(strcpy_heap_before_end,tc)176409cdbf04SKyle Evans ATF_TC_HEAD(strcpy_heap_before_end, tc)
176509cdbf04SKyle Evans {
176609cdbf04SKyle Evans }
ATF_TC_BODY(strcpy_heap_before_end,tc)1767020d003cSKyle Evans ATF_TC_BODY(strcpy_heap_before_end, tc)
1768020d003cSKyle Evans {
1769020d003cSKyle Evans #define BUF __stack.__buf
1770020d003cSKyle Evans struct {
1771020d003cSKyle Evans uint8_t padding_l;
1772020d003cSKyle Evans unsigned char * __buf;
1773020d003cSKyle Evans uint8_t padding_r;
1774020d003cSKyle Evans } __stack;
1775020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1776020d003cSKyle Evans const size_t __len = 42 - 1;
1777020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1778020d003cSKyle Evans char src[__len];
1779020d003cSKyle Evans
1780020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
1781020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1782020d003cSKyle Evans memset(src, 'A', __len - 1);
1783020d003cSKyle Evans src[__len - 1] = '\0';
1784020d003cSKyle Evans
1785020d003cSKyle Evans strcpy(__stack.__buf, src);
1786020d003cSKyle Evans #undef BUF
1787020d003cSKyle Evans
1788020d003cSKyle Evans }
1789020d003cSKyle Evans
179009cdbf04SKyle Evans ATF_TC(strcpy_heap_end);
ATF_TC_HEAD(strcpy_heap_end,tc)179109cdbf04SKyle Evans ATF_TC_HEAD(strcpy_heap_end, tc)
179209cdbf04SKyle Evans {
179309cdbf04SKyle Evans }
ATF_TC_BODY(strcpy_heap_end,tc)1794020d003cSKyle Evans ATF_TC_BODY(strcpy_heap_end, tc)
1795020d003cSKyle Evans {
1796020d003cSKyle Evans #define BUF __stack.__buf
1797020d003cSKyle Evans struct {
1798020d003cSKyle Evans uint8_t padding_l;
1799020d003cSKyle Evans unsigned char * __buf;
1800020d003cSKyle Evans uint8_t padding_r;
1801020d003cSKyle Evans } __stack;
1802020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1803020d003cSKyle Evans const size_t __len = 42;
1804020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1805020d003cSKyle Evans char src[__len];
1806020d003cSKyle Evans
1807020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
1808020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1809020d003cSKyle Evans memset(src, 'A', __len - 1);
1810020d003cSKyle Evans src[__len - 1] = '\0';
1811020d003cSKyle Evans
1812020d003cSKyle Evans strcpy(__stack.__buf, src);
1813020d003cSKyle Evans #undef BUF
1814020d003cSKyle Evans
1815020d003cSKyle Evans }
1816020d003cSKyle Evans
181709cdbf04SKyle Evans ATF_TC(strcpy_heap_after_end);
ATF_TC_HEAD(strcpy_heap_after_end,tc)181809cdbf04SKyle Evans ATF_TC_HEAD(strcpy_heap_after_end, tc)
181909cdbf04SKyle Evans {
182009cdbf04SKyle Evans }
ATF_TC_BODY(strcpy_heap_after_end,tc)1821020d003cSKyle Evans ATF_TC_BODY(strcpy_heap_after_end, tc)
1822020d003cSKyle Evans {
1823020d003cSKyle Evans #define BUF __stack.__buf
1824020d003cSKyle Evans struct {
1825020d003cSKyle Evans uint8_t padding_l;
1826020d003cSKyle Evans unsigned char * __buf;
1827020d003cSKyle Evans uint8_t padding_r;
1828020d003cSKyle Evans } __stack;
1829020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1830020d003cSKyle Evans const size_t __len = 42 + 1;
1831020d003cSKyle Evans const size_t __idx __unused = __len - 1;
1832020d003cSKyle Evans pid_t __child;
1833020d003cSKyle Evans int __status;
1834020d003cSKyle Evans char src[__len];
1835020d003cSKyle Evans
1836020d003cSKyle Evans __child = fork();
1837020d003cSKyle Evans ATF_REQUIRE(__child >= 0);
1838020d003cSKyle Evans if (__child > 0)
1839020d003cSKyle Evans goto monitor;
1840020d003cSKyle Evans
1841020d003cSKyle Evans /* Child */
1842020d003cSKyle Evans disable_coredumps();
1843020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
1844020d003cSKyle Evans memset(__stack.__buf, 0, __len);
1845020d003cSKyle Evans memset(src, 'A', __len - 1);
1846020d003cSKyle Evans src[__len - 1] = '\0';
1847020d003cSKyle Evans
1848020d003cSKyle Evans strcpy(__stack.__buf, src);
1849020d003cSKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
1850020d003cSKyle Evans
1851020d003cSKyle Evans monitor:
1852020d003cSKyle Evans while (waitpid(__child, &__status, 0) != __child) {
1853020d003cSKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
1854020d003cSKyle Evans }
1855020d003cSKyle Evans
1856020d003cSKyle Evans if (!WIFSIGNALED(__status)) {
1857020d003cSKyle Evans switch (WEXITSTATUS(__status)) {
1858020d003cSKyle Evans case EX_SOFTWARE:
1859020d003cSKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
1860020d003cSKyle Evans break;
1861020d003cSKyle Evans case EX_OSERR:
1862020d003cSKyle Evans atf_tc_fail("setrlimit(2) failed");
1863020d003cSKyle Evans break;
1864020d003cSKyle Evans default:
1865020d003cSKyle Evans atf_tc_fail("child exited with status %d",
1866020d003cSKyle Evans WEXITSTATUS(__status));
1867020d003cSKyle Evans }
1868020d003cSKyle Evans } else {
1869020d003cSKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
1870020d003cSKyle Evans }
1871020d003cSKyle Evans #undef BUF
1872020d003cSKyle Evans
1873020d003cSKyle Evans }
1874020d003cSKyle Evans
187509cdbf04SKyle Evans ATF_TC(strlcpy_before_end);
ATF_TC_HEAD(strlcpy_before_end,tc)187609cdbf04SKyle Evans ATF_TC_HEAD(strlcpy_before_end, tc)
187709cdbf04SKyle Evans {
187809cdbf04SKyle Evans }
ATF_TC_BODY(strlcpy_before_end,tc)1879cf8e5289SKyle Evans ATF_TC_BODY(strlcpy_before_end, tc)
1880cf8e5289SKyle Evans {
1881cf8e5289SKyle Evans #define BUF &__stack.__buf
1882cf8e5289SKyle Evans struct {
1883cf8e5289SKyle Evans uint8_t padding_l;
1884cf8e5289SKyle Evans unsigned char __buf[42];
1885cf8e5289SKyle Evans uint8_t padding_r;
1886cf8e5289SKyle Evans } __stack;
1887cf8e5289SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1888cf8e5289SKyle Evans const size_t __len = 42 - 1;
1889cf8e5289SKyle Evans const size_t __idx __unused = __len - 1;
1890cf8e5289SKyle Evans char src[__len];
1891cf8e5289SKyle Evans
1892cf8e5289SKyle Evans memset(__stack.__buf, 0, __len);
1893cf8e5289SKyle Evans memset(src, 'A', __len - 1);
1894cf8e5289SKyle Evans src[__len - 1] = '\0';
1895cf8e5289SKyle Evans
1896cf8e5289SKyle Evans strlcpy(__stack.__buf, src, __len);
1897cf8e5289SKyle Evans #undef BUF
1898cf8e5289SKyle Evans
1899cf8e5289SKyle Evans }
1900cf8e5289SKyle Evans
190109cdbf04SKyle Evans ATF_TC(strlcpy_end);
ATF_TC_HEAD(strlcpy_end,tc)190209cdbf04SKyle Evans ATF_TC_HEAD(strlcpy_end, tc)
190309cdbf04SKyle Evans {
190409cdbf04SKyle Evans }
ATF_TC_BODY(strlcpy_end,tc)1905cf8e5289SKyle Evans ATF_TC_BODY(strlcpy_end, tc)
1906cf8e5289SKyle Evans {
1907cf8e5289SKyle Evans #define BUF &__stack.__buf
1908cf8e5289SKyle Evans struct {
1909cf8e5289SKyle Evans uint8_t padding_l;
1910cf8e5289SKyle Evans unsigned char __buf[42];
1911cf8e5289SKyle Evans uint8_t padding_r;
1912cf8e5289SKyle Evans } __stack;
1913cf8e5289SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1914cf8e5289SKyle Evans const size_t __len = 42;
1915cf8e5289SKyle Evans const size_t __idx __unused = __len - 1;
1916cf8e5289SKyle Evans char src[__len];
1917cf8e5289SKyle Evans
1918cf8e5289SKyle Evans memset(__stack.__buf, 0, __len);
1919cf8e5289SKyle Evans memset(src, 'A', __len - 1);
1920cf8e5289SKyle Evans src[__len - 1] = '\0';
1921cf8e5289SKyle Evans
1922cf8e5289SKyle Evans strlcpy(__stack.__buf, src, __len);
1923cf8e5289SKyle Evans #undef BUF
1924cf8e5289SKyle Evans
1925cf8e5289SKyle Evans }
1926cf8e5289SKyle Evans
192709cdbf04SKyle Evans ATF_TC(strlcpy_heap_before_end);
ATF_TC_HEAD(strlcpy_heap_before_end,tc)192809cdbf04SKyle Evans ATF_TC_HEAD(strlcpy_heap_before_end, tc)
192909cdbf04SKyle Evans {
193009cdbf04SKyle Evans }
ATF_TC_BODY(strlcpy_heap_before_end,tc)1931cf8e5289SKyle Evans ATF_TC_BODY(strlcpy_heap_before_end, tc)
1932cf8e5289SKyle Evans {
1933cf8e5289SKyle Evans #define BUF __stack.__buf
1934cf8e5289SKyle Evans struct {
1935cf8e5289SKyle Evans uint8_t padding_l;
1936cf8e5289SKyle Evans unsigned char * __buf;
1937cf8e5289SKyle Evans uint8_t padding_r;
1938cf8e5289SKyle Evans } __stack;
1939cf8e5289SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1940cf8e5289SKyle Evans const size_t __len = 42 - 1;
1941cf8e5289SKyle Evans const size_t __idx __unused = __len - 1;
1942cf8e5289SKyle Evans char src[__len];
1943cf8e5289SKyle Evans
1944cf8e5289SKyle Evans __stack.__buf = malloc(__bufsz);
1945cf8e5289SKyle Evans memset(__stack.__buf, 0, __len);
1946cf8e5289SKyle Evans memset(src, 'A', __len - 1);
1947cf8e5289SKyle Evans src[__len - 1] = '\0';
1948cf8e5289SKyle Evans
1949cf8e5289SKyle Evans strlcpy(__stack.__buf, src, __len);
1950cf8e5289SKyle Evans #undef BUF
1951cf8e5289SKyle Evans
1952cf8e5289SKyle Evans }
1953cf8e5289SKyle Evans
195409cdbf04SKyle Evans ATF_TC(strlcpy_heap_end);
ATF_TC_HEAD(strlcpy_heap_end,tc)195509cdbf04SKyle Evans ATF_TC_HEAD(strlcpy_heap_end, tc)
195609cdbf04SKyle Evans {
195709cdbf04SKyle Evans }
ATF_TC_BODY(strlcpy_heap_end,tc)1958cf8e5289SKyle Evans ATF_TC_BODY(strlcpy_heap_end, tc)
1959cf8e5289SKyle Evans {
1960cf8e5289SKyle Evans #define BUF __stack.__buf
1961cf8e5289SKyle Evans struct {
1962cf8e5289SKyle Evans uint8_t padding_l;
1963cf8e5289SKyle Evans unsigned char * __buf;
1964cf8e5289SKyle Evans uint8_t padding_r;
1965cf8e5289SKyle Evans } __stack;
1966cf8e5289SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1967cf8e5289SKyle Evans const size_t __len = 42;
1968cf8e5289SKyle Evans const size_t __idx __unused = __len - 1;
1969cf8e5289SKyle Evans char src[__len];
1970cf8e5289SKyle Evans
1971cf8e5289SKyle Evans __stack.__buf = malloc(__bufsz);
1972cf8e5289SKyle Evans memset(__stack.__buf, 0, __len);
1973cf8e5289SKyle Evans memset(src, 'A', __len - 1);
1974cf8e5289SKyle Evans src[__len - 1] = '\0';
1975cf8e5289SKyle Evans
1976cf8e5289SKyle Evans strlcpy(__stack.__buf, src, __len);
1977cf8e5289SKyle Evans #undef BUF
1978cf8e5289SKyle Evans
1979cf8e5289SKyle Evans }
1980cf8e5289SKyle Evans
198109cdbf04SKyle Evans ATF_TC(strlcpy_heap_after_end);
ATF_TC_HEAD(strlcpy_heap_after_end,tc)198209cdbf04SKyle Evans ATF_TC_HEAD(strlcpy_heap_after_end, tc)
198309cdbf04SKyle Evans {
198409cdbf04SKyle Evans }
ATF_TC_BODY(strlcpy_heap_after_end,tc)1985cf8e5289SKyle Evans ATF_TC_BODY(strlcpy_heap_after_end, tc)
1986cf8e5289SKyle Evans {
1987cf8e5289SKyle Evans #define BUF __stack.__buf
1988cf8e5289SKyle Evans struct {
1989cf8e5289SKyle Evans uint8_t padding_l;
1990cf8e5289SKyle Evans unsigned char * __buf;
1991cf8e5289SKyle Evans uint8_t padding_r;
1992cf8e5289SKyle Evans } __stack;
1993cf8e5289SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1994cf8e5289SKyle Evans const size_t __len = 42 + 1;
1995cf8e5289SKyle Evans const size_t __idx __unused = __len - 1;
1996cf8e5289SKyle Evans pid_t __child;
1997cf8e5289SKyle Evans int __status;
1998cf8e5289SKyle Evans char src[__len];
1999cf8e5289SKyle Evans
2000cf8e5289SKyle Evans __child = fork();
2001cf8e5289SKyle Evans ATF_REQUIRE(__child >= 0);
2002cf8e5289SKyle Evans if (__child > 0)
2003cf8e5289SKyle Evans goto monitor;
2004cf8e5289SKyle Evans
2005cf8e5289SKyle Evans /* Child */
2006cf8e5289SKyle Evans disable_coredumps();
2007cf8e5289SKyle Evans __stack.__buf = malloc(__bufsz);
2008cf8e5289SKyle Evans memset(__stack.__buf, 0, __len);
2009cf8e5289SKyle Evans memset(src, 'A', __len - 1);
2010cf8e5289SKyle Evans src[__len - 1] = '\0';
2011cf8e5289SKyle Evans
2012cf8e5289SKyle Evans strlcpy(__stack.__buf, src, __len);
2013cf8e5289SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
2014cf8e5289SKyle Evans
2015cf8e5289SKyle Evans monitor:
2016cf8e5289SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
2017cf8e5289SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
2018cf8e5289SKyle Evans }
2019cf8e5289SKyle Evans
2020cf8e5289SKyle Evans if (!WIFSIGNALED(__status)) {
2021cf8e5289SKyle Evans switch (WEXITSTATUS(__status)) {
2022cf8e5289SKyle Evans case EX_SOFTWARE:
2023cf8e5289SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
2024cf8e5289SKyle Evans break;
2025cf8e5289SKyle Evans case EX_OSERR:
2026cf8e5289SKyle Evans atf_tc_fail("setrlimit(2) failed");
2027cf8e5289SKyle Evans break;
2028cf8e5289SKyle Evans default:
2029cf8e5289SKyle Evans atf_tc_fail("child exited with status %d",
2030cf8e5289SKyle Evans WEXITSTATUS(__status));
2031cf8e5289SKyle Evans }
2032cf8e5289SKyle Evans } else {
2033cf8e5289SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
2034cf8e5289SKyle Evans }
2035cf8e5289SKyle Evans #undef BUF
2036cf8e5289SKyle Evans
2037cf8e5289SKyle Evans }
2038cf8e5289SKyle Evans
203909cdbf04SKyle Evans ATF_TC(strncpy_before_end);
ATF_TC_HEAD(strncpy_before_end,tc)204009cdbf04SKyle Evans ATF_TC_HEAD(strncpy_before_end, tc)
204109cdbf04SKyle Evans {
204209cdbf04SKyle Evans }
ATF_TC_BODY(strncpy_before_end,tc)2043020d003cSKyle Evans ATF_TC_BODY(strncpy_before_end, tc)
2044020d003cSKyle Evans {
2045020d003cSKyle Evans #define BUF &__stack.__buf
2046020d003cSKyle Evans struct {
2047020d003cSKyle Evans uint8_t padding_l;
2048020d003cSKyle Evans unsigned char __buf[42];
2049020d003cSKyle Evans uint8_t padding_r;
2050020d003cSKyle Evans } __stack;
2051020d003cSKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
2052020d003cSKyle Evans const size_t __len = 42 - 1;
2053020d003cSKyle Evans const size_t __idx __unused = __len - 1;
2054020d003cSKyle Evans char src[__len];
2055020d003cSKyle Evans
2056020d003cSKyle Evans memset(__stack.__buf, 0, __len);
2057020d003cSKyle Evans memset(src, 'A', __len - 1);
2058020d003cSKyle Evans src[__len - 1] = '\0';
2059020d003cSKyle Evans
2060020d003cSKyle Evans strncpy(__stack.__buf, src, __len);
2061020d003cSKyle Evans #undef BUF
2062020d003cSKyle Evans
2063020d003cSKyle Evans }
2064020d003cSKyle Evans
206509cdbf04SKyle Evans ATF_TC(strncpy_end);
ATF_TC_HEAD(strncpy_end,tc)206609cdbf04SKyle Evans ATF_TC_HEAD(strncpy_end, tc)
206709cdbf04SKyle Evans {
206809cdbf04SKyle Evans }
ATF_TC_BODY(strncpy_end,tc)2069020d003cSKyle Evans ATF_TC_BODY(strncpy_end, tc)
2070020d003cSKyle Evans {
2071020d003cSKyle Evans #define BUF &__stack.__buf
2072020d003cSKyle Evans struct {
2073020d003cSKyle Evans uint8_t padding_l;
2074020d003cSKyle Evans unsigned char __buf[42];
2075020d003cSKyle Evans uint8_t padding_r;
2076020d003cSKyle Evans } __stack;
2077020d003cSKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
2078020d003cSKyle Evans const size_t __len = 42;
2079020d003cSKyle Evans const size_t __idx __unused = __len - 1;
2080020d003cSKyle Evans char src[__len];
2081020d003cSKyle Evans
2082020d003cSKyle Evans memset(__stack.__buf, 0, __len);
2083020d003cSKyle Evans memset(src, 'A', __len - 1);
2084020d003cSKyle Evans src[__len - 1] = '\0';
2085020d003cSKyle Evans
2086020d003cSKyle Evans strncpy(__stack.__buf, src, __len);
2087020d003cSKyle Evans #undef BUF
2088020d003cSKyle Evans
2089020d003cSKyle Evans }
2090020d003cSKyle Evans
209109cdbf04SKyle Evans ATF_TC(strncpy_heap_before_end);
ATF_TC_HEAD(strncpy_heap_before_end,tc)209209cdbf04SKyle Evans ATF_TC_HEAD(strncpy_heap_before_end, tc)
209309cdbf04SKyle Evans {
209409cdbf04SKyle Evans }
ATF_TC_BODY(strncpy_heap_before_end,tc)2095020d003cSKyle Evans ATF_TC_BODY(strncpy_heap_before_end, tc)
2096020d003cSKyle Evans {
2097020d003cSKyle Evans #define BUF __stack.__buf
2098020d003cSKyle Evans struct {
2099020d003cSKyle Evans uint8_t padding_l;
2100020d003cSKyle Evans unsigned char * __buf;
2101020d003cSKyle Evans uint8_t padding_r;
2102020d003cSKyle Evans } __stack;
2103020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
2104020d003cSKyle Evans const size_t __len = 42 - 1;
2105020d003cSKyle Evans const size_t __idx __unused = __len - 1;
2106020d003cSKyle Evans char src[__len];
2107020d003cSKyle Evans
2108020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
2109020d003cSKyle Evans memset(__stack.__buf, 0, __len);
2110020d003cSKyle Evans memset(src, 'A', __len - 1);
2111020d003cSKyle Evans src[__len - 1] = '\0';
2112020d003cSKyle Evans
2113020d003cSKyle Evans strncpy(__stack.__buf, src, __len);
2114020d003cSKyle Evans #undef BUF
2115020d003cSKyle Evans
2116020d003cSKyle Evans }
2117020d003cSKyle Evans
211809cdbf04SKyle Evans ATF_TC(strncpy_heap_end);
ATF_TC_HEAD(strncpy_heap_end,tc)211909cdbf04SKyle Evans ATF_TC_HEAD(strncpy_heap_end, tc)
212009cdbf04SKyle Evans {
212109cdbf04SKyle Evans }
ATF_TC_BODY(strncpy_heap_end,tc)2122020d003cSKyle Evans ATF_TC_BODY(strncpy_heap_end, tc)
2123020d003cSKyle Evans {
2124020d003cSKyle Evans #define BUF __stack.__buf
2125020d003cSKyle Evans struct {
2126020d003cSKyle Evans uint8_t padding_l;
2127020d003cSKyle Evans unsigned char * __buf;
2128020d003cSKyle Evans uint8_t padding_r;
2129020d003cSKyle Evans } __stack;
2130020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
2131020d003cSKyle Evans const size_t __len = 42;
2132020d003cSKyle Evans const size_t __idx __unused = __len - 1;
2133020d003cSKyle Evans char src[__len];
2134020d003cSKyle Evans
2135020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
2136020d003cSKyle Evans memset(__stack.__buf, 0, __len);
2137020d003cSKyle Evans memset(src, 'A', __len - 1);
2138020d003cSKyle Evans src[__len - 1] = '\0';
2139020d003cSKyle Evans
2140020d003cSKyle Evans strncpy(__stack.__buf, src, __len);
2141020d003cSKyle Evans #undef BUF
2142020d003cSKyle Evans
2143020d003cSKyle Evans }
2144020d003cSKyle Evans
214509cdbf04SKyle Evans ATF_TC(strncpy_heap_after_end);
ATF_TC_HEAD(strncpy_heap_after_end,tc)214609cdbf04SKyle Evans ATF_TC_HEAD(strncpy_heap_after_end, tc)
214709cdbf04SKyle Evans {
214809cdbf04SKyle Evans }
ATF_TC_BODY(strncpy_heap_after_end,tc)2149020d003cSKyle Evans ATF_TC_BODY(strncpy_heap_after_end, tc)
2150020d003cSKyle Evans {
2151020d003cSKyle Evans #define BUF __stack.__buf
2152020d003cSKyle Evans struct {
2153020d003cSKyle Evans uint8_t padding_l;
2154020d003cSKyle Evans unsigned char * __buf;
2155020d003cSKyle Evans uint8_t padding_r;
2156020d003cSKyle Evans } __stack;
2157020d003cSKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
2158020d003cSKyle Evans const size_t __len = 42 + 1;
2159020d003cSKyle Evans const size_t __idx __unused = __len - 1;
2160020d003cSKyle Evans pid_t __child;
2161020d003cSKyle Evans int __status;
2162020d003cSKyle Evans char src[__len];
2163020d003cSKyle Evans
2164020d003cSKyle Evans __child = fork();
2165020d003cSKyle Evans ATF_REQUIRE(__child >= 0);
2166020d003cSKyle Evans if (__child > 0)
2167020d003cSKyle Evans goto monitor;
2168020d003cSKyle Evans
2169020d003cSKyle Evans /* Child */
2170020d003cSKyle Evans disable_coredumps();
2171020d003cSKyle Evans __stack.__buf = malloc(__bufsz);
2172020d003cSKyle Evans memset(__stack.__buf, 0, __len);
2173020d003cSKyle Evans memset(src, 'A', __len - 1);
2174020d003cSKyle Evans src[__len - 1] = '\0';
2175020d003cSKyle Evans
2176020d003cSKyle Evans strncpy(__stack.__buf, src, __len);
2177020d003cSKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
2178020d003cSKyle Evans
2179020d003cSKyle Evans monitor:
2180020d003cSKyle Evans while (waitpid(__child, &__status, 0) != __child) {
2181020d003cSKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
2182020d003cSKyle Evans }
2183020d003cSKyle Evans
2184020d003cSKyle Evans if (!WIFSIGNALED(__status)) {
2185020d003cSKyle Evans switch (WEXITSTATUS(__status)) {
2186020d003cSKyle Evans case EX_SOFTWARE:
2187020d003cSKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
2188020d003cSKyle Evans break;
2189020d003cSKyle Evans case EX_OSERR:
2190020d003cSKyle Evans atf_tc_fail("setrlimit(2) failed");
2191020d003cSKyle Evans break;
2192020d003cSKyle Evans default:
2193020d003cSKyle Evans atf_tc_fail("child exited with status %d",
2194020d003cSKyle Evans WEXITSTATUS(__status));
2195020d003cSKyle Evans }
2196020d003cSKyle Evans } else {
2197020d003cSKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
2198020d003cSKyle Evans }
2199020d003cSKyle Evans #undef BUF
2200020d003cSKyle Evans
2201020d003cSKyle Evans }
2202020d003cSKyle Evans
ATF_TP_ADD_TCS(tp)2203020d003cSKyle Evans ATF_TP_ADD_TCS(tp)
2204020d003cSKyle Evans {
2205020d003cSKyle Evans ATF_TP_ADD_TC(tp, memcpy_before_end);
2206020d003cSKyle Evans ATF_TP_ADD_TC(tp, memcpy_end);
2207020d003cSKyle Evans ATF_TP_ADD_TC(tp, memcpy_heap_before_end);
2208020d003cSKyle Evans ATF_TP_ADD_TC(tp, memcpy_heap_end);
2209020d003cSKyle Evans ATF_TP_ADD_TC(tp, memcpy_heap_after_end);
2210cf8e5289SKyle Evans ATF_TP_ADD_TC(tp, mempcpy_before_end);
2211cf8e5289SKyle Evans ATF_TP_ADD_TC(tp, mempcpy_end);
2212cf8e5289SKyle Evans ATF_TP_ADD_TC(tp, mempcpy_heap_before_end);
2213cf8e5289SKyle Evans ATF_TP_ADD_TC(tp, mempcpy_heap_end);
2214cf8e5289SKyle Evans ATF_TP_ADD_TC(tp, mempcpy_heap_after_end);
2215020d003cSKyle Evans ATF_TP_ADD_TC(tp, memmove_before_end);
2216020d003cSKyle Evans ATF_TP_ADD_TC(tp, memmove_end);
2217020d003cSKyle Evans ATF_TP_ADD_TC(tp, memmove_heap_before_end);
2218020d003cSKyle Evans ATF_TP_ADD_TC(tp, memmove_heap_end);
2219020d003cSKyle Evans ATF_TP_ADD_TC(tp, memmove_heap_after_end);
2220020d003cSKyle Evans ATF_TP_ADD_TC(tp, memset_before_end);
2221020d003cSKyle Evans ATF_TP_ADD_TC(tp, memset_end);
2222020d003cSKyle Evans ATF_TP_ADD_TC(tp, memset_heap_before_end);
2223020d003cSKyle Evans ATF_TP_ADD_TC(tp, memset_heap_end);
2224020d003cSKyle Evans ATF_TP_ADD_TC(tp, memset_heap_after_end);
22258983acc8SRobert Clausecker ATF_TP_ADD_TC(tp, memset_explicit_before_end);
22268983acc8SRobert Clausecker ATF_TP_ADD_TC(tp, memset_explicit_end);
22278983acc8SRobert Clausecker ATF_TP_ADD_TC(tp, memset_explicit_heap_before_end);
22288983acc8SRobert Clausecker ATF_TP_ADD_TC(tp, memset_explicit_heap_end);
22298983acc8SRobert Clausecker ATF_TP_ADD_TC(tp, memset_explicit_heap_after_end);
2230020d003cSKyle Evans ATF_TP_ADD_TC(tp, stpcpy_before_end);
2231020d003cSKyle Evans ATF_TP_ADD_TC(tp, stpcpy_end);
2232020d003cSKyle Evans ATF_TP_ADD_TC(tp, stpcpy_heap_before_end);
2233020d003cSKyle Evans ATF_TP_ADD_TC(tp, stpcpy_heap_end);
2234020d003cSKyle Evans ATF_TP_ADD_TC(tp, stpcpy_heap_after_end);
2235020d003cSKyle Evans ATF_TP_ADD_TC(tp, stpncpy_before_end);
2236020d003cSKyle Evans ATF_TP_ADD_TC(tp, stpncpy_end);
2237020d003cSKyle Evans ATF_TP_ADD_TC(tp, stpncpy_heap_before_end);
2238020d003cSKyle Evans ATF_TP_ADD_TC(tp, stpncpy_heap_end);
2239020d003cSKyle Evans ATF_TP_ADD_TC(tp, stpncpy_heap_after_end);
2240020d003cSKyle Evans ATF_TP_ADD_TC(tp, strcat_before_end);
2241020d003cSKyle Evans ATF_TP_ADD_TC(tp, strcat_end);
2242020d003cSKyle Evans ATF_TP_ADD_TC(tp, strcat_heap_before_end);
2243020d003cSKyle Evans ATF_TP_ADD_TC(tp, strcat_heap_end);
2244020d003cSKyle Evans ATF_TP_ADD_TC(tp, strcat_heap_after_end);
2245cf8e5289SKyle Evans ATF_TP_ADD_TC(tp, strlcat_before_end);
2246cf8e5289SKyle Evans ATF_TP_ADD_TC(tp, strlcat_end);
2247cf8e5289SKyle Evans ATF_TP_ADD_TC(tp, strlcat_heap_before_end);
2248cf8e5289SKyle Evans ATF_TP_ADD_TC(tp, strlcat_heap_end);
2249cf8e5289SKyle Evans ATF_TP_ADD_TC(tp, strlcat_heap_after_end);
2250020d003cSKyle Evans ATF_TP_ADD_TC(tp, strncat_before_end);
2251020d003cSKyle Evans ATF_TP_ADD_TC(tp, strncat_end);
2252020d003cSKyle Evans ATF_TP_ADD_TC(tp, strncat_heap_before_end);
2253020d003cSKyle Evans ATF_TP_ADD_TC(tp, strncat_heap_end);
2254020d003cSKyle Evans ATF_TP_ADD_TC(tp, strncat_heap_after_end);
2255020d003cSKyle Evans ATF_TP_ADD_TC(tp, strcpy_before_end);
2256020d003cSKyle Evans ATF_TP_ADD_TC(tp, strcpy_end);
2257020d003cSKyle Evans ATF_TP_ADD_TC(tp, strcpy_heap_before_end);
2258020d003cSKyle Evans ATF_TP_ADD_TC(tp, strcpy_heap_end);
2259020d003cSKyle Evans ATF_TP_ADD_TC(tp, strcpy_heap_after_end);
2260cf8e5289SKyle Evans ATF_TP_ADD_TC(tp, strlcpy_before_end);
2261cf8e5289SKyle Evans ATF_TP_ADD_TC(tp, strlcpy_end);
2262cf8e5289SKyle Evans ATF_TP_ADD_TC(tp, strlcpy_heap_before_end);
2263cf8e5289SKyle Evans ATF_TP_ADD_TC(tp, strlcpy_heap_end);
2264cf8e5289SKyle Evans ATF_TP_ADD_TC(tp, strlcpy_heap_after_end);
2265020d003cSKyle Evans ATF_TP_ADD_TC(tp, strncpy_before_end);
2266020d003cSKyle Evans ATF_TP_ADD_TC(tp, strncpy_end);
2267020d003cSKyle Evans ATF_TP_ADD_TC(tp, strncpy_heap_before_end);
2268020d003cSKyle Evans ATF_TP_ADD_TC(tp, strncpy_heap_end);
2269020d003cSKyle Evans ATF_TP_ADD_TC(tp, strncpy_heap_after_end);
2270020d003cSKyle Evans return (atf_no_error());
2271020d003cSKyle Evans }
2272