11ace24b3SKyle Evans /* @generated by `generate-fortify-tests.lua "uio"` */
21ace24b3SKyle Evans
31ace24b3SKyle Evans #define _FORTIFY_SOURCE 2
41ace24b3SKyle Evans #define TMPFILE_SIZE (1024 * 32)
51ace24b3SKyle Evans
61ace24b3SKyle Evans #include <sys/param.h>
7*22178cb2SKyle Evans #include <sys/jail.h>
81ace24b3SKyle Evans #include <sys/random.h>
91ace24b3SKyle Evans #include <sys/resource.h>
102aba0eeaSKyle Evans #include <sys/select.h>
111f155d48SKyle Evans #include <sys/socket.h>
121ace24b3SKyle Evans #include <sys/time.h>
131ace24b3SKyle Evans #include <sys/uio.h>
141ace24b3SKyle Evans #include <sys/wait.h>
151ace24b3SKyle Evans #include <dirent.h>
161ace24b3SKyle Evans #include <errno.h>
171ace24b3SKyle Evans #include <fcntl.h>
181ace24b3SKyle Evans #include <limits.h>
191ace24b3SKyle Evans #include <poll.h>
201ace24b3SKyle Evans #include <signal.h>
211ace24b3SKyle Evans #include <stdio.h>
221ace24b3SKyle Evans #include <stdlib.h>
231ace24b3SKyle Evans #include <string.h>
241ace24b3SKyle Evans #include <strings.h>
251ace24b3SKyle Evans #include <sysexits.h>
261ace24b3SKyle Evans #include <unistd.h>
271ace24b3SKyle Evans #include <wchar.h>
281ace24b3SKyle Evans #include <atf-c.h>
291ace24b3SKyle Evans
301ace24b3SKyle Evans static FILE * __unused
new_fp(size_t __len)311ace24b3SKyle Evans new_fp(size_t __len)
321ace24b3SKyle Evans {
331ace24b3SKyle Evans static char fpbuf[LINE_MAX];
341ace24b3SKyle Evans FILE *fp;
351ace24b3SKyle Evans
361ace24b3SKyle Evans ATF_REQUIRE(__len <= sizeof(fpbuf));
371ace24b3SKyle Evans
381ace24b3SKyle Evans memset(fpbuf, 'A', sizeof(fpbuf) - 1);
391ace24b3SKyle Evans fpbuf[sizeof(fpbuf) - 1] = '\0';
401ace24b3SKyle Evans
411ace24b3SKyle Evans fp = fmemopen(fpbuf, sizeof(fpbuf), "rb");
421ace24b3SKyle Evans ATF_REQUIRE(fp != NULL);
431ace24b3SKyle Evans
441ace24b3SKyle Evans return (fp);
451ace24b3SKyle Evans }
461ace24b3SKyle Evans
471ace24b3SKyle Evans /*
481ace24b3SKyle Evans * Create a new symlink to use for readlink(2) style tests, we'll just use a
491ace24b3SKyle Evans * random target name to have something interesting to look at.
501ace24b3SKyle Evans */
511ace24b3SKyle Evans static const char * __unused
new_symlink(size_t __len)521ace24b3SKyle Evans new_symlink(size_t __len)
531ace24b3SKyle Evans {
541ace24b3SKyle Evans static const char linkname[] = "link";
551ace24b3SKyle Evans char target[MAXNAMLEN];
561ace24b3SKyle Evans int error;
571ace24b3SKyle Evans
581ace24b3SKyle Evans ATF_REQUIRE(__len <= sizeof(target));
591ace24b3SKyle Evans
601ace24b3SKyle Evans arc4random_buf(target, sizeof(target));
611ace24b3SKyle Evans
621ace24b3SKyle Evans error = unlink(linkname);
631ace24b3SKyle Evans ATF_REQUIRE(error == 0 || errno == ENOENT);
641ace24b3SKyle Evans
651ace24b3SKyle Evans error = symlink(target, linkname);
661ace24b3SKyle Evans ATF_REQUIRE(error == 0);
671ace24b3SKyle Evans
681ace24b3SKyle Evans return (linkname);
691ace24b3SKyle Evans }
701ace24b3SKyle Evans
711ace24b3SKyle 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 /*
1161ace24b3SKyle Evans * Constructs a tmpfile that we can use for testing read(2) and friends.
1171ace24b3SKyle Evans */
1181ace24b3SKyle Evans static int __unused
new_tmpfile(void)1191ace24b3SKyle Evans new_tmpfile(void)
1201ace24b3SKyle Evans {
1211ace24b3SKyle Evans char buf[1024];
1221ace24b3SKyle Evans ssize_t rv;
1231ace24b3SKyle Evans size_t written;
1241ace24b3SKyle Evans int fd;
1251ace24b3SKyle Evans
1261ace24b3SKyle Evans fd = open("tmpfile", O_RDWR | O_CREAT | O_TRUNC, 0644);
1271ace24b3SKyle Evans ATF_REQUIRE(fd >= 0);
1281ace24b3SKyle Evans
1291ace24b3SKyle Evans written = 0;
1301ace24b3SKyle Evans while (written < TMPFILE_SIZE) {
1311ace24b3SKyle Evans rv = write(fd, buf, sizeof(buf));
1321ace24b3SKyle Evans ATF_REQUIRE(rv > 0);
1331ace24b3SKyle Evans
1341ace24b3SKyle Evans written += rv;
1351ace24b3SKyle Evans }
1361ace24b3SKyle Evans
1371ace24b3SKyle Evans ATF_REQUIRE_EQ(0, lseek(fd, 0, SEEK_SET));
1381ace24b3SKyle Evans return (fd);
1391ace24b3SKyle Evans }
1401ace24b3SKyle Evans
1411ace24b3SKyle Evans static void
disable_coredumps(void)1421ace24b3SKyle Evans disable_coredumps(void)
1431ace24b3SKyle Evans {
1441ace24b3SKyle Evans struct rlimit rl = { 0 };
1451ace24b3SKyle Evans
1461ace24b3SKyle Evans if (setrlimit(RLIMIT_CORE, &rl) == -1)
1471ace24b3SKyle Evans _exit(EX_OSERR);
1481ace24b3SKyle Evans }
1491ace24b3SKyle Evans
1501ace24b3SKyle Evans /*
1511ace24b3SKyle Evans * Replaces stdin with a file that we can actually read from, for tests where
1521ace24b3SKyle Evans * we want a FILE * or fd that we can get data from.
1531ace24b3SKyle Evans */
1541ace24b3SKyle Evans static void __unused
replace_stdin(void)1551ace24b3SKyle Evans replace_stdin(void)
1561ace24b3SKyle Evans {
1571ace24b3SKyle Evans int fd;
1581ace24b3SKyle Evans
1591ace24b3SKyle Evans fd = new_tmpfile();
1601ace24b3SKyle Evans
1611ace24b3SKyle Evans (void)dup2(fd, STDIN_FILENO);
1621ace24b3SKyle Evans if (fd != STDIN_FILENO)
1631ace24b3SKyle Evans close(fd);
1641ace24b3SKyle Evans }
1651ace24b3SKyle Evans
16609cdbf04SKyle Evans ATF_TC(readv_before_end);
ATF_TC_HEAD(readv_before_end,tc)16709cdbf04SKyle Evans ATF_TC_HEAD(readv_before_end, tc)
16809cdbf04SKyle Evans {
16909cdbf04SKyle Evans }
ATF_TC_BODY(readv_before_end,tc)1701ace24b3SKyle Evans ATF_TC_BODY(readv_before_end, tc)
1711ace24b3SKyle Evans {
1721ace24b3SKyle Evans #define BUF &__stack.__buf
1731ace24b3SKyle Evans struct {
1741ace24b3SKyle Evans uint8_t padding_l;
1751ace24b3SKyle Evans struct iovec __buf[2];
1761ace24b3SKyle Evans uint8_t padding_r;
1771ace24b3SKyle Evans } __stack;
1781ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
1791ace24b3SKyle Evans const size_t __len = 2 - 1;
1801ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
1811ace24b3SKyle Evans
1821ace24b3SKyle Evans readv(STDIN_FILENO, __stack.__buf, __len);
1831ace24b3SKyle Evans #undef BUF
1841ace24b3SKyle Evans
1851ace24b3SKyle Evans }
1861ace24b3SKyle Evans
18709cdbf04SKyle Evans ATF_TC(readv_end);
ATF_TC_HEAD(readv_end,tc)18809cdbf04SKyle Evans ATF_TC_HEAD(readv_end, tc)
18909cdbf04SKyle Evans {
19009cdbf04SKyle Evans }
ATF_TC_BODY(readv_end,tc)1911ace24b3SKyle Evans ATF_TC_BODY(readv_end, tc)
1921ace24b3SKyle Evans {
1931ace24b3SKyle Evans #define BUF &__stack.__buf
1941ace24b3SKyle Evans struct {
1951ace24b3SKyle Evans uint8_t padding_l;
1961ace24b3SKyle Evans struct iovec __buf[2];
1971ace24b3SKyle Evans uint8_t padding_r;
1981ace24b3SKyle Evans } __stack;
1991ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
2001ace24b3SKyle Evans const size_t __len = 2;
2011ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
2021ace24b3SKyle Evans
2031ace24b3SKyle Evans readv(STDIN_FILENO, __stack.__buf, __len);
2041ace24b3SKyle Evans #undef BUF
2051ace24b3SKyle Evans
2061ace24b3SKyle Evans }
2071ace24b3SKyle Evans
20809cdbf04SKyle Evans ATF_TC(readv_after_end);
ATF_TC_HEAD(readv_after_end,tc)20909cdbf04SKyle Evans ATF_TC_HEAD(readv_after_end, tc)
21009cdbf04SKyle Evans {
21109cdbf04SKyle Evans }
ATF_TC_BODY(readv_after_end,tc)2121ace24b3SKyle Evans ATF_TC_BODY(readv_after_end, tc)
2131ace24b3SKyle Evans {
2141ace24b3SKyle Evans #define BUF &__stack.__buf
2151ace24b3SKyle Evans struct {
2161ace24b3SKyle Evans uint8_t padding_l;
2171ace24b3SKyle Evans struct iovec __buf[2];
2181ace24b3SKyle Evans uint8_t padding_r;
2191ace24b3SKyle Evans } __stack;
2201ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
2211ace24b3SKyle Evans const size_t __len = 2 + 1;
2221ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
2231ace24b3SKyle Evans pid_t __child;
2241ace24b3SKyle Evans int __status;
2251ace24b3SKyle Evans
2261ace24b3SKyle Evans __child = fork();
2271ace24b3SKyle Evans ATF_REQUIRE(__child >= 0);
2281ace24b3SKyle Evans if (__child > 0)
2291ace24b3SKyle Evans goto monitor;
2301ace24b3SKyle Evans
2311ace24b3SKyle Evans /* Child */
2321ace24b3SKyle Evans disable_coredumps();
2331ace24b3SKyle Evans readv(STDIN_FILENO, __stack.__buf, __len);
2341ace24b3SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
2351ace24b3SKyle Evans
2361ace24b3SKyle Evans monitor:
2371ace24b3SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
2381ace24b3SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
2391ace24b3SKyle Evans }
2401ace24b3SKyle Evans
2411ace24b3SKyle Evans if (!WIFSIGNALED(__status)) {
2421ace24b3SKyle Evans switch (WEXITSTATUS(__status)) {
2431ace24b3SKyle Evans case EX_SOFTWARE:
2441ace24b3SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
2451ace24b3SKyle Evans break;
2461ace24b3SKyle Evans case EX_OSERR:
2471ace24b3SKyle Evans atf_tc_fail("setrlimit(2) failed");
2481ace24b3SKyle Evans break;
2491ace24b3SKyle Evans default:
2501ace24b3SKyle Evans atf_tc_fail("child exited with status %d",
2511ace24b3SKyle Evans WEXITSTATUS(__status));
2521ace24b3SKyle Evans }
2531ace24b3SKyle Evans } else {
2541ace24b3SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
2551ace24b3SKyle Evans }
2561ace24b3SKyle Evans #undef BUF
2571ace24b3SKyle Evans
2581ace24b3SKyle Evans }
2591ace24b3SKyle Evans
26009cdbf04SKyle Evans ATF_TC(readv_heap_before_end);
ATF_TC_HEAD(readv_heap_before_end,tc)26109cdbf04SKyle Evans ATF_TC_HEAD(readv_heap_before_end, tc)
26209cdbf04SKyle Evans {
26309cdbf04SKyle Evans }
ATF_TC_BODY(readv_heap_before_end,tc)2641ace24b3SKyle Evans ATF_TC_BODY(readv_heap_before_end, tc)
2651ace24b3SKyle Evans {
2661ace24b3SKyle Evans #define BUF __stack.__buf
2671ace24b3SKyle Evans struct {
2681ace24b3SKyle Evans uint8_t padding_l;
2691ace24b3SKyle Evans struct iovec * __buf;
2701ace24b3SKyle Evans uint8_t padding_r;
2711ace24b3SKyle Evans } __stack;
2721ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (2);
2731ace24b3SKyle Evans const size_t __len = 2 - 1;
2741ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
2751ace24b3SKyle Evans
2761ace24b3SKyle Evans __stack.__buf = malloc(__bufsz);
2771ace24b3SKyle Evans
2781ace24b3SKyle Evans readv(STDIN_FILENO, __stack.__buf, __len);
2791ace24b3SKyle Evans #undef BUF
2801ace24b3SKyle Evans
2811ace24b3SKyle Evans }
2821ace24b3SKyle Evans
28309cdbf04SKyle Evans ATF_TC(readv_heap_end);
ATF_TC_HEAD(readv_heap_end,tc)28409cdbf04SKyle Evans ATF_TC_HEAD(readv_heap_end, tc)
28509cdbf04SKyle Evans {
28609cdbf04SKyle Evans }
ATF_TC_BODY(readv_heap_end,tc)2871ace24b3SKyle Evans ATF_TC_BODY(readv_heap_end, tc)
2881ace24b3SKyle Evans {
2891ace24b3SKyle Evans #define BUF __stack.__buf
2901ace24b3SKyle Evans struct {
2911ace24b3SKyle Evans uint8_t padding_l;
2921ace24b3SKyle Evans struct iovec * __buf;
2931ace24b3SKyle Evans uint8_t padding_r;
2941ace24b3SKyle Evans } __stack;
2951ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (2);
2961ace24b3SKyle Evans const size_t __len = 2;
2971ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
2981ace24b3SKyle Evans
2991ace24b3SKyle Evans __stack.__buf = malloc(__bufsz);
3001ace24b3SKyle Evans
3011ace24b3SKyle Evans readv(STDIN_FILENO, __stack.__buf, __len);
3021ace24b3SKyle Evans #undef BUF
3031ace24b3SKyle Evans
3041ace24b3SKyle Evans }
3051ace24b3SKyle Evans
30609cdbf04SKyle Evans ATF_TC(readv_heap_after_end);
ATF_TC_HEAD(readv_heap_after_end,tc)30709cdbf04SKyle Evans ATF_TC_HEAD(readv_heap_after_end, tc)
30809cdbf04SKyle Evans {
30909cdbf04SKyle Evans }
ATF_TC_BODY(readv_heap_after_end,tc)3101ace24b3SKyle Evans ATF_TC_BODY(readv_heap_after_end, tc)
3111ace24b3SKyle Evans {
3121ace24b3SKyle Evans #define BUF __stack.__buf
3131ace24b3SKyle Evans struct {
3141ace24b3SKyle Evans uint8_t padding_l;
3151ace24b3SKyle Evans struct iovec * __buf;
3161ace24b3SKyle Evans uint8_t padding_r;
3171ace24b3SKyle Evans } __stack;
3181ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (2);
3191ace24b3SKyle Evans const size_t __len = 2 + 1;
3201ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
3211ace24b3SKyle Evans pid_t __child;
3221ace24b3SKyle Evans int __status;
3231ace24b3SKyle Evans
3241ace24b3SKyle Evans __child = fork();
3251ace24b3SKyle Evans ATF_REQUIRE(__child >= 0);
3261ace24b3SKyle Evans if (__child > 0)
3271ace24b3SKyle Evans goto monitor;
3281ace24b3SKyle Evans
3291ace24b3SKyle Evans /* Child */
3301ace24b3SKyle Evans disable_coredumps();
3311ace24b3SKyle Evans __stack.__buf = malloc(__bufsz);
3321ace24b3SKyle Evans
3331ace24b3SKyle Evans readv(STDIN_FILENO, __stack.__buf, __len);
3341ace24b3SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
3351ace24b3SKyle Evans
3361ace24b3SKyle Evans monitor:
3371ace24b3SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
3381ace24b3SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
3391ace24b3SKyle Evans }
3401ace24b3SKyle Evans
3411ace24b3SKyle Evans if (!WIFSIGNALED(__status)) {
3421ace24b3SKyle Evans switch (WEXITSTATUS(__status)) {
3431ace24b3SKyle Evans case EX_SOFTWARE:
3441ace24b3SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
3451ace24b3SKyle Evans break;
3461ace24b3SKyle Evans case EX_OSERR:
3471ace24b3SKyle Evans atf_tc_fail("setrlimit(2) failed");
3481ace24b3SKyle Evans break;
3491ace24b3SKyle Evans default:
3501ace24b3SKyle Evans atf_tc_fail("child exited with status %d",
3511ace24b3SKyle Evans WEXITSTATUS(__status));
3521ace24b3SKyle Evans }
3531ace24b3SKyle Evans } else {
3541ace24b3SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
3551ace24b3SKyle Evans }
3561ace24b3SKyle Evans #undef BUF
3571ace24b3SKyle Evans
3581ace24b3SKyle Evans }
3591ace24b3SKyle Evans
36009cdbf04SKyle Evans ATF_TC(readv_iov_before_end);
ATF_TC_HEAD(readv_iov_before_end,tc)36109cdbf04SKyle Evans ATF_TC_HEAD(readv_iov_before_end, tc)
36209cdbf04SKyle Evans {
36309cdbf04SKyle Evans }
ATF_TC_BODY(readv_iov_before_end,tc)3641ace24b3SKyle Evans ATF_TC_BODY(readv_iov_before_end, tc)
3651ace24b3SKyle Evans {
3661ace24b3SKyle Evans #define BUF &__stack.__buf
3671ace24b3SKyle Evans struct {
3681ace24b3SKyle Evans uint8_t padding_l;
3691ace24b3SKyle Evans unsigned char __buf[42];
3701ace24b3SKyle Evans uint8_t padding_r;
3711ace24b3SKyle Evans } __stack;
3721ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
3731ace24b3SKyle Evans const size_t __len = 42 - 1;
3741ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
3751ace24b3SKyle Evans struct iovec iov[1];
3761ace24b3SKyle Evans
3771ace24b3SKyle Evans iov[0].iov_base = __stack.__buf;
3781ace24b3SKyle Evans iov[0].iov_len = __len;
3791ace24b3SKyle Evans
3801ace24b3SKyle Evans replace_stdin();
3811ace24b3SKyle Evans
3821ace24b3SKyle Evans readv(STDIN_FILENO, iov, nitems(iov));
3831ace24b3SKyle Evans #undef BUF
3841ace24b3SKyle Evans
3851ace24b3SKyle Evans }
3861ace24b3SKyle Evans
38709cdbf04SKyle Evans ATF_TC(readv_iov_end);
ATF_TC_HEAD(readv_iov_end,tc)38809cdbf04SKyle Evans ATF_TC_HEAD(readv_iov_end, tc)
38909cdbf04SKyle Evans {
39009cdbf04SKyle Evans }
ATF_TC_BODY(readv_iov_end,tc)3911ace24b3SKyle Evans ATF_TC_BODY(readv_iov_end, tc)
3921ace24b3SKyle Evans {
3931ace24b3SKyle Evans #define BUF &__stack.__buf
3941ace24b3SKyle Evans struct {
3951ace24b3SKyle Evans uint8_t padding_l;
3961ace24b3SKyle Evans unsigned char __buf[42];
3971ace24b3SKyle Evans uint8_t padding_r;
3981ace24b3SKyle Evans } __stack;
3991ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
4001ace24b3SKyle Evans const size_t __len = 42;
4011ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
4021ace24b3SKyle Evans struct iovec iov[1];
4031ace24b3SKyle Evans
4041ace24b3SKyle Evans iov[0].iov_base = __stack.__buf;
4051ace24b3SKyle Evans iov[0].iov_len = __len;
4061ace24b3SKyle Evans
4071ace24b3SKyle Evans replace_stdin();
4081ace24b3SKyle Evans
4091ace24b3SKyle Evans readv(STDIN_FILENO, iov, nitems(iov));
4101ace24b3SKyle Evans #undef BUF
4111ace24b3SKyle Evans
4121ace24b3SKyle Evans }
4131ace24b3SKyle Evans
41409cdbf04SKyle Evans ATF_TC(readv_iov_heap_before_end);
ATF_TC_HEAD(readv_iov_heap_before_end,tc)41509cdbf04SKyle Evans ATF_TC_HEAD(readv_iov_heap_before_end, tc)
41609cdbf04SKyle Evans {
41709cdbf04SKyle Evans }
ATF_TC_BODY(readv_iov_heap_before_end,tc)4181ace24b3SKyle Evans ATF_TC_BODY(readv_iov_heap_before_end, tc)
4191ace24b3SKyle Evans {
4201ace24b3SKyle Evans #define BUF __stack.__buf
4211ace24b3SKyle Evans struct {
4221ace24b3SKyle Evans uint8_t padding_l;
4231ace24b3SKyle Evans unsigned char * __buf;
4241ace24b3SKyle Evans uint8_t padding_r;
4251ace24b3SKyle Evans } __stack;
4261ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
4271ace24b3SKyle Evans const size_t __len = 42 - 1;
4281ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
4291ace24b3SKyle Evans struct iovec iov[1];
4301ace24b3SKyle Evans
4311ace24b3SKyle Evans __stack.__buf = malloc(__bufsz);
4321ace24b3SKyle Evans iov[0].iov_base = __stack.__buf;
4331ace24b3SKyle Evans iov[0].iov_len = __len;
4341ace24b3SKyle Evans
4351ace24b3SKyle Evans replace_stdin();
4361ace24b3SKyle Evans
4371ace24b3SKyle Evans readv(STDIN_FILENO, iov, nitems(iov));
4381ace24b3SKyle Evans #undef BUF
4391ace24b3SKyle Evans
4401ace24b3SKyle Evans }
4411ace24b3SKyle Evans
44209cdbf04SKyle Evans ATF_TC(readv_iov_heap_end);
ATF_TC_HEAD(readv_iov_heap_end,tc)44309cdbf04SKyle Evans ATF_TC_HEAD(readv_iov_heap_end, tc)
44409cdbf04SKyle Evans {
44509cdbf04SKyle Evans }
ATF_TC_BODY(readv_iov_heap_end,tc)4461ace24b3SKyle Evans ATF_TC_BODY(readv_iov_heap_end, tc)
4471ace24b3SKyle Evans {
4481ace24b3SKyle Evans #define BUF __stack.__buf
4491ace24b3SKyle Evans struct {
4501ace24b3SKyle Evans uint8_t padding_l;
4511ace24b3SKyle Evans unsigned char * __buf;
4521ace24b3SKyle Evans uint8_t padding_r;
4531ace24b3SKyle Evans } __stack;
4541ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
4551ace24b3SKyle Evans const size_t __len = 42;
4561ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
4571ace24b3SKyle Evans struct iovec iov[1];
4581ace24b3SKyle Evans
4591ace24b3SKyle Evans __stack.__buf = malloc(__bufsz);
4601ace24b3SKyle Evans iov[0].iov_base = __stack.__buf;
4611ace24b3SKyle Evans iov[0].iov_len = __len;
4621ace24b3SKyle Evans
4631ace24b3SKyle Evans replace_stdin();
4641ace24b3SKyle Evans
4651ace24b3SKyle Evans readv(STDIN_FILENO, iov, nitems(iov));
4661ace24b3SKyle Evans #undef BUF
4671ace24b3SKyle Evans
4681ace24b3SKyle Evans }
4691ace24b3SKyle Evans
47009cdbf04SKyle Evans ATF_TC(readv_iov_heap_after_end);
ATF_TC_HEAD(readv_iov_heap_after_end,tc)47109cdbf04SKyle Evans ATF_TC_HEAD(readv_iov_heap_after_end, tc)
47209cdbf04SKyle Evans {
47309cdbf04SKyle Evans }
ATF_TC_BODY(readv_iov_heap_after_end,tc)4741ace24b3SKyle Evans ATF_TC_BODY(readv_iov_heap_after_end, tc)
4751ace24b3SKyle Evans {
4761ace24b3SKyle Evans #define BUF __stack.__buf
4771ace24b3SKyle Evans struct {
4781ace24b3SKyle Evans uint8_t padding_l;
4791ace24b3SKyle Evans unsigned char * __buf;
4801ace24b3SKyle Evans uint8_t padding_r;
4811ace24b3SKyle Evans } __stack;
4821ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
4831ace24b3SKyle Evans const size_t __len = 42 + 1;
4841ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
4851ace24b3SKyle Evans pid_t __child;
4861ace24b3SKyle Evans int __status;
4871ace24b3SKyle Evans struct iovec iov[1];
4881ace24b3SKyle Evans
4891ace24b3SKyle Evans __child = fork();
4901ace24b3SKyle Evans ATF_REQUIRE(__child >= 0);
4911ace24b3SKyle Evans if (__child > 0)
4921ace24b3SKyle Evans goto monitor;
4931ace24b3SKyle Evans
4941ace24b3SKyle Evans /* Child */
4951ace24b3SKyle Evans disable_coredumps();
4961ace24b3SKyle Evans __stack.__buf = malloc(__bufsz);
4971ace24b3SKyle Evans iov[0].iov_base = __stack.__buf;
4981ace24b3SKyle Evans iov[0].iov_len = __len;
4991ace24b3SKyle Evans
5001ace24b3SKyle Evans replace_stdin();
5011ace24b3SKyle Evans
5021ace24b3SKyle Evans readv(STDIN_FILENO, iov, nitems(iov));
5031ace24b3SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
5041ace24b3SKyle Evans
5051ace24b3SKyle Evans monitor:
5061ace24b3SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
5071ace24b3SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
5081ace24b3SKyle Evans }
5091ace24b3SKyle Evans
5101ace24b3SKyle Evans if (!WIFSIGNALED(__status)) {
5111ace24b3SKyle Evans switch (WEXITSTATUS(__status)) {
5121ace24b3SKyle Evans case EX_SOFTWARE:
5131ace24b3SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
5141ace24b3SKyle Evans break;
5151ace24b3SKyle Evans case EX_OSERR:
5161ace24b3SKyle Evans atf_tc_fail("setrlimit(2) failed");
5171ace24b3SKyle Evans break;
5181ace24b3SKyle Evans default:
5191ace24b3SKyle Evans atf_tc_fail("child exited with status %d",
5201ace24b3SKyle Evans WEXITSTATUS(__status));
5211ace24b3SKyle Evans }
5221ace24b3SKyle Evans } else {
5231ace24b3SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
5241ace24b3SKyle Evans }
5251ace24b3SKyle Evans #undef BUF
5261ace24b3SKyle Evans
5271ace24b3SKyle Evans }
5281ace24b3SKyle Evans
52909cdbf04SKyle Evans ATF_TC(preadv_before_end);
ATF_TC_HEAD(preadv_before_end,tc)53009cdbf04SKyle Evans ATF_TC_HEAD(preadv_before_end, tc)
53109cdbf04SKyle Evans {
53209cdbf04SKyle Evans }
ATF_TC_BODY(preadv_before_end,tc)5331ace24b3SKyle Evans ATF_TC_BODY(preadv_before_end, tc)
5341ace24b3SKyle Evans {
5351ace24b3SKyle Evans #define BUF &__stack.__buf
5361ace24b3SKyle Evans struct {
5371ace24b3SKyle Evans uint8_t padding_l;
5381ace24b3SKyle Evans struct iovec __buf[2];
5391ace24b3SKyle Evans uint8_t padding_r;
5401ace24b3SKyle Evans } __stack;
5411ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
5421ace24b3SKyle Evans const size_t __len = 2 - 1;
5431ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
5441ace24b3SKyle Evans
5451ace24b3SKyle Evans preadv(STDIN_FILENO, __stack.__buf, __len, 0);
5461ace24b3SKyle Evans #undef BUF
5471ace24b3SKyle Evans
5481ace24b3SKyle Evans }
5491ace24b3SKyle Evans
55009cdbf04SKyle Evans ATF_TC(preadv_end);
ATF_TC_HEAD(preadv_end,tc)55109cdbf04SKyle Evans ATF_TC_HEAD(preadv_end, tc)
55209cdbf04SKyle Evans {
55309cdbf04SKyle Evans }
ATF_TC_BODY(preadv_end,tc)5541ace24b3SKyle Evans ATF_TC_BODY(preadv_end, tc)
5551ace24b3SKyle Evans {
5561ace24b3SKyle Evans #define BUF &__stack.__buf
5571ace24b3SKyle Evans struct {
5581ace24b3SKyle Evans uint8_t padding_l;
5591ace24b3SKyle Evans struct iovec __buf[2];
5601ace24b3SKyle Evans uint8_t padding_r;
5611ace24b3SKyle Evans } __stack;
5621ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
5631ace24b3SKyle Evans const size_t __len = 2;
5641ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
5651ace24b3SKyle Evans
5661ace24b3SKyle Evans preadv(STDIN_FILENO, __stack.__buf, __len, 0);
5671ace24b3SKyle Evans #undef BUF
5681ace24b3SKyle Evans
5691ace24b3SKyle Evans }
5701ace24b3SKyle Evans
57109cdbf04SKyle Evans ATF_TC(preadv_after_end);
ATF_TC_HEAD(preadv_after_end,tc)57209cdbf04SKyle Evans ATF_TC_HEAD(preadv_after_end, tc)
57309cdbf04SKyle Evans {
57409cdbf04SKyle Evans }
ATF_TC_BODY(preadv_after_end,tc)5751ace24b3SKyle Evans ATF_TC_BODY(preadv_after_end, tc)
5761ace24b3SKyle Evans {
5771ace24b3SKyle Evans #define BUF &__stack.__buf
5781ace24b3SKyle Evans struct {
5791ace24b3SKyle Evans uint8_t padding_l;
5801ace24b3SKyle Evans struct iovec __buf[2];
5811ace24b3SKyle Evans uint8_t padding_r;
5821ace24b3SKyle Evans } __stack;
5831ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
5841ace24b3SKyle Evans const size_t __len = 2 + 1;
5851ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
5861ace24b3SKyle Evans pid_t __child;
5871ace24b3SKyle Evans int __status;
5881ace24b3SKyle Evans
5891ace24b3SKyle Evans __child = fork();
5901ace24b3SKyle Evans ATF_REQUIRE(__child >= 0);
5911ace24b3SKyle Evans if (__child > 0)
5921ace24b3SKyle Evans goto monitor;
5931ace24b3SKyle Evans
5941ace24b3SKyle Evans /* Child */
5951ace24b3SKyle Evans disable_coredumps();
5961ace24b3SKyle Evans preadv(STDIN_FILENO, __stack.__buf, __len, 0);
5971ace24b3SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
5981ace24b3SKyle Evans
5991ace24b3SKyle Evans monitor:
6001ace24b3SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
6011ace24b3SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
6021ace24b3SKyle Evans }
6031ace24b3SKyle Evans
6041ace24b3SKyle Evans if (!WIFSIGNALED(__status)) {
6051ace24b3SKyle Evans switch (WEXITSTATUS(__status)) {
6061ace24b3SKyle Evans case EX_SOFTWARE:
6071ace24b3SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
6081ace24b3SKyle Evans break;
6091ace24b3SKyle Evans case EX_OSERR:
6101ace24b3SKyle Evans atf_tc_fail("setrlimit(2) failed");
6111ace24b3SKyle Evans break;
6121ace24b3SKyle Evans default:
6131ace24b3SKyle Evans atf_tc_fail("child exited with status %d",
6141ace24b3SKyle Evans WEXITSTATUS(__status));
6151ace24b3SKyle Evans }
6161ace24b3SKyle Evans } else {
6171ace24b3SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
6181ace24b3SKyle Evans }
6191ace24b3SKyle Evans #undef BUF
6201ace24b3SKyle Evans
6211ace24b3SKyle Evans }
6221ace24b3SKyle Evans
62309cdbf04SKyle Evans ATF_TC(preadv_heap_before_end);
ATF_TC_HEAD(preadv_heap_before_end,tc)62409cdbf04SKyle Evans ATF_TC_HEAD(preadv_heap_before_end, tc)
62509cdbf04SKyle Evans {
62609cdbf04SKyle Evans }
ATF_TC_BODY(preadv_heap_before_end,tc)6271ace24b3SKyle Evans ATF_TC_BODY(preadv_heap_before_end, tc)
6281ace24b3SKyle Evans {
6291ace24b3SKyle Evans #define BUF __stack.__buf
6301ace24b3SKyle Evans struct {
6311ace24b3SKyle Evans uint8_t padding_l;
6321ace24b3SKyle Evans struct iovec * __buf;
6331ace24b3SKyle Evans uint8_t padding_r;
6341ace24b3SKyle Evans } __stack;
6351ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (2);
6361ace24b3SKyle Evans const size_t __len = 2 - 1;
6371ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
6381ace24b3SKyle Evans
6391ace24b3SKyle Evans __stack.__buf = malloc(__bufsz);
6401ace24b3SKyle Evans
6411ace24b3SKyle Evans preadv(STDIN_FILENO, __stack.__buf, __len, 0);
6421ace24b3SKyle Evans #undef BUF
6431ace24b3SKyle Evans
6441ace24b3SKyle Evans }
6451ace24b3SKyle Evans
64609cdbf04SKyle Evans ATF_TC(preadv_heap_end);
ATF_TC_HEAD(preadv_heap_end,tc)64709cdbf04SKyle Evans ATF_TC_HEAD(preadv_heap_end, tc)
64809cdbf04SKyle Evans {
64909cdbf04SKyle Evans }
ATF_TC_BODY(preadv_heap_end,tc)6501ace24b3SKyle Evans ATF_TC_BODY(preadv_heap_end, tc)
6511ace24b3SKyle Evans {
6521ace24b3SKyle Evans #define BUF __stack.__buf
6531ace24b3SKyle Evans struct {
6541ace24b3SKyle Evans uint8_t padding_l;
6551ace24b3SKyle Evans struct iovec * __buf;
6561ace24b3SKyle Evans uint8_t padding_r;
6571ace24b3SKyle Evans } __stack;
6581ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (2);
6591ace24b3SKyle Evans const size_t __len = 2;
6601ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
6611ace24b3SKyle Evans
6621ace24b3SKyle Evans __stack.__buf = malloc(__bufsz);
6631ace24b3SKyle Evans
6641ace24b3SKyle Evans preadv(STDIN_FILENO, __stack.__buf, __len, 0);
6651ace24b3SKyle Evans #undef BUF
6661ace24b3SKyle Evans
6671ace24b3SKyle Evans }
6681ace24b3SKyle Evans
66909cdbf04SKyle Evans ATF_TC(preadv_heap_after_end);
ATF_TC_HEAD(preadv_heap_after_end,tc)67009cdbf04SKyle Evans ATF_TC_HEAD(preadv_heap_after_end, tc)
67109cdbf04SKyle Evans {
67209cdbf04SKyle Evans }
ATF_TC_BODY(preadv_heap_after_end,tc)6731ace24b3SKyle Evans ATF_TC_BODY(preadv_heap_after_end, tc)
6741ace24b3SKyle Evans {
6751ace24b3SKyle Evans #define BUF __stack.__buf
6761ace24b3SKyle Evans struct {
6771ace24b3SKyle Evans uint8_t padding_l;
6781ace24b3SKyle Evans struct iovec * __buf;
6791ace24b3SKyle Evans uint8_t padding_r;
6801ace24b3SKyle Evans } __stack;
6811ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (2);
6821ace24b3SKyle Evans const size_t __len = 2 + 1;
6831ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
6841ace24b3SKyle Evans pid_t __child;
6851ace24b3SKyle Evans int __status;
6861ace24b3SKyle Evans
6871ace24b3SKyle Evans __child = fork();
6881ace24b3SKyle Evans ATF_REQUIRE(__child >= 0);
6891ace24b3SKyle Evans if (__child > 0)
6901ace24b3SKyle Evans goto monitor;
6911ace24b3SKyle Evans
6921ace24b3SKyle Evans /* Child */
6931ace24b3SKyle Evans disable_coredumps();
6941ace24b3SKyle Evans __stack.__buf = malloc(__bufsz);
6951ace24b3SKyle Evans
6961ace24b3SKyle Evans preadv(STDIN_FILENO, __stack.__buf, __len, 0);
6971ace24b3SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
6981ace24b3SKyle Evans
6991ace24b3SKyle Evans monitor:
7001ace24b3SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
7011ace24b3SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
7021ace24b3SKyle Evans }
7031ace24b3SKyle Evans
7041ace24b3SKyle Evans if (!WIFSIGNALED(__status)) {
7051ace24b3SKyle Evans switch (WEXITSTATUS(__status)) {
7061ace24b3SKyle Evans case EX_SOFTWARE:
7071ace24b3SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
7081ace24b3SKyle Evans break;
7091ace24b3SKyle Evans case EX_OSERR:
7101ace24b3SKyle Evans atf_tc_fail("setrlimit(2) failed");
7111ace24b3SKyle Evans break;
7121ace24b3SKyle Evans default:
7131ace24b3SKyle Evans atf_tc_fail("child exited with status %d",
7141ace24b3SKyle Evans WEXITSTATUS(__status));
7151ace24b3SKyle Evans }
7161ace24b3SKyle Evans } else {
7171ace24b3SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
7181ace24b3SKyle Evans }
7191ace24b3SKyle Evans #undef BUF
7201ace24b3SKyle Evans
7211ace24b3SKyle Evans }
7221ace24b3SKyle Evans
72309cdbf04SKyle Evans ATF_TC(preadv_iov_before_end);
ATF_TC_HEAD(preadv_iov_before_end,tc)72409cdbf04SKyle Evans ATF_TC_HEAD(preadv_iov_before_end, tc)
72509cdbf04SKyle Evans {
72609cdbf04SKyle Evans }
ATF_TC_BODY(preadv_iov_before_end,tc)7271ace24b3SKyle Evans ATF_TC_BODY(preadv_iov_before_end, tc)
7281ace24b3SKyle Evans {
7291ace24b3SKyle Evans #define BUF &__stack.__buf
7301ace24b3SKyle Evans struct {
7311ace24b3SKyle Evans uint8_t padding_l;
7321ace24b3SKyle Evans unsigned char __buf[42];
7331ace24b3SKyle Evans uint8_t padding_r;
7341ace24b3SKyle Evans } __stack;
7351ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
7361ace24b3SKyle Evans const size_t __len = 42 - 1;
7371ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
7381ace24b3SKyle Evans struct iovec iov[1];
7391ace24b3SKyle Evans
7401ace24b3SKyle Evans iov[0].iov_base = __stack.__buf;
7411ace24b3SKyle Evans iov[0].iov_len = __len;
7421ace24b3SKyle Evans
7431ace24b3SKyle Evans replace_stdin();
7441ace24b3SKyle Evans
7451ace24b3SKyle Evans preadv(STDIN_FILENO, iov, nitems(iov), 0);
7461ace24b3SKyle Evans #undef BUF
7471ace24b3SKyle Evans
7481ace24b3SKyle Evans }
7491ace24b3SKyle Evans
75009cdbf04SKyle Evans ATF_TC(preadv_iov_end);
ATF_TC_HEAD(preadv_iov_end,tc)75109cdbf04SKyle Evans ATF_TC_HEAD(preadv_iov_end, tc)
75209cdbf04SKyle Evans {
75309cdbf04SKyle Evans }
ATF_TC_BODY(preadv_iov_end,tc)7541ace24b3SKyle Evans ATF_TC_BODY(preadv_iov_end, tc)
7551ace24b3SKyle Evans {
7561ace24b3SKyle Evans #define BUF &__stack.__buf
7571ace24b3SKyle Evans struct {
7581ace24b3SKyle Evans uint8_t padding_l;
7591ace24b3SKyle Evans unsigned char __buf[42];
7601ace24b3SKyle Evans uint8_t padding_r;
7611ace24b3SKyle Evans } __stack;
7621ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(__stack.__buf);
7631ace24b3SKyle Evans const size_t __len = 42;
7641ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
7651ace24b3SKyle Evans struct iovec iov[1];
7661ace24b3SKyle Evans
7671ace24b3SKyle Evans iov[0].iov_base = __stack.__buf;
7681ace24b3SKyle Evans iov[0].iov_len = __len;
7691ace24b3SKyle Evans
7701ace24b3SKyle Evans replace_stdin();
7711ace24b3SKyle Evans
7721ace24b3SKyle Evans preadv(STDIN_FILENO, iov, nitems(iov), 0);
7731ace24b3SKyle Evans #undef BUF
7741ace24b3SKyle Evans
7751ace24b3SKyle Evans }
7761ace24b3SKyle Evans
77709cdbf04SKyle Evans ATF_TC(preadv_iov_heap_before_end);
ATF_TC_HEAD(preadv_iov_heap_before_end,tc)77809cdbf04SKyle Evans ATF_TC_HEAD(preadv_iov_heap_before_end, tc)
77909cdbf04SKyle Evans {
78009cdbf04SKyle Evans }
ATF_TC_BODY(preadv_iov_heap_before_end,tc)7811ace24b3SKyle Evans ATF_TC_BODY(preadv_iov_heap_before_end, tc)
7821ace24b3SKyle Evans {
7831ace24b3SKyle Evans #define BUF __stack.__buf
7841ace24b3SKyle Evans struct {
7851ace24b3SKyle Evans uint8_t padding_l;
7861ace24b3SKyle Evans unsigned char * __buf;
7871ace24b3SKyle Evans uint8_t padding_r;
7881ace24b3SKyle Evans } __stack;
7891ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
7901ace24b3SKyle Evans const size_t __len = 42 - 1;
7911ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
7921ace24b3SKyle Evans struct iovec iov[1];
7931ace24b3SKyle Evans
7941ace24b3SKyle Evans __stack.__buf = malloc(__bufsz);
7951ace24b3SKyle Evans iov[0].iov_base = __stack.__buf;
7961ace24b3SKyle Evans iov[0].iov_len = __len;
7971ace24b3SKyle Evans
7981ace24b3SKyle Evans replace_stdin();
7991ace24b3SKyle Evans
8001ace24b3SKyle Evans preadv(STDIN_FILENO, iov, nitems(iov), 0);
8011ace24b3SKyle Evans #undef BUF
8021ace24b3SKyle Evans
8031ace24b3SKyle Evans }
8041ace24b3SKyle Evans
80509cdbf04SKyle Evans ATF_TC(preadv_iov_heap_end);
ATF_TC_HEAD(preadv_iov_heap_end,tc)80609cdbf04SKyle Evans ATF_TC_HEAD(preadv_iov_heap_end, tc)
80709cdbf04SKyle Evans {
80809cdbf04SKyle Evans }
ATF_TC_BODY(preadv_iov_heap_end,tc)8091ace24b3SKyle Evans ATF_TC_BODY(preadv_iov_heap_end, tc)
8101ace24b3SKyle Evans {
8111ace24b3SKyle Evans #define BUF __stack.__buf
8121ace24b3SKyle Evans struct {
8131ace24b3SKyle Evans uint8_t padding_l;
8141ace24b3SKyle Evans unsigned char * __buf;
8151ace24b3SKyle Evans uint8_t padding_r;
8161ace24b3SKyle Evans } __stack;
8171ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
8181ace24b3SKyle Evans const size_t __len = 42;
8191ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
8201ace24b3SKyle Evans struct iovec iov[1];
8211ace24b3SKyle Evans
8221ace24b3SKyle Evans __stack.__buf = malloc(__bufsz);
8231ace24b3SKyle Evans iov[0].iov_base = __stack.__buf;
8241ace24b3SKyle Evans iov[0].iov_len = __len;
8251ace24b3SKyle Evans
8261ace24b3SKyle Evans replace_stdin();
8271ace24b3SKyle Evans
8281ace24b3SKyle Evans preadv(STDIN_FILENO, iov, nitems(iov), 0);
8291ace24b3SKyle Evans #undef BUF
8301ace24b3SKyle Evans
8311ace24b3SKyle Evans }
8321ace24b3SKyle Evans
83309cdbf04SKyle Evans ATF_TC(preadv_iov_heap_after_end);
ATF_TC_HEAD(preadv_iov_heap_after_end,tc)83409cdbf04SKyle Evans ATF_TC_HEAD(preadv_iov_heap_after_end, tc)
83509cdbf04SKyle Evans {
83609cdbf04SKyle Evans }
ATF_TC_BODY(preadv_iov_heap_after_end,tc)8371ace24b3SKyle Evans ATF_TC_BODY(preadv_iov_heap_after_end, tc)
8381ace24b3SKyle Evans {
8391ace24b3SKyle Evans #define BUF __stack.__buf
8401ace24b3SKyle Evans struct {
8411ace24b3SKyle Evans uint8_t padding_l;
8421ace24b3SKyle Evans unsigned char * __buf;
8431ace24b3SKyle Evans uint8_t padding_r;
8441ace24b3SKyle Evans } __stack;
8451ace24b3SKyle Evans const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
8461ace24b3SKyle Evans const size_t __len = 42 + 1;
8471ace24b3SKyle Evans const size_t __idx __unused = __len - 1;
8481ace24b3SKyle Evans pid_t __child;
8491ace24b3SKyle Evans int __status;
8501ace24b3SKyle Evans struct iovec iov[1];
8511ace24b3SKyle Evans
8521ace24b3SKyle Evans __child = fork();
8531ace24b3SKyle Evans ATF_REQUIRE(__child >= 0);
8541ace24b3SKyle Evans if (__child > 0)
8551ace24b3SKyle Evans goto monitor;
8561ace24b3SKyle Evans
8571ace24b3SKyle Evans /* Child */
8581ace24b3SKyle Evans disable_coredumps();
8591ace24b3SKyle Evans __stack.__buf = malloc(__bufsz);
8601ace24b3SKyle Evans iov[0].iov_base = __stack.__buf;
8611ace24b3SKyle Evans iov[0].iov_len = __len;
8621ace24b3SKyle Evans
8631ace24b3SKyle Evans replace_stdin();
8641ace24b3SKyle Evans
8651ace24b3SKyle Evans preadv(STDIN_FILENO, iov, nitems(iov), 0);
8661ace24b3SKyle Evans _exit(EX_SOFTWARE); /* Should have aborted. */
8671ace24b3SKyle Evans
8681ace24b3SKyle Evans monitor:
8691ace24b3SKyle Evans while (waitpid(__child, &__status, 0) != __child) {
8701ace24b3SKyle Evans ATF_REQUIRE_EQ(EINTR, errno);
8711ace24b3SKyle Evans }
8721ace24b3SKyle Evans
8731ace24b3SKyle Evans if (!WIFSIGNALED(__status)) {
8741ace24b3SKyle Evans switch (WEXITSTATUS(__status)) {
8751ace24b3SKyle Evans case EX_SOFTWARE:
8761ace24b3SKyle Evans atf_tc_fail("FORTIFY_SOURCE failed to abort");
8771ace24b3SKyle Evans break;
8781ace24b3SKyle Evans case EX_OSERR:
8791ace24b3SKyle Evans atf_tc_fail("setrlimit(2) failed");
8801ace24b3SKyle Evans break;
8811ace24b3SKyle Evans default:
8821ace24b3SKyle Evans atf_tc_fail("child exited with status %d",
8831ace24b3SKyle Evans WEXITSTATUS(__status));
8841ace24b3SKyle Evans }
8851ace24b3SKyle Evans } else {
8861ace24b3SKyle Evans ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
8871ace24b3SKyle Evans }
8881ace24b3SKyle Evans #undef BUF
8891ace24b3SKyle Evans
8901ace24b3SKyle Evans }
8911ace24b3SKyle Evans
ATF_TP_ADD_TCS(tp)8921ace24b3SKyle Evans ATF_TP_ADD_TCS(tp)
8931ace24b3SKyle Evans {
8941ace24b3SKyle Evans ATF_TP_ADD_TC(tp, readv_before_end);
8951ace24b3SKyle Evans ATF_TP_ADD_TC(tp, readv_end);
8961ace24b3SKyle Evans ATF_TP_ADD_TC(tp, readv_after_end);
8971ace24b3SKyle Evans ATF_TP_ADD_TC(tp, readv_heap_before_end);
8981ace24b3SKyle Evans ATF_TP_ADD_TC(tp, readv_heap_end);
8991ace24b3SKyle Evans ATF_TP_ADD_TC(tp, readv_heap_after_end);
9001ace24b3SKyle Evans ATF_TP_ADD_TC(tp, readv_iov_before_end);
9011ace24b3SKyle Evans ATF_TP_ADD_TC(tp, readv_iov_end);
9021ace24b3SKyle Evans ATF_TP_ADD_TC(tp, readv_iov_heap_before_end);
9031ace24b3SKyle Evans ATF_TP_ADD_TC(tp, readv_iov_heap_end);
9041ace24b3SKyle Evans ATF_TP_ADD_TC(tp, readv_iov_heap_after_end);
9051ace24b3SKyle Evans ATF_TP_ADD_TC(tp, preadv_before_end);
9061ace24b3SKyle Evans ATF_TP_ADD_TC(tp, preadv_end);
9071ace24b3SKyle Evans ATF_TP_ADD_TC(tp, preadv_after_end);
9081ace24b3SKyle Evans ATF_TP_ADD_TC(tp, preadv_heap_before_end);
9091ace24b3SKyle Evans ATF_TP_ADD_TC(tp, preadv_heap_end);
9101ace24b3SKyle Evans ATF_TP_ADD_TC(tp, preadv_heap_after_end);
9111ace24b3SKyle Evans ATF_TP_ADD_TC(tp, preadv_iov_before_end);
9121ace24b3SKyle Evans ATF_TP_ADD_TC(tp, preadv_iov_end);
9131ace24b3SKyle Evans ATF_TP_ADD_TC(tp, preadv_iov_heap_before_end);
9141ace24b3SKyle Evans ATF_TP_ADD_TC(tp, preadv_iov_heap_end);
9151ace24b3SKyle Evans ATF_TP_ADD_TC(tp, preadv_iov_heap_after_end);
9161ace24b3SKyle Evans return (atf_no_error());
9171ace24b3SKyle Evans }
918