xref: /freebsd/lib/libc/tests/secure/fortify_socket_test.c (revision 22178cb29f03a3b7bf919f3605e0cd5d6b18fa0a)
11f155d48SKyle Evans /* @generated by `generate-fortify-tests.lua "socket"` */
21f155d48SKyle Evans 
31f155d48SKyle Evans #define	_FORTIFY_SOURCE	2
41f155d48SKyle Evans #define	TMPFILE_SIZE	(1024 * 32)
51f155d48SKyle Evans 
61f155d48SKyle Evans #include <sys/param.h>
7*22178cb2SKyle Evans #include <sys/jail.h>
81f155d48SKyle Evans #include <sys/random.h>
91f155d48SKyle Evans #include <sys/resource.h>
101f155d48SKyle Evans #include <sys/select.h>
111f155d48SKyle Evans #include <sys/socket.h>
121f155d48SKyle Evans #include <sys/time.h>
131f155d48SKyle Evans #include <sys/uio.h>
141f155d48SKyle Evans #include <sys/wait.h>
151f155d48SKyle Evans #include <dirent.h>
161f155d48SKyle Evans #include <errno.h>
171f155d48SKyle Evans #include <fcntl.h>
181f155d48SKyle Evans #include <limits.h>
191f155d48SKyle Evans #include <poll.h>
201f155d48SKyle Evans #include <signal.h>
211f155d48SKyle Evans #include <stdio.h>
221f155d48SKyle Evans #include <stdlib.h>
231f155d48SKyle Evans #include <string.h>
241f155d48SKyle Evans #include <strings.h>
251f155d48SKyle Evans #include <sysexits.h>
261f155d48SKyle Evans #include <unistd.h>
271f155d48SKyle Evans #include <wchar.h>
281f155d48SKyle Evans #include <atf-c.h>
291f155d48SKyle Evans 
301f155d48SKyle Evans static FILE * __unused
new_fp(size_t __len)311f155d48SKyle Evans new_fp(size_t __len)
321f155d48SKyle Evans {
331f155d48SKyle Evans 	static char fpbuf[LINE_MAX];
341f155d48SKyle Evans 	FILE *fp;
351f155d48SKyle Evans 
361f155d48SKyle Evans 	ATF_REQUIRE(__len <= sizeof(fpbuf));
371f155d48SKyle Evans 
381f155d48SKyle Evans 	memset(fpbuf, 'A', sizeof(fpbuf) - 1);
391f155d48SKyle Evans 	fpbuf[sizeof(fpbuf) - 1] = '\0';
401f155d48SKyle Evans 
411f155d48SKyle Evans 	fp = fmemopen(fpbuf, sizeof(fpbuf), "rb");
421f155d48SKyle Evans 	ATF_REQUIRE(fp != NULL);
431f155d48SKyle Evans 
441f155d48SKyle Evans 	return (fp);
451f155d48SKyle Evans }
461f155d48SKyle Evans 
471f155d48SKyle Evans /*
481f155d48SKyle Evans  * Create a new symlink to use for readlink(2) style tests, we'll just use a
491f155d48SKyle Evans  * random target name to have something interesting to look at.
501f155d48SKyle Evans  */
511f155d48SKyle Evans static const char * __unused
new_symlink(size_t __len)521f155d48SKyle Evans new_symlink(size_t __len)
531f155d48SKyle Evans {
541f155d48SKyle Evans 	static const char linkname[] = "link";
551f155d48SKyle Evans 	char target[MAXNAMLEN];
561f155d48SKyle Evans 	int error;
571f155d48SKyle Evans 
581f155d48SKyle Evans 	ATF_REQUIRE(__len <= sizeof(target));
591f155d48SKyle Evans 
601f155d48SKyle Evans 	arc4random_buf(target, sizeof(target));
611f155d48SKyle Evans 
621f155d48SKyle Evans 	error = unlink(linkname);
631f155d48SKyle Evans 	ATF_REQUIRE(error == 0 || errno == ENOENT);
641f155d48SKyle Evans 
651f155d48SKyle Evans 	error = symlink(target, linkname);
661f155d48SKyle Evans 	ATF_REQUIRE(error == 0);
671f155d48SKyle Evans 
681f155d48SKyle Evans 	return (linkname);
691f155d48SKyle Evans }
701f155d48SKyle Evans 
711f155d48SKyle 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 /*
1161f155d48SKyle Evans  * Constructs a tmpfile that we can use for testing read(2) and friends.
1171f155d48SKyle Evans  */
1181f155d48SKyle Evans static int __unused
new_tmpfile(void)1191f155d48SKyle Evans new_tmpfile(void)
1201f155d48SKyle Evans {
1211f155d48SKyle Evans 	char buf[1024];
1221f155d48SKyle Evans 	ssize_t rv;
1231f155d48SKyle Evans 	size_t written;
1241f155d48SKyle Evans 	int fd;
1251f155d48SKyle Evans 
1261f155d48SKyle Evans 	fd = open("tmpfile", O_RDWR | O_CREAT | O_TRUNC, 0644);
1271f155d48SKyle Evans 	ATF_REQUIRE(fd >= 0);
1281f155d48SKyle Evans 
1291f155d48SKyle Evans 	written = 0;
1301f155d48SKyle Evans 	while (written < TMPFILE_SIZE) {
1311f155d48SKyle Evans 		rv = write(fd, buf, sizeof(buf));
1321f155d48SKyle Evans 		ATF_REQUIRE(rv > 0);
1331f155d48SKyle Evans 
1341f155d48SKyle Evans 		written += rv;
1351f155d48SKyle Evans 	}
1361f155d48SKyle Evans 
1371f155d48SKyle Evans 	ATF_REQUIRE_EQ(0, lseek(fd, 0, SEEK_SET));
1381f155d48SKyle Evans 	return (fd);
1391f155d48SKyle Evans }
1401f155d48SKyle Evans 
1411f155d48SKyle Evans static void
disable_coredumps(void)1421f155d48SKyle Evans disable_coredumps(void)
1431f155d48SKyle Evans {
1441f155d48SKyle Evans 	struct rlimit rl = { 0 };
1451f155d48SKyle Evans 
1461f155d48SKyle Evans 	if (setrlimit(RLIMIT_CORE, &rl) == -1)
1471f155d48SKyle Evans 		_exit(EX_OSERR);
1481f155d48SKyle Evans }
1491f155d48SKyle Evans 
1501f155d48SKyle Evans /*
1511f155d48SKyle Evans  * Replaces stdin with a file that we can actually read from, for tests where
1521f155d48SKyle Evans  * we want a FILE * or fd that we can get data from.
1531f155d48SKyle Evans  */
1541f155d48SKyle Evans static void __unused
replace_stdin(void)1551f155d48SKyle Evans replace_stdin(void)
1561f155d48SKyle Evans {
1571f155d48SKyle Evans 	int fd;
1581f155d48SKyle Evans 
1591f155d48SKyle Evans 	fd = new_tmpfile();
1601f155d48SKyle Evans 
1611f155d48SKyle Evans 	(void)dup2(fd, STDIN_FILENO);
1621f155d48SKyle Evans 	if (fd != STDIN_FILENO)
1631f155d48SKyle Evans 		close(fd);
1641f155d48SKyle Evans }
1651f155d48SKyle Evans 
16609cdbf04SKyle Evans ATF_TC(getpeername_before_end);
ATF_TC_HEAD(getpeername_before_end,tc)16709cdbf04SKyle Evans ATF_TC_HEAD(getpeername_before_end, tc)
16809cdbf04SKyle Evans {
16909cdbf04SKyle Evans }
ATF_TC_BODY(getpeername_before_end,tc)1701f155d48SKyle Evans ATF_TC_BODY(getpeername_before_end, tc)
1711f155d48SKyle Evans {
1721f155d48SKyle Evans #define BUF &__stack.__buf
1731f155d48SKyle Evans 	struct {
1741f155d48SKyle Evans 		uint8_t padding_l;
1751f155d48SKyle Evans 		struct sockaddr __buf;
1761f155d48SKyle Evans 		uint8_t padding_r;
1771f155d48SKyle Evans 	} __stack;
1781f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
1791f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr) - 1;
1801f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
1811f155d48SKyle Evans 	int sock[2] = { -1, -1 };
1821f155d48SKyle Evans 	socklen_t socklen;
1831f155d48SKyle Evans 	new_socket(sock);
1841f155d48SKyle Evans 	socklen = __len;
1851f155d48SKyle Evans 
1861f155d48SKyle Evans 	getpeername(sock[0], &__stack.__buf, &socklen);
1871f155d48SKyle Evans #undef BUF
1881f155d48SKyle Evans 
1891f155d48SKyle Evans }
1901f155d48SKyle Evans 
19109cdbf04SKyle Evans ATF_TC(getpeername_end);
ATF_TC_HEAD(getpeername_end,tc)19209cdbf04SKyle Evans ATF_TC_HEAD(getpeername_end, tc)
19309cdbf04SKyle Evans {
19409cdbf04SKyle Evans }
ATF_TC_BODY(getpeername_end,tc)1951f155d48SKyle Evans ATF_TC_BODY(getpeername_end, tc)
1961f155d48SKyle Evans {
1971f155d48SKyle Evans #define BUF &__stack.__buf
1981f155d48SKyle Evans 	struct {
1991f155d48SKyle Evans 		uint8_t padding_l;
2001f155d48SKyle Evans 		struct sockaddr __buf;
2011f155d48SKyle Evans 		uint8_t padding_r;
2021f155d48SKyle Evans 	} __stack;
2031f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
2041f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr);
2051f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
2061f155d48SKyle Evans 	int sock[2] = { -1, -1 };
2071f155d48SKyle Evans 	socklen_t socklen;
2081f155d48SKyle Evans 	new_socket(sock);
2091f155d48SKyle Evans 	socklen = __len;
2101f155d48SKyle Evans 
2111f155d48SKyle Evans 	getpeername(sock[0], &__stack.__buf, &socklen);
2121f155d48SKyle Evans #undef BUF
2131f155d48SKyle Evans 
2141f155d48SKyle Evans }
2151f155d48SKyle Evans 
21609cdbf04SKyle Evans ATF_TC(getpeername_heap_before_end);
ATF_TC_HEAD(getpeername_heap_before_end,tc)21709cdbf04SKyle Evans ATF_TC_HEAD(getpeername_heap_before_end, tc)
21809cdbf04SKyle Evans {
21909cdbf04SKyle Evans }
ATF_TC_BODY(getpeername_heap_before_end,tc)2201f155d48SKyle Evans ATF_TC_BODY(getpeername_heap_before_end, tc)
2211f155d48SKyle Evans {
2221f155d48SKyle Evans #define BUF __stack.__buf
2231f155d48SKyle Evans 	struct {
2241f155d48SKyle Evans 		uint8_t padding_l;
2251f155d48SKyle Evans 		struct sockaddr * __buf;
2261f155d48SKyle Evans 		uint8_t padding_r;
2271f155d48SKyle Evans 	} __stack;
2281f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);
2291f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr) - 1;
2301f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
2311f155d48SKyle Evans 	int sock[2] = { -1, -1 };
2321f155d48SKyle Evans 	socklen_t socklen;
2331f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
2341f155d48SKyle Evans 	new_socket(sock);
2351f155d48SKyle Evans 	socklen = __len;
2361f155d48SKyle Evans 
2371f155d48SKyle Evans 	getpeername(sock[0], __stack.__buf, &socklen);
2381f155d48SKyle Evans #undef BUF
2391f155d48SKyle Evans 
2401f155d48SKyle Evans }
2411f155d48SKyle Evans 
24209cdbf04SKyle Evans ATF_TC(getpeername_heap_end);
ATF_TC_HEAD(getpeername_heap_end,tc)24309cdbf04SKyle Evans ATF_TC_HEAD(getpeername_heap_end, tc)
24409cdbf04SKyle Evans {
24509cdbf04SKyle Evans }
ATF_TC_BODY(getpeername_heap_end,tc)2461f155d48SKyle Evans ATF_TC_BODY(getpeername_heap_end, tc)
2471f155d48SKyle Evans {
2481f155d48SKyle Evans #define BUF __stack.__buf
2491f155d48SKyle Evans 	struct {
2501f155d48SKyle Evans 		uint8_t padding_l;
2511f155d48SKyle Evans 		struct sockaddr * __buf;
2521f155d48SKyle Evans 		uint8_t padding_r;
2531f155d48SKyle Evans 	} __stack;
2541f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);
2551f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr);
2561f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
2571f155d48SKyle Evans 	int sock[2] = { -1, -1 };
2581f155d48SKyle Evans 	socklen_t socklen;
2591f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
2601f155d48SKyle Evans 	new_socket(sock);
2611f155d48SKyle Evans 	socklen = __len;
2621f155d48SKyle Evans 
2631f155d48SKyle Evans 	getpeername(sock[0], __stack.__buf, &socklen);
2641f155d48SKyle Evans #undef BUF
2651f155d48SKyle Evans 
2661f155d48SKyle Evans }
2671f155d48SKyle Evans 
26809cdbf04SKyle Evans ATF_TC(getpeername_heap_after_end);
ATF_TC_HEAD(getpeername_heap_after_end,tc)26909cdbf04SKyle Evans ATF_TC_HEAD(getpeername_heap_after_end, tc)
27009cdbf04SKyle Evans {
27109cdbf04SKyle Evans }
ATF_TC_BODY(getpeername_heap_after_end,tc)2721f155d48SKyle Evans ATF_TC_BODY(getpeername_heap_after_end, tc)
2731f155d48SKyle Evans {
2741f155d48SKyle Evans #define BUF __stack.__buf
2751f155d48SKyle Evans 	struct {
2761f155d48SKyle Evans 		uint8_t padding_l;
2771f155d48SKyle Evans 		struct sockaddr * __buf;
2781f155d48SKyle Evans 		uint8_t padding_r;
2791f155d48SKyle Evans 	} __stack;
2801f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);
2811f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr) + 1;
2821f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
2831f155d48SKyle Evans 	pid_t __child;
2841f155d48SKyle Evans 	int __status;
2851f155d48SKyle Evans 	int sock[2] = { -1, -1 };
2861f155d48SKyle Evans 	socklen_t socklen;
2871f155d48SKyle Evans 	__child = fork();
2881f155d48SKyle Evans 	ATF_REQUIRE(__child >= 0);
2891f155d48SKyle Evans 	if (__child > 0)
2901f155d48SKyle Evans 		goto monitor;
2911f155d48SKyle Evans 
2921f155d48SKyle Evans 	/* Child */
2931f155d48SKyle Evans 	disable_coredumps();
2941f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
2951f155d48SKyle Evans 	new_socket(sock);
2961f155d48SKyle Evans 	socklen = __len;
2971f155d48SKyle Evans 
2981f155d48SKyle Evans 	getpeername(sock[0], __stack.__buf, &socklen);
2991f155d48SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
3001f155d48SKyle Evans 
3011f155d48SKyle Evans monitor:
3021f155d48SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
3031f155d48SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
3041f155d48SKyle Evans 	}
3051f155d48SKyle Evans 
3061f155d48SKyle Evans 	if (!WIFSIGNALED(__status)) {
3071f155d48SKyle Evans 		switch (WEXITSTATUS(__status)) {
3081f155d48SKyle Evans 		case EX_SOFTWARE:
3091f155d48SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
3101f155d48SKyle Evans 			break;
3111f155d48SKyle Evans 		case EX_OSERR:
3121f155d48SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
3131f155d48SKyle Evans 			break;
3141f155d48SKyle Evans 		default:
3151f155d48SKyle Evans 			atf_tc_fail("child exited with status %d",
3161f155d48SKyle Evans 			    WEXITSTATUS(__status));
3171f155d48SKyle Evans 		}
3181f155d48SKyle Evans 	} else {
3191f155d48SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
3201f155d48SKyle Evans 	}
3211f155d48SKyle Evans #undef BUF
3221f155d48SKyle Evans 
3231f155d48SKyle Evans }
3241f155d48SKyle Evans 
32509cdbf04SKyle Evans ATF_TC(getsockname_before_end);
ATF_TC_HEAD(getsockname_before_end,tc)32609cdbf04SKyle Evans ATF_TC_HEAD(getsockname_before_end, tc)
32709cdbf04SKyle Evans {
32809cdbf04SKyle Evans }
ATF_TC_BODY(getsockname_before_end,tc)3291f155d48SKyle Evans ATF_TC_BODY(getsockname_before_end, tc)
3301f155d48SKyle Evans {
3311f155d48SKyle Evans #define BUF &__stack.__buf
3321f155d48SKyle Evans 	struct {
3331f155d48SKyle Evans 		uint8_t padding_l;
3341f155d48SKyle Evans 		struct sockaddr __buf;
3351f155d48SKyle Evans 		uint8_t padding_r;
3361f155d48SKyle Evans 	} __stack;
3371f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
3381f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr) - 1;
3391f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
3401f155d48SKyle Evans 	int sock[2] = { -1, -1 };
3411f155d48SKyle Evans 	socklen_t socklen;
3421f155d48SKyle Evans 	new_socket(sock);
3431f155d48SKyle Evans 	socklen = __len;
3441f155d48SKyle Evans 
3451f155d48SKyle Evans 	getsockname(sock[0], &__stack.__buf, &socklen);
3461f155d48SKyle Evans #undef BUF
3471f155d48SKyle Evans 
3481f155d48SKyle Evans }
3491f155d48SKyle Evans 
35009cdbf04SKyle Evans ATF_TC(getsockname_end);
ATF_TC_HEAD(getsockname_end,tc)35109cdbf04SKyle Evans ATF_TC_HEAD(getsockname_end, tc)
35209cdbf04SKyle Evans {
35309cdbf04SKyle Evans }
ATF_TC_BODY(getsockname_end,tc)3541f155d48SKyle Evans ATF_TC_BODY(getsockname_end, tc)
3551f155d48SKyle Evans {
3561f155d48SKyle Evans #define BUF &__stack.__buf
3571f155d48SKyle Evans 	struct {
3581f155d48SKyle Evans 		uint8_t padding_l;
3591f155d48SKyle Evans 		struct sockaddr __buf;
3601f155d48SKyle Evans 		uint8_t padding_r;
3611f155d48SKyle Evans 	} __stack;
3621f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
3631f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr);
3641f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
3651f155d48SKyle Evans 	int sock[2] = { -1, -1 };
3661f155d48SKyle Evans 	socklen_t socklen;
3671f155d48SKyle Evans 	new_socket(sock);
3681f155d48SKyle Evans 	socklen = __len;
3691f155d48SKyle Evans 
3701f155d48SKyle Evans 	getsockname(sock[0], &__stack.__buf, &socklen);
3711f155d48SKyle Evans #undef BUF
3721f155d48SKyle Evans 
3731f155d48SKyle Evans }
3741f155d48SKyle Evans 
37509cdbf04SKyle Evans ATF_TC(getsockname_heap_before_end);
ATF_TC_HEAD(getsockname_heap_before_end,tc)37609cdbf04SKyle Evans ATF_TC_HEAD(getsockname_heap_before_end, tc)
37709cdbf04SKyle Evans {
37809cdbf04SKyle Evans }
ATF_TC_BODY(getsockname_heap_before_end,tc)3791f155d48SKyle Evans ATF_TC_BODY(getsockname_heap_before_end, tc)
3801f155d48SKyle Evans {
3811f155d48SKyle Evans #define BUF __stack.__buf
3821f155d48SKyle Evans 	struct {
3831f155d48SKyle Evans 		uint8_t padding_l;
3841f155d48SKyle Evans 		struct sockaddr * __buf;
3851f155d48SKyle Evans 		uint8_t padding_r;
3861f155d48SKyle Evans 	} __stack;
3871f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);
3881f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr) - 1;
3891f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
3901f155d48SKyle Evans 	int sock[2] = { -1, -1 };
3911f155d48SKyle Evans 	socklen_t socklen;
3921f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
3931f155d48SKyle Evans 	new_socket(sock);
3941f155d48SKyle Evans 	socklen = __len;
3951f155d48SKyle Evans 
3961f155d48SKyle Evans 	getsockname(sock[0], __stack.__buf, &socklen);
3971f155d48SKyle Evans #undef BUF
3981f155d48SKyle Evans 
3991f155d48SKyle Evans }
4001f155d48SKyle Evans 
40109cdbf04SKyle Evans ATF_TC(getsockname_heap_end);
ATF_TC_HEAD(getsockname_heap_end,tc)40209cdbf04SKyle Evans ATF_TC_HEAD(getsockname_heap_end, tc)
40309cdbf04SKyle Evans {
40409cdbf04SKyle Evans }
ATF_TC_BODY(getsockname_heap_end,tc)4051f155d48SKyle Evans ATF_TC_BODY(getsockname_heap_end, tc)
4061f155d48SKyle Evans {
4071f155d48SKyle Evans #define BUF __stack.__buf
4081f155d48SKyle Evans 	struct {
4091f155d48SKyle Evans 		uint8_t padding_l;
4101f155d48SKyle Evans 		struct sockaddr * __buf;
4111f155d48SKyle Evans 		uint8_t padding_r;
4121f155d48SKyle Evans 	} __stack;
4131f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);
4141f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr);
4151f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
4161f155d48SKyle Evans 	int sock[2] = { -1, -1 };
4171f155d48SKyle Evans 	socklen_t socklen;
4181f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
4191f155d48SKyle Evans 	new_socket(sock);
4201f155d48SKyle Evans 	socklen = __len;
4211f155d48SKyle Evans 
4221f155d48SKyle Evans 	getsockname(sock[0], __stack.__buf, &socklen);
4231f155d48SKyle Evans #undef BUF
4241f155d48SKyle Evans 
4251f155d48SKyle Evans }
4261f155d48SKyle Evans 
42709cdbf04SKyle Evans ATF_TC(getsockname_heap_after_end);
ATF_TC_HEAD(getsockname_heap_after_end,tc)42809cdbf04SKyle Evans ATF_TC_HEAD(getsockname_heap_after_end, tc)
42909cdbf04SKyle Evans {
43009cdbf04SKyle Evans }
ATF_TC_BODY(getsockname_heap_after_end,tc)4311f155d48SKyle Evans ATF_TC_BODY(getsockname_heap_after_end, tc)
4321f155d48SKyle Evans {
4331f155d48SKyle Evans #define BUF __stack.__buf
4341f155d48SKyle Evans 	struct {
4351f155d48SKyle Evans 		uint8_t padding_l;
4361f155d48SKyle Evans 		struct sockaddr * __buf;
4371f155d48SKyle Evans 		uint8_t padding_r;
4381f155d48SKyle Evans 	} __stack;
4391f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);
4401f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr) + 1;
4411f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
4421f155d48SKyle Evans 	pid_t __child;
4431f155d48SKyle Evans 	int __status;
4441f155d48SKyle Evans 	int sock[2] = { -1, -1 };
4451f155d48SKyle Evans 	socklen_t socklen;
4461f155d48SKyle Evans 	__child = fork();
4471f155d48SKyle Evans 	ATF_REQUIRE(__child >= 0);
4481f155d48SKyle Evans 	if (__child > 0)
4491f155d48SKyle Evans 		goto monitor;
4501f155d48SKyle Evans 
4511f155d48SKyle Evans 	/* Child */
4521f155d48SKyle Evans 	disable_coredumps();
4531f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
4541f155d48SKyle Evans 	new_socket(sock);
4551f155d48SKyle Evans 	socklen = __len;
4561f155d48SKyle Evans 
4571f155d48SKyle Evans 	getsockname(sock[0], __stack.__buf, &socklen);
4581f155d48SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
4591f155d48SKyle Evans 
4601f155d48SKyle Evans monitor:
4611f155d48SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
4621f155d48SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
4631f155d48SKyle Evans 	}
4641f155d48SKyle Evans 
4651f155d48SKyle Evans 	if (!WIFSIGNALED(__status)) {
4661f155d48SKyle Evans 		switch (WEXITSTATUS(__status)) {
4671f155d48SKyle Evans 		case EX_SOFTWARE:
4681f155d48SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
4691f155d48SKyle Evans 			break;
4701f155d48SKyle Evans 		case EX_OSERR:
4711f155d48SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
4721f155d48SKyle Evans 			break;
4731f155d48SKyle Evans 		default:
4741f155d48SKyle Evans 			atf_tc_fail("child exited with status %d",
4751f155d48SKyle Evans 			    WEXITSTATUS(__status));
4761f155d48SKyle Evans 		}
4771f155d48SKyle Evans 	} else {
4781f155d48SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
4791f155d48SKyle Evans 	}
4801f155d48SKyle Evans #undef BUF
4811f155d48SKyle Evans 
4821f155d48SKyle Evans }
4831f155d48SKyle Evans 
48409cdbf04SKyle Evans ATF_TC(recv_before_end);
ATF_TC_HEAD(recv_before_end,tc)48509cdbf04SKyle Evans ATF_TC_HEAD(recv_before_end, tc)
48609cdbf04SKyle Evans {
48709cdbf04SKyle Evans }
ATF_TC_BODY(recv_before_end,tc)4881f155d48SKyle Evans ATF_TC_BODY(recv_before_end, tc)
4891f155d48SKyle Evans {
4901f155d48SKyle Evans #define BUF &__stack.__buf
4911f155d48SKyle Evans 	struct {
4921f155d48SKyle Evans 		uint8_t padding_l;
4931f155d48SKyle Evans 		unsigned char __buf[42];
4941f155d48SKyle Evans 		uint8_t padding_r;
4951f155d48SKyle Evans 	} __stack;
4961f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
4971f155d48SKyle Evans 	const size_t __len = 42 - 1;
4981f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
4991f155d48SKyle Evans 	int sock[2] = { -1, -1 };
5001f155d48SKyle Evans 
5011f155d48SKyle Evans 	new_socket(sock);
5021f155d48SKyle Evans 
5031f155d48SKyle Evans 	recv(sock[0], __stack.__buf, __len, 0);
5041f155d48SKyle Evans #undef BUF
5051f155d48SKyle Evans 
5061f155d48SKyle Evans }
5071f155d48SKyle Evans 
50809cdbf04SKyle Evans ATF_TC(recv_end);
ATF_TC_HEAD(recv_end,tc)50909cdbf04SKyle Evans ATF_TC_HEAD(recv_end, tc)
51009cdbf04SKyle Evans {
51109cdbf04SKyle Evans }
ATF_TC_BODY(recv_end,tc)5121f155d48SKyle Evans ATF_TC_BODY(recv_end, tc)
5131f155d48SKyle Evans {
5141f155d48SKyle Evans #define BUF &__stack.__buf
5151f155d48SKyle Evans 	struct {
5161f155d48SKyle Evans 		uint8_t padding_l;
5171f155d48SKyle Evans 		unsigned char __buf[42];
5181f155d48SKyle Evans 		uint8_t padding_r;
5191f155d48SKyle Evans 	} __stack;
5201f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
5211f155d48SKyle Evans 	const size_t __len = 42;
5221f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
5231f155d48SKyle Evans 	int sock[2] = { -1, -1 };
5241f155d48SKyle Evans 
5251f155d48SKyle Evans 	new_socket(sock);
5261f155d48SKyle Evans 
5271f155d48SKyle Evans 	recv(sock[0], __stack.__buf, __len, 0);
5281f155d48SKyle Evans #undef BUF
5291f155d48SKyle Evans 
5301f155d48SKyle Evans }
5311f155d48SKyle Evans 
53209cdbf04SKyle Evans ATF_TC(recv_heap_before_end);
ATF_TC_HEAD(recv_heap_before_end,tc)53309cdbf04SKyle Evans ATF_TC_HEAD(recv_heap_before_end, tc)
53409cdbf04SKyle Evans {
53509cdbf04SKyle Evans }
ATF_TC_BODY(recv_heap_before_end,tc)5361f155d48SKyle Evans ATF_TC_BODY(recv_heap_before_end, tc)
5371f155d48SKyle Evans {
5381f155d48SKyle Evans #define BUF __stack.__buf
5391f155d48SKyle Evans 	struct {
5401f155d48SKyle Evans 		uint8_t padding_l;
5411f155d48SKyle Evans 		unsigned char * __buf;
5421f155d48SKyle Evans 		uint8_t padding_r;
5431f155d48SKyle Evans 	} __stack;
5441f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
5451f155d48SKyle Evans 	const size_t __len = 42 - 1;
5461f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
5471f155d48SKyle Evans 	int sock[2] = { -1, -1 };
5481f155d48SKyle Evans 
5491f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
5501f155d48SKyle Evans 	new_socket(sock);
5511f155d48SKyle Evans 
5521f155d48SKyle Evans 	recv(sock[0], __stack.__buf, __len, 0);
5531f155d48SKyle Evans #undef BUF
5541f155d48SKyle Evans 
5551f155d48SKyle Evans }
5561f155d48SKyle Evans 
55709cdbf04SKyle Evans ATF_TC(recv_heap_end);
ATF_TC_HEAD(recv_heap_end,tc)55809cdbf04SKyle Evans ATF_TC_HEAD(recv_heap_end, tc)
55909cdbf04SKyle Evans {
56009cdbf04SKyle Evans }
ATF_TC_BODY(recv_heap_end,tc)5611f155d48SKyle Evans ATF_TC_BODY(recv_heap_end, tc)
5621f155d48SKyle Evans {
5631f155d48SKyle Evans #define BUF __stack.__buf
5641f155d48SKyle Evans 	struct {
5651f155d48SKyle Evans 		uint8_t padding_l;
5661f155d48SKyle Evans 		unsigned char * __buf;
5671f155d48SKyle Evans 		uint8_t padding_r;
5681f155d48SKyle Evans 	} __stack;
5691f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
5701f155d48SKyle Evans 	const size_t __len = 42;
5711f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
5721f155d48SKyle Evans 	int sock[2] = { -1, -1 };
5731f155d48SKyle Evans 
5741f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
5751f155d48SKyle Evans 	new_socket(sock);
5761f155d48SKyle Evans 
5771f155d48SKyle Evans 	recv(sock[0], __stack.__buf, __len, 0);
5781f155d48SKyle Evans #undef BUF
5791f155d48SKyle Evans 
5801f155d48SKyle Evans }
5811f155d48SKyle Evans 
58209cdbf04SKyle Evans ATF_TC(recv_heap_after_end);
ATF_TC_HEAD(recv_heap_after_end,tc)58309cdbf04SKyle Evans ATF_TC_HEAD(recv_heap_after_end, tc)
58409cdbf04SKyle Evans {
58509cdbf04SKyle Evans }
ATF_TC_BODY(recv_heap_after_end,tc)5861f155d48SKyle Evans ATF_TC_BODY(recv_heap_after_end, tc)
5871f155d48SKyle Evans {
5881f155d48SKyle Evans #define BUF __stack.__buf
5891f155d48SKyle Evans 	struct {
5901f155d48SKyle Evans 		uint8_t padding_l;
5911f155d48SKyle Evans 		unsigned char * __buf;
5921f155d48SKyle Evans 		uint8_t padding_r;
5931f155d48SKyle Evans 	} __stack;
5941f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
5951f155d48SKyle Evans 	const size_t __len = 42 + 1;
5961f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
5971f155d48SKyle Evans 	pid_t __child;
5981f155d48SKyle Evans 	int __status;
5991f155d48SKyle Evans 	int sock[2] = { -1, -1 };
6001f155d48SKyle Evans 
6011f155d48SKyle Evans 	__child = fork();
6021f155d48SKyle Evans 	ATF_REQUIRE(__child >= 0);
6031f155d48SKyle Evans 	if (__child > 0)
6041f155d48SKyle Evans 		goto monitor;
6051f155d48SKyle Evans 
6061f155d48SKyle Evans 	/* Child */
6071f155d48SKyle Evans 	disable_coredumps();
6081f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
6091f155d48SKyle Evans 	new_socket(sock);
6101f155d48SKyle Evans 
6111f155d48SKyle Evans 	recv(sock[0], __stack.__buf, __len, 0);
6121f155d48SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
6131f155d48SKyle Evans 
6141f155d48SKyle Evans monitor:
6151f155d48SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
6161f155d48SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
6171f155d48SKyle Evans 	}
6181f155d48SKyle Evans 
6191f155d48SKyle Evans 	if (!WIFSIGNALED(__status)) {
6201f155d48SKyle Evans 		switch (WEXITSTATUS(__status)) {
6211f155d48SKyle Evans 		case EX_SOFTWARE:
6221f155d48SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
6231f155d48SKyle Evans 			break;
6241f155d48SKyle Evans 		case EX_OSERR:
6251f155d48SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
6261f155d48SKyle Evans 			break;
6271f155d48SKyle Evans 		default:
6281f155d48SKyle Evans 			atf_tc_fail("child exited with status %d",
6291f155d48SKyle Evans 			    WEXITSTATUS(__status));
6301f155d48SKyle Evans 		}
6311f155d48SKyle Evans 	} else {
6321f155d48SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
6331f155d48SKyle Evans 	}
6341f155d48SKyle Evans #undef BUF
6351f155d48SKyle Evans 
6361f155d48SKyle Evans }
6371f155d48SKyle Evans 
63809cdbf04SKyle Evans ATF_TC(recvfrom_before_end);
ATF_TC_HEAD(recvfrom_before_end,tc)63909cdbf04SKyle Evans ATF_TC_HEAD(recvfrom_before_end, tc)
64009cdbf04SKyle Evans {
64109cdbf04SKyle Evans }
ATF_TC_BODY(recvfrom_before_end,tc)6421f155d48SKyle Evans ATF_TC_BODY(recvfrom_before_end, tc)
6431f155d48SKyle Evans {
6441f155d48SKyle Evans #define BUF &__stack.__buf
6451f155d48SKyle Evans 	struct {
6461f155d48SKyle Evans 		uint8_t padding_l;
6471f155d48SKyle Evans 		unsigned char __buf[42];
6481f155d48SKyle Evans 		uint8_t padding_r;
6491f155d48SKyle Evans 	} __stack;
6501f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
6511f155d48SKyle Evans 	const size_t __len = 42 - 1;
6521f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
6531f155d48SKyle Evans 	int sock[2] = { -1, -1 };
6541f155d48SKyle Evans 
6551f155d48SKyle Evans 	new_socket(sock);
6561f155d48SKyle Evans 
6571f155d48SKyle Evans 	recvfrom(sock[0], __stack.__buf, __len, 0, NULL, NULL);
6581f155d48SKyle Evans #undef BUF
6591f155d48SKyle Evans 
6601f155d48SKyle Evans }
6611f155d48SKyle Evans 
66209cdbf04SKyle Evans ATF_TC(recvfrom_end);
ATF_TC_HEAD(recvfrom_end,tc)66309cdbf04SKyle Evans ATF_TC_HEAD(recvfrom_end, tc)
66409cdbf04SKyle Evans {
66509cdbf04SKyle Evans }
ATF_TC_BODY(recvfrom_end,tc)6661f155d48SKyle Evans ATF_TC_BODY(recvfrom_end, tc)
6671f155d48SKyle Evans {
6681f155d48SKyle Evans #define BUF &__stack.__buf
6691f155d48SKyle Evans 	struct {
6701f155d48SKyle Evans 		uint8_t padding_l;
6711f155d48SKyle Evans 		unsigned char __buf[42];
6721f155d48SKyle Evans 		uint8_t padding_r;
6731f155d48SKyle Evans 	} __stack;
6741f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
6751f155d48SKyle Evans 	const size_t __len = 42;
6761f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
6771f155d48SKyle Evans 	int sock[2] = { -1, -1 };
6781f155d48SKyle Evans 
6791f155d48SKyle Evans 	new_socket(sock);
6801f155d48SKyle Evans 
6811f155d48SKyle Evans 	recvfrom(sock[0], __stack.__buf, __len, 0, NULL, NULL);
6821f155d48SKyle Evans #undef BUF
6831f155d48SKyle Evans 
6841f155d48SKyle Evans }
6851f155d48SKyle Evans 
68609cdbf04SKyle Evans ATF_TC(recvfrom_heap_before_end);
ATF_TC_HEAD(recvfrom_heap_before_end,tc)68709cdbf04SKyle Evans ATF_TC_HEAD(recvfrom_heap_before_end, tc)
68809cdbf04SKyle Evans {
68909cdbf04SKyle Evans }
ATF_TC_BODY(recvfrom_heap_before_end,tc)6901f155d48SKyle Evans ATF_TC_BODY(recvfrom_heap_before_end, tc)
6911f155d48SKyle Evans {
6921f155d48SKyle Evans #define BUF __stack.__buf
6931f155d48SKyle Evans 	struct {
6941f155d48SKyle Evans 		uint8_t padding_l;
6951f155d48SKyle Evans 		unsigned char * __buf;
6961f155d48SKyle Evans 		uint8_t padding_r;
6971f155d48SKyle Evans 	} __stack;
6981f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
6991f155d48SKyle Evans 	const size_t __len = 42 - 1;
7001f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
7011f155d48SKyle Evans 	int sock[2] = { -1, -1 };
7021f155d48SKyle Evans 
7031f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
7041f155d48SKyle Evans 	new_socket(sock);
7051f155d48SKyle Evans 
7061f155d48SKyle Evans 	recvfrom(sock[0], __stack.__buf, __len, 0, NULL, NULL);
7071f155d48SKyle Evans #undef BUF
7081f155d48SKyle Evans 
7091f155d48SKyle Evans }
7101f155d48SKyle Evans 
71109cdbf04SKyle Evans ATF_TC(recvfrom_heap_end);
ATF_TC_HEAD(recvfrom_heap_end,tc)71209cdbf04SKyle Evans ATF_TC_HEAD(recvfrom_heap_end, tc)
71309cdbf04SKyle Evans {
71409cdbf04SKyle Evans }
ATF_TC_BODY(recvfrom_heap_end,tc)7151f155d48SKyle Evans ATF_TC_BODY(recvfrom_heap_end, tc)
7161f155d48SKyle Evans {
7171f155d48SKyle Evans #define BUF __stack.__buf
7181f155d48SKyle Evans 	struct {
7191f155d48SKyle Evans 		uint8_t padding_l;
7201f155d48SKyle Evans 		unsigned char * __buf;
7211f155d48SKyle Evans 		uint8_t padding_r;
7221f155d48SKyle Evans 	} __stack;
7231f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
7241f155d48SKyle Evans 	const size_t __len = 42;
7251f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
7261f155d48SKyle Evans 	int sock[2] = { -1, -1 };
7271f155d48SKyle Evans 
7281f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
7291f155d48SKyle Evans 	new_socket(sock);
7301f155d48SKyle Evans 
7311f155d48SKyle Evans 	recvfrom(sock[0], __stack.__buf, __len, 0, NULL, NULL);
7321f155d48SKyle Evans #undef BUF
7331f155d48SKyle Evans 
7341f155d48SKyle Evans }
7351f155d48SKyle Evans 
73609cdbf04SKyle Evans ATF_TC(recvfrom_heap_after_end);
ATF_TC_HEAD(recvfrom_heap_after_end,tc)73709cdbf04SKyle Evans ATF_TC_HEAD(recvfrom_heap_after_end, tc)
73809cdbf04SKyle Evans {
73909cdbf04SKyle Evans }
ATF_TC_BODY(recvfrom_heap_after_end,tc)7401f155d48SKyle Evans ATF_TC_BODY(recvfrom_heap_after_end, tc)
7411f155d48SKyle Evans {
7421f155d48SKyle Evans #define BUF __stack.__buf
7431f155d48SKyle Evans 	struct {
7441f155d48SKyle Evans 		uint8_t padding_l;
7451f155d48SKyle Evans 		unsigned char * __buf;
7461f155d48SKyle Evans 		uint8_t padding_r;
7471f155d48SKyle Evans 	} __stack;
7481f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
7491f155d48SKyle Evans 	const size_t __len = 42 + 1;
7501f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
7511f155d48SKyle Evans 	pid_t __child;
7521f155d48SKyle Evans 	int __status;
7531f155d48SKyle Evans 	int sock[2] = { -1, -1 };
7541f155d48SKyle Evans 
7551f155d48SKyle Evans 	__child = fork();
7561f155d48SKyle Evans 	ATF_REQUIRE(__child >= 0);
7571f155d48SKyle Evans 	if (__child > 0)
7581f155d48SKyle Evans 		goto monitor;
7591f155d48SKyle Evans 
7601f155d48SKyle Evans 	/* Child */
7611f155d48SKyle Evans 	disable_coredumps();
7621f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
7631f155d48SKyle Evans 	new_socket(sock);
7641f155d48SKyle Evans 
7651f155d48SKyle Evans 	recvfrom(sock[0], __stack.__buf, __len, 0, NULL, NULL);
7661f155d48SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
7671f155d48SKyle Evans 
7681f155d48SKyle Evans monitor:
7691f155d48SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
7701f155d48SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
7711f155d48SKyle Evans 	}
7721f155d48SKyle Evans 
7731f155d48SKyle Evans 	if (!WIFSIGNALED(__status)) {
7741f155d48SKyle Evans 		switch (WEXITSTATUS(__status)) {
7751f155d48SKyle Evans 		case EX_SOFTWARE:
7761f155d48SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
7771f155d48SKyle Evans 			break;
7781f155d48SKyle Evans 		case EX_OSERR:
7791f155d48SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
7801f155d48SKyle Evans 			break;
7811f155d48SKyle Evans 		default:
7821f155d48SKyle Evans 			atf_tc_fail("child exited with status %d",
7831f155d48SKyle Evans 			    WEXITSTATUS(__status));
7841f155d48SKyle Evans 		}
7851f155d48SKyle Evans 	} else {
7861f155d48SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
7871f155d48SKyle Evans 	}
7881f155d48SKyle Evans #undef BUF
7891f155d48SKyle Evans 
7901f155d48SKyle Evans }
7911f155d48SKyle Evans 
79209cdbf04SKyle Evans ATF_TC(recvfrom_sockaddr_before_end);
ATF_TC_HEAD(recvfrom_sockaddr_before_end,tc)79309cdbf04SKyle Evans ATF_TC_HEAD(recvfrom_sockaddr_before_end, tc)
79409cdbf04SKyle Evans {
79509cdbf04SKyle Evans }
ATF_TC_BODY(recvfrom_sockaddr_before_end,tc)7961f155d48SKyle Evans ATF_TC_BODY(recvfrom_sockaddr_before_end, tc)
7971f155d48SKyle Evans {
7981f155d48SKyle Evans #define BUF &__stack.__buf
7991f155d48SKyle Evans 	struct {
8001f155d48SKyle Evans 		uint8_t padding_l;
8011f155d48SKyle Evans 		struct sockaddr __buf;
8021f155d48SKyle Evans 		uint8_t padding_r;
8031f155d48SKyle Evans 	} __stack;
8041f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
8051f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr) - 1;
8061f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
8071f155d48SKyle Evans 	int sock[2] = { -1, -1 };
8081f155d48SKyle Evans 	char data[16];
8091f155d48SKyle Evans 	socklen_t socklen;
8101f155d48SKyle Evans 
8111f155d48SKyle Evans 	new_socket(sock);
8121f155d48SKyle Evans 	socklen = __len;
8131f155d48SKyle Evans 
8141f155d48SKyle Evans 	recvfrom(sock[0], data, sizeof(data), 0, &__stack.__buf, &socklen);
8151f155d48SKyle Evans #undef BUF
8161f155d48SKyle Evans 
8171f155d48SKyle Evans }
8181f155d48SKyle Evans 
81909cdbf04SKyle Evans ATF_TC(recvfrom_sockaddr_end);
ATF_TC_HEAD(recvfrom_sockaddr_end,tc)82009cdbf04SKyle Evans ATF_TC_HEAD(recvfrom_sockaddr_end, tc)
82109cdbf04SKyle Evans {
82209cdbf04SKyle Evans }
ATF_TC_BODY(recvfrom_sockaddr_end,tc)8231f155d48SKyle Evans ATF_TC_BODY(recvfrom_sockaddr_end, tc)
8241f155d48SKyle Evans {
8251f155d48SKyle Evans #define BUF &__stack.__buf
8261f155d48SKyle Evans 	struct {
8271f155d48SKyle Evans 		uint8_t padding_l;
8281f155d48SKyle Evans 		struct sockaddr __buf;
8291f155d48SKyle Evans 		uint8_t padding_r;
8301f155d48SKyle Evans 	} __stack;
8311f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
8321f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr);
8331f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
8341f155d48SKyle Evans 	int sock[2] = { -1, -1 };
8351f155d48SKyle Evans 	char data[16];
8361f155d48SKyle Evans 	socklen_t socklen;
8371f155d48SKyle Evans 
8381f155d48SKyle Evans 	new_socket(sock);
8391f155d48SKyle Evans 	socklen = __len;
8401f155d48SKyle Evans 
8411f155d48SKyle Evans 	recvfrom(sock[0], data, sizeof(data), 0, &__stack.__buf, &socklen);
8421f155d48SKyle Evans #undef BUF
8431f155d48SKyle Evans 
8441f155d48SKyle Evans }
8451f155d48SKyle Evans 
84609cdbf04SKyle Evans ATF_TC(recvfrom_sockaddr_heap_before_end);
ATF_TC_HEAD(recvfrom_sockaddr_heap_before_end,tc)84709cdbf04SKyle Evans ATF_TC_HEAD(recvfrom_sockaddr_heap_before_end, tc)
84809cdbf04SKyle Evans {
84909cdbf04SKyle Evans }
ATF_TC_BODY(recvfrom_sockaddr_heap_before_end,tc)8501f155d48SKyle Evans ATF_TC_BODY(recvfrom_sockaddr_heap_before_end, tc)
8511f155d48SKyle Evans {
8521f155d48SKyle Evans #define BUF __stack.__buf
8531f155d48SKyle Evans 	struct {
8541f155d48SKyle Evans 		uint8_t padding_l;
8551f155d48SKyle Evans 		struct sockaddr * __buf;
8561f155d48SKyle Evans 		uint8_t padding_r;
8571f155d48SKyle Evans 	} __stack;
8581f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);
8591f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr) - 1;
8601f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
8611f155d48SKyle Evans 	int sock[2] = { -1, -1 };
8621f155d48SKyle Evans 	char data[16];
8631f155d48SKyle Evans 	socklen_t socklen;
8641f155d48SKyle Evans 
8651f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
8661f155d48SKyle Evans 	new_socket(sock);
8671f155d48SKyle Evans 	socklen = __len;
8681f155d48SKyle Evans 
8691f155d48SKyle Evans 	recvfrom(sock[0], data, sizeof(data), 0, __stack.__buf, &socklen);
8701f155d48SKyle Evans #undef BUF
8711f155d48SKyle Evans 
8721f155d48SKyle Evans }
8731f155d48SKyle Evans 
87409cdbf04SKyle Evans ATF_TC(recvfrom_sockaddr_heap_end);
ATF_TC_HEAD(recvfrom_sockaddr_heap_end,tc)87509cdbf04SKyle Evans ATF_TC_HEAD(recvfrom_sockaddr_heap_end, tc)
87609cdbf04SKyle Evans {
87709cdbf04SKyle Evans }
ATF_TC_BODY(recvfrom_sockaddr_heap_end,tc)8781f155d48SKyle Evans ATF_TC_BODY(recvfrom_sockaddr_heap_end, tc)
8791f155d48SKyle Evans {
8801f155d48SKyle Evans #define BUF __stack.__buf
8811f155d48SKyle Evans 	struct {
8821f155d48SKyle Evans 		uint8_t padding_l;
8831f155d48SKyle Evans 		struct sockaddr * __buf;
8841f155d48SKyle Evans 		uint8_t padding_r;
8851f155d48SKyle Evans 	} __stack;
8861f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);
8871f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr);
8881f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
8891f155d48SKyle Evans 	int sock[2] = { -1, -1 };
8901f155d48SKyle Evans 	char data[16];
8911f155d48SKyle Evans 	socklen_t socklen;
8921f155d48SKyle Evans 
8931f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
8941f155d48SKyle Evans 	new_socket(sock);
8951f155d48SKyle Evans 	socklen = __len;
8961f155d48SKyle Evans 
8971f155d48SKyle Evans 	recvfrom(sock[0], data, sizeof(data), 0, __stack.__buf, &socklen);
8981f155d48SKyle Evans #undef BUF
8991f155d48SKyle Evans 
9001f155d48SKyle Evans }
9011f155d48SKyle Evans 
90209cdbf04SKyle Evans ATF_TC(recvfrom_sockaddr_heap_after_end);
ATF_TC_HEAD(recvfrom_sockaddr_heap_after_end,tc)90309cdbf04SKyle Evans ATF_TC_HEAD(recvfrom_sockaddr_heap_after_end, tc)
90409cdbf04SKyle Evans {
90509cdbf04SKyle Evans }
ATF_TC_BODY(recvfrom_sockaddr_heap_after_end,tc)9061f155d48SKyle Evans ATF_TC_BODY(recvfrom_sockaddr_heap_after_end, tc)
9071f155d48SKyle Evans {
9081f155d48SKyle Evans #define BUF __stack.__buf
9091f155d48SKyle Evans 	struct {
9101f155d48SKyle Evans 		uint8_t padding_l;
9111f155d48SKyle Evans 		struct sockaddr * __buf;
9121f155d48SKyle Evans 		uint8_t padding_r;
9131f155d48SKyle Evans 	} __stack;
9141f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);
9151f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr) + 1;
9161f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
9171f155d48SKyle Evans 	pid_t __child;
9181f155d48SKyle Evans 	int __status;
9191f155d48SKyle Evans 	int sock[2] = { -1, -1 };
9201f155d48SKyle Evans 	char data[16];
9211f155d48SKyle Evans 	socklen_t socklen;
9221f155d48SKyle Evans 
9231f155d48SKyle Evans 	__child = fork();
9241f155d48SKyle Evans 	ATF_REQUIRE(__child >= 0);
9251f155d48SKyle Evans 	if (__child > 0)
9261f155d48SKyle Evans 		goto monitor;
9271f155d48SKyle Evans 
9281f155d48SKyle Evans 	/* Child */
9291f155d48SKyle Evans 	disable_coredumps();
9301f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
9311f155d48SKyle Evans 	new_socket(sock);
9321f155d48SKyle Evans 	socklen = __len;
9331f155d48SKyle Evans 
9341f155d48SKyle Evans 	recvfrom(sock[0], data, sizeof(data), 0, __stack.__buf, &socklen);
9351f155d48SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
9361f155d48SKyle Evans 
9371f155d48SKyle Evans monitor:
9381f155d48SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
9391f155d48SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
9401f155d48SKyle Evans 	}
9411f155d48SKyle Evans 
9421f155d48SKyle Evans 	if (!WIFSIGNALED(__status)) {
9431f155d48SKyle Evans 		switch (WEXITSTATUS(__status)) {
9441f155d48SKyle Evans 		case EX_SOFTWARE:
9451f155d48SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
9461f155d48SKyle Evans 			break;
9471f155d48SKyle Evans 		case EX_OSERR:
9481f155d48SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
9491f155d48SKyle Evans 			break;
9501f155d48SKyle Evans 		default:
9511f155d48SKyle Evans 			atf_tc_fail("child exited with status %d",
9521f155d48SKyle Evans 			    WEXITSTATUS(__status));
9531f155d48SKyle Evans 		}
9541f155d48SKyle Evans 	} else {
9551f155d48SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
9561f155d48SKyle Evans 	}
9571f155d48SKyle Evans #undef BUF
9581f155d48SKyle Evans 
9591f155d48SKyle Evans }
9601f155d48SKyle Evans 
96109cdbf04SKyle Evans ATF_TC(recvmsg_msg_name_before_end);
ATF_TC_HEAD(recvmsg_msg_name_before_end,tc)96209cdbf04SKyle Evans ATF_TC_HEAD(recvmsg_msg_name_before_end, tc)
96309cdbf04SKyle Evans {
96409cdbf04SKyle Evans }
ATF_TC_BODY(recvmsg_msg_name_before_end,tc)9651f155d48SKyle Evans ATF_TC_BODY(recvmsg_msg_name_before_end, tc)
9661f155d48SKyle Evans {
9671f155d48SKyle Evans #define BUF &__stack.__buf
9681f155d48SKyle Evans 	struct {
9691f155d48SKyle Evans 		uint8_t padding_l;
9701f155d48SKyle Evans 		struct sockaddr __buf;
9711f155d48SKyle Evans 		uint8_t padding_r;
9721f155d48SKyle Evans 	} __stack;
9731f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
9741f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr) - 1;
9751f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
9761f155d48SKyle Evans 	int sock[2] = { -1, -1 };
9771f155d48SKyle Evans 	struct msghdr msg;
9781f155d48SKyle Evans 
9791f155d48SKyle Evans 	memset(&msg, 0, sizeof(msg));
9801f155d48SKyle Evans 	msg.msg_name = BUF;
9811f155d48SKyle Evans 	msg.msg_namelen = __len;
9821f155d48SKyle Evans 
9831f155d48SKyle Evans 	recvmsg(sock[0], &msg, 0);
9841f155d48SKyle Evans #undef BUF
9851f155d48SKyle Evans 
9861f155d48SKyle Evans }
9871f155d48SKyle Evans 
98809cdbf04SKyle Evans ATF_TC(recvmsg_msg_name_end);
ATF_TC_HEAD(recvmsg_msg_name_end,tc)98909cdbf04SKyle Evans ATF_TC_HEAD(recvmsg_msg_name_end, tc)
99009cdbf04SKyle Evans {
99109cdbf04SKyle Evans }
ATF_TC_BODY(recvmsg_msg_name_end,tc)9921f155d48SKyle Evans ATF_TC_BODY(recvmsg_msg_name_end, tc)
9931f155d48SKyle Evans {
9941f155d48SKyle Evans #define BUF &__stack.__buf
9951f155d48SKyle Evans 	struct {
9961f155d48SKyle Evans 		uint8_t padding_l;
9971f155d48SKyle Evans 		struct sockaddr __buf;
9981f155d48SKyle Evans 		uint8_t padding_r;
9991f155d48SKyle Evans 	} __stack;
10001f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
10011f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr);
10021f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
10031f155d48SKyle Evans 	int sock[2] = { -1, -1 };
10041f155d48SKyle Evans 	struct msghdr msg;
10051f155d48SKyle Evans 
10061f155d48SKyle Evans 	memset(&msg, 0, sizeof(msg));
10071f155d48SKyle Evans 	msg.msg_name = BUF;
10081f155d48SKyle Evans 	msg.msg_namelen = __len;
10091f155d48SKyle Evans 
10101f155d48SKyle Evans 	recvmsg(sock[0], &msg, 0);
10111f155d48SKyle Evans #undef BUF
10121f155d48SKyle Evans 
10131f155d48SKyle Evans }
10141f155d48SKyle Evans 
101509cdbf04SKyle Evans ATF_TC(recvmsg_msg_name_heap_before_end);
ATF_TC_HEAD(recvmsg_msg_name_heap_before_end,tc)101609cdbf04SKyle Evans ATF_TC_HEAD(recvmsg_msg_name_heap_before_end, tc)
101709cdbf04SKyle Evans {
101809cdbf04SKyle Evans }
ATF_TC_BODY(recvmsg_msg_name_heap_before_end,tc)10191f155d48SKyle Evans ATF_TC_BODY(recvmsg_msg_name_heap_before_end, tc)
10201f155d48SKyle Evans {
10211f155d48SKyle Evans #define BUF __stack.__buf
10221f155d48SKyle Evans 	struct {
10231f155d48SKyle Evans 		uint8_t padding_l;
10241f155d48SKyle Evans 		struct sockaddr * __buf;
10251f155d48SKyle Evans 		uint8_t padding_r;
10261f155d48SKyle Evans 	} __stack;
10271f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);
10281f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr) - 1;
10291f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
10301f155d48SKyle Evans 	int sock[2] = { -1, -1 };
10311f155d48SKyle Evans 	struct msghdr msg;
10321f155d48SKyle Evans 
10331f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
10341f155d48SKyle Evans 	memset(&msg, 0, sizeof(msg));
10351f155d48SKyle Evans 	msg.msg_name = BUF;
10361f155d48SKyle Evans 	msg.msg_namelen = __len;
10371f155d48SKyle Evans 
10381f155d48SKyle Evans 	recvmsg(sock[0], &msg, 0);
10391f155d48SKyle Evans #undef BUF
10401f155d48SKyle Evans 
10411f155d48SKyle Evans }
10421f155d48SKyle Evans 
104309cdbf04SKyle Evans ATF_TC(recvmsg_msg_name_heap_end);
ATF_TC_HEAD(recvmsg_msg_name_heap_end,tc)104409cdbf04SKyle Evans ATF_TC_HEAD(recvmsg_msg_name_heap_end, tc)
104509cdbf04SKyle Evans {
104609cdbf04SKyle Evans }
ATF_TC_BODY(recvmsg_msg_name_heap_end,tc)10471f155d48SKyle Evans ATF_TC_BODY(recvmsg_msg_name_heap_end, tc)
10481f155d48SKyle Evans {
10491f155d48SKyle Evans #define BUF __stack.__buf
10501f155d48SKyle Evans 	struct {
10511f155d48SKyle Evans 		uint8_t padding_l;
10521f155d48SKyle Evans 		struct sockaddr * __buf;
10531f155d48SKyle Evans 		uint8_t padding_r;
10541f155d48SKyle Evans 	} __stack;
10551f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);
10561f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr);
10571f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
10581f155d48SKyle Evans 	int sock[2] = { -1, -1 };
10591f155d48SKyle Evans 	struct msghdr msg;
10601f155d48SKyle Evans 
10611f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
10621f155d48SKyle Evans 	memset(&msg, 0, sizeof(msg));
10631f155d48SKyle Evans 	msg.msg_name = BUF;
10641f155d48SKyle Evans 	msg.msg_namelen = __len;
10651f155d48SKyle Evans 
10661f155d48SKyle Evans 	recvmsg(sock[0], &msg, 0);
10671f155d48SKyle Evans #undef BUF
10681f155d48SKyle Evans 
10691f155d48SKyle Evans }
10701f155d48SKyle Evans 
107109cdbf04SKyle Evans ATF_TC(recvmsg_msg_name_heap_after_end);
ATF_TC_HEAD(recvmsg_msg_name_heap_after_end,tc)107209cdbf04SKyle Evans ATF_TC_HEAD(recvmsg_msg_name_heap_after_end, tc)
107309cdbf04SKyle Evans {
107409cdbf04SKyle Evans }
ATF_TC_BODY(recvmsg_msg_name_heap_after_end,tc)10751f155d48SKyle Evans ATF_TC_BODY(recvmsg_msg_name_heap_after_end, tc)
10761f155d48SKyle Evans {
10771f155d48SKyle Evans #define BUF __stack.__buf
10781f155d48SKyle Evans 	struct {
10791f155d48SKyle Evans 		uint8_t padding_l;
10801f155d48SKyle Evans 		struct sockaddr * __buf;
10811f155d48SKyle Evans 		uint8_t padding_r;
10821f155d48SKyle Evans 	} __stack;
10831f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);
10841f155d48SKyle Evans 	const size_t __len = sizeof(struct sockaddr) + 1;
10851f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
10861f155d48SKyle Evans 	pid_t __child;
10871f155d48SKyle Evans 	int __status;
10881f155d48SKyle Evans 	int sock[2] = { -1, -1 };
10891f155d48SKyle Evans 	struct msghdr msg;
10901f155d48SKyle Evans 
10911f155d48SKyle Evans 	__child = fork();
10921f155d48SKyle Evans 	ATF_REQUIRE(__child >= 0);
10931f155d48SKyle Evans 	if (__child > 0)
10941f155d48SKyle Evans 		goto monitor;
10951f155d48SKyle Evans 
10961f155d48SKyle Evans 	/* Child */
10971f155d48SKyle Evans 	disable_coredumps();
10981f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
10991f155d48SKyle Evans 	memset(&msg, 0, sizeof(msg));
11001f155d48SKyle Evans 	msg.msg_name = BUF;
11011f155d48SKyle Evans 	msg.msg_namelen = __len;
11021f155d48SKyle Evans 
11031f155d48SKyle Evans 	recvmsg(sock[0], &msg, 0);
11041f155d48SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
11051f155d48SKyle Evans 
11061f155d48SKyle Evans monitor:
11071f155d48SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
11081f155d48SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
11091f155d48SKyle Evans 	}
11101f155d48SKyle Evans 
11111f155d48SKyle Evans 	if (!WIFSIGNALED(__status)) {
11121f155d48SKyle Evans 		switch (WEXITSTATUS(__status)) {
11131f155d48SKyle Evans 		case EX_SOFTWARE:
11141f155d48SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
11151f155d48SKyle Evans 			break;
11161f155d48SKyle Evans 		case EX_OSERR:
11171f155d48SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
11181f155d48SKyle Evans 			break;
11191f155d48SKyle Evans 		default:
11201f155d48SKyle Evans 			atf_tc_fail("child exited with status %d",
11211f155d48SKyle Evans 			    WEXITSTATUS(__status));
11221f155d48SKyle Evans 		}
11231f155d48SKyle Evans 	} else {
11241f155d48SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
11251f155d48SKyle Evans 	}
11261f155d48SKyle Evans #undef BUF
11271f155d48SKyle Evans 
11281f155d48SKyle Evans }
11291f155d48SKyle Evans 
113009cdbf04SKyle Evans ATF_TC(recvmsg_msg_iov_before_end);
ATF_TC_HEAD(recvmsg_msg_iov_before_end,tc)113109cdbf04SKyle Evans ATF_TC_HEAD(recvmsg_msg_iov_before_end, tc)
113209cdbf04SKyle Evans {
113309cdbf04SKyle Evans }
ATF_TC_BODY(recvmsg_msg_iov_before_end,tc)11341f155d48SKyle Evans ATF_TC_BODY(recvmsg_msg_iov_before_end, tc)
11351f155d48SKyle Evans {
11361f155d48SKyle Evans #define BUF &__stack.__buf
11371f155d48SKyle Evans 	struct {
11381f155d48SKyle Evans 		uint8_t padding_l;
11391f155d48SKyle Evans 		unsigned char __buf[42];
11401f155d48SKyle Evans 		uint8_t padding_r;
11411f155d48SKyle Evans 	} __stack;
11421f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
11431f155d48SKyle Evans 	const size_t __len = 42 - 1;
11441f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
11451f155d48SKyle Evans 	int sock[2] = { -1, -1 };
11461f155d48SKyle Evans 	struct msghdr msg;
11471f155d48SKyle Evans 	struct iovec iov[2];
11481f155d48SKyle Evans 
11491f155d48SKyle Evans 	memset(&msg, 0, sizeof(msg));
11501f155d48SKyle Evans 	memset(&iov[0], 0, sizeof(iov));
11511f155d48SKyle Evans 
11521f155d48SKyle Evans 	/*
11531f155d48SKyle Evans 	 * We position the buffer second just so that we can confirm that the
11541f155d48SKyle Evans 	 * fortification bits are traversing the iovec correctly.
11551f155d48SKyle Evans 	 */
11561f155d48SKyle Evans 	iov[1].iov_base = BUF;
11571f155d48SKyle Evans 	iov[1].iov_len = __len;
11581f155d48SKyle Evans 
11591f155d48SKyle Evans 	msg.msg_iov = &iov[0];
11601f155d48SKyle Evans 	msg.msg_iovlen = nitems(iov);
11611f155d48SKyle Evans 
11621f155d48SKyle Evans 	recvmsg(sock[0], &msg, 0);
11631f155d48SKyle Evans #undef BUF
11641f155d48SKyle Evans 
11651f155d48SKyle Evans }
11661f155d48SKyle Evans 
116709cdbf04SKyle Evans ATF_TC(recvmsg_msg_iov_end);
ATF_TC_HEAD(recvmsg_msg_iov_end,tc)116809cdbf04SKyle Evans ATF_TC_HEAD(recvmsg_msg_iov_end, tc)
116909cdbf04SKyle Evans {
117009cdbf04SKyle Evans }
ATF_TC_BODY(recvmsg_msg_iov_end,tc)11711f155d48SKyle Evans ATF_TC_BODY(recvmsg_msg_iov_end, tc)
11721f155d48SKyle Evans {
11731f155d48SKyle Evans #define BUF &__stack.__buf
11741f155d48SKyle Evans 	struct {
11751f155d48SKyle Evans 		uint8_t padding_l;
11761f155d48SKyle Evans 		unsigned char __buf[42];
11771f155d48SKyle Evans 		uint8_t padding_r;
11781f155d48SKyle Evans 	} __stack;
11791f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
11801f155d48SKyle Evans 	const size_t __len = 42;
11811f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
11821f155d48SKyle Evans 	int sock[2] = { -1, -1 };
11831f155d48SKyle Evans 	struct msghdr msg;
11841f155d48SKyle Evans 	struct iovec iov[2];
11851f155d48SKyle Evans 
11861f155d48SKyle Evans 	memset(&msg, 0, sizeof(msg));
11871f155d48SKyle Evans 	memset(&iov[0], 0, sizeof(iov));
11881f155d48SKyle Evans 
11891f155d48SKyle Evans 	/*
11901f155d48SKyle Evans 	 * We position the buffer second just so that we can confirm that the
11911f155d48SKyle Evans 	 * fortification bits are traversing the iovec correctly.
11921f155d48SKyle Evans 	 */
11931f155d48SKyle Evans 	iov[1].iov_base = BUF;
11941f155d48SKyle Evans 	iov[1].iov_len = __len;
11951f155d48SKyle Evans 
11961f155d48SKyle Evans 	msg.msg_iov = &iov[0];
11971f155d48SKyle Evans 	msg.msg_iovlen = nitems(iov);
11981f155d48SKyle Evans 
11991f155d48SKyle Evans 	recvmsg(sock[0], &msg, 0);
12001f155d48SKyle Evans #undef BUF
12011f155d48SKyle Evans 
12021f155d48SKyle Evans }
12031f155d48SKyle Evans 
120409cdbf04SKyle Evans ATF_TC(recvmsg_msg_iov_heap_before_end);
ATF_TC_HEAD(recvmsg_msg_iov_heap_before_end,tc)120509cdbf04SKyle Evans ATF_TC_HEAD(recvmsg_msg_iov_heap_before_end, tc)
120609cdbf04SKyle Evans {
120709cdbf04SKyle Evans }
ATF_TC_BODY(recvmsg_msg_iov_heap_before_end,tc)12081f155d48SKyle Evans ATF_TC_BODY(recvmsg_msg_iov_heap_before_end, tc)
12091f155d48SKyle Evans {
12101f155d48SKyle Evans #define BUF __stack.__buf
12111f155d48SKyle Evans 	struct {
12121f155d48SKyle Evans 		uint8_t padding_l;
12131f155d48SKyle Evans 		unsigned char * __buf;
12141f155d48SKyle Evans 		uint8_t padding_r;
12151f155d48SKyle Evans 	} __stack;
12161f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
12171f155d48SKyle Evans 	const size_t __len = 42 - 1;
12181f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
12191f155d48SKyle Evans 	int sock[2] = { -1, -1 };
12201f155d48SKyle Evans 	struct msghdr msg;
12211f155d48SKyle Evans 	struct iovec iov[2];
12221f155d48SKyle Evans 
12231f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
12241f155d48SKyle Evans 	memset(&msg, 0, sizeof(msg));
12251f155d48SKyle Evans 	memset(&iov[0], 0, sizeof(iov));
12261f155d48SKyle Evans 
12271f155d48SKyle Evans 	/*
12281f155d48SKyle Evans 	 * We position the buffer second just so that we can confirm that the
12291f155d48SKyle Evans 	 * fortification bits are traversing the iovec correctly.
12301f155d48SKyle Evans 	 */
12311f155d48SKyle Evans 	iov[1].iov_base = BUF;
12321f155d48SKyle Evans 	iov[1].iov_len = __len;
12331f155d48SKyle Evans 
12341f155d48SKyle Evans 	msg.msg_iov = &iov[0];
12351f155d48SKyle Evans 	msg.msg_iovlen = nitems(iov);
12361f155d48SKyle Evans 
12371f155d48SKyle Evans 	recvmsg(sock[0], &msg, 0);
12381f155d48SKyle Evans #undef BUF
12391f155d48SKyle Evans 
12401f155d48SKyle Evans }
12411f155d48SKyle Evans 
124209cdbf04SKyle Evans ATF_TC(recvmsg_msg_iov_heap_end);
ATF_TC_HEAD(recvmsg_msg_iov_heap_end,tc)124309cdbf04SKyle Evans ATF_TC_HEAD(recvmsg_msg_iov_heap_end, tc)
124409cdbf04SKyle Evans {
124509cdbf04SKyle Evans }
ATF_TC_BODY(recvmsg_msg_iov_heap_end,tc)12461f155d48SKyle Evans ATF_TC_BODY(recvmsg_msg_iov_heap_end, tc)
12471f155d48SKyle Evans {
12481f155d48SKyle Evans #define BUF __stack.__buf
12491f155d48SKyle Evans 	struct {
12501f155d48SKyle Evans 		uint8_t padding_l;
12511f155d48SKyle Evans 		unsigned char * __buf;
12521f155d48SKyle Evans 		uint8_t padding_r;
12531f155d48SKyle Evans 	} __stack;
12541f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
12551f155d48SKyle Evans 	const size_t __len = 42;
12561f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
12571f155d48SKyle Evans 	int sock[2] = { -1, -1 };
12581f155d48SKyle Evans 	struct msghdr msg;
12591f155d48SKyle Evans 	struct iovec iov[2];
12601f155d48SKyle Evans 
12611f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
12621f155d48SKyle Evans 	memset(&msg, 0, sizeof(msg));
12631f155d48SKyle Evans 	memset(&iov[0], 0, sizeof(iov));
12641f155d48SKyle Evans 
12651f155d48SKyle Evans 	/*
12661f155d48SKyle Evans 	 * We position the buffer second just so that we can confirm that the
12671f155d48SKyle Evans 	 * fortification bits are traversing the iovec correctly.
12681f155d48SKyle Evans 	 */
12691f155d48SKyle Evans 	iov[1].iov_base = BUF;
12701f155d48SKyle Evans 	iov[1].iov_len = __len;
12711f155d48SKyle Evans 
12721f155d48SKyle Evans 	msg.msg_iov = &iov[0];
12731f155d48SKyle Evans 	msg.msg_iovlen = nitems(iov);
12741f155d48SKyle Evans 
12751f155d48SKyle Evans 	recvmsg(sock[0], &msg, 0);
12761f155d48SKyle Evans #undef BUF
12771f155d48SKyle Evans 
12781f155d48SKyle Evans }
12791f155d48SKyle Evans 
128009cdbf04SKyle Evans ATF_TC(recvmsg_msg_iov_heap_after_end);
ATF_TC_HEAD(recvmsg_msg_iov_heap_after_end,tc)128109cdbf04SKyle Evans ATF_TC_HEAD(recvmsg_msg_iov_heap_after_end, tc)
128209cdbf04SKyle Evans {
128309cdbf04SKyle Evans }
ATF_TC_BODY(recvmsg_msg_iov_heap_after_end,tc)12841f155d48SKyle Evans ATF_TC_BODY(recvmsg_msg_iov_heap_after_end, tc)
12851f155d48SKyle Evans {
12861f155d48SKyle Evans #define BUF __stack.__buf
12871f155d48SKyle Evans 	struct {
12881f155d48SKyle Evans 		uint8_t padding_l;
12891f155d48SKyle Evans 		unsigned char * __buf;
12901f155d48SKyle Evans 		uint8_t padding_r;
12911f155d48SKyle Evans 	} __stack;
12921f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
12931f155d48SKyle Evans 	const size_t __len = 42 + 1;
12941f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
12951f155d48SKyle Evans 	pid_t __child;
12961f155d48SKyle Evans 	int __status;
12971f155d48SKyle Evans 	int sock[2] = { -1, -1 };
12981f155d48SKyle Evans 	struct msghdr msg;
12991f155d48SKyle Evans 	struct iovec iov[2];
13001f155d48SKyle Evans 
13011f155d48SKyle Evans 	__child = fork();
13021f155d48SKyle Evans 	ATF_REQUIRE(__child >= 0);
13031f155d48SKyle Evans 	if (__child > 0)
13041f155d48SKyle Evans 		goto monitor;
13051f155d48SKyle Evans 
13061f155d48SKyle Evans 	/* Child */
13071f155d48SKyle Evans 	disable_coredumps();
13081f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
13091f155d48SKyle Evans 	memset(&msg, 0, sizeof(msg));
13101f155d48SKyle Evans 	memset(&iov[0], 0, sizeof(iov));
13111f155d48SKyle Evans 
13121f155d48SKyle Evans 	/*
13131f155d48SKyle Evans 	 * We position the buffer second just so that we can confirm that the
13141f155d48SKyle Evans 	 * fortification bits are traversing the iovec correctly.
13151f155d48SKyle Evans 	 */
13161f155d48SKyle Evans 	iov[1].iov_base = BUF;
13171f155d48SKyle Evans 	iov[1].iov_len = __len;
13181f155d48SKyle Evans 
13191f155d48SKyle Evans 	msg.msg_iov = &iov[0];
13201f155d48SKyle Evans 	msg.msg_iovlen = nitems(iov);
13211f155d48SKyle Evans 
13221f155d48SKyle Evans 	recvmsg(sock[0], &msg, 0);
13231f155d48SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
13241f155d48SKyle Evans 
13251f155d48SKyle Evans monitor:
13261f155d48SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
13271f155d48SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
13281f155d48SKyle Evans 	}
13291f155d48SKyle Evans 
13301f155d48SKyle Evans 	if (!WIFSIGNALED(__status)) {
13311f155d48SKyle Evans 		switch (WEXITSTATUS(__status)) {
13321f155d48SKyle Evans 		case EX_SOFTWARE:
13331f155d48SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
13341f155d48SKyle Evans 			break;
13351f155d48SKyle Evans 		case EX_OSERR:
13361f155d48SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
13371f155d48SKyle Evans 			break;
13381f155d48SKyle Evans 		default:
13391f155d48SKyle Evans 			atf_tc_fail("child exited with status %d",
13401f155d48SKyle Evans 			    WEXITSTATUS(__status));
13411f155d48SKyle Evans 		}
13421f155d48SKyle Evans 	} else {
13431f155d48SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
13441f155d48SKyle Evans 	}
13451f155d48SKyle Evans #undef BUF
13461f155d48SKyle Evans 
13471f155d48SKyle Evans }
13481f155d48SKyle Evans 
134909cdbf04SKyle Evans ATF_TC(recvmsg_msg_control_before_end);
ATF_TC_HEAD(recvmsg_msg_control_before_end,tc)135009cdbf04SKyle Evans ATF_TC_HEAD(recvmsg_msg_control_before_end, tc)
135109cdbf04SKyle Evans {
135209cdbf04SKyle Evans }
ATF_TC_BODY(recvmsg_msg_control_before_end,tc)13531f155d48SKyle Evans ATF_TC_BODY(recvmsg_msg_control_before_end, tc)
13541f155d48SKyle Evans {
13551f155d48SKyle Evans #define BUF &__stack.__buf
13561f155d48SKyle Evans 	struct {
13571f155d48SKyle Evans 		uint8_t padding_l;
13581f155d48SKyle Evans 		unsigned char __buf[CMSG_SPACE(sizeof(int))];
13591f155d48SKyle Evans 		uint8_t padding_r;
13601f155d48SKyle Evans 	} __stack;
13611f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
13621f155d48SKyle Evans 	const size_t __len = CMSG_SPACE(sizeof(int)) - 1;
13631f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
13641f155d48SKyle Evans 	int sock[2] = { -1, -1 };
13651f155d48SKyle Evans 	struct msghdr msg;
13661f155d48SKyle Evans 
13671f155d48SKyle Evans 	memset(&msg, 0, sizeof(msg));
13681f155d48SKyle Evans 
13691f155d48SKyle Evans 	msg.msg_control = BUF;
13701f155d48SKyle Evans 	msg.msg_controllen = __len;
13711f155d48SKyle Evans 
13721f155d48SKyle Evans 	recvmsg(sock[0], &msg, 0);
13731f155d48SKyle Evans #undef BUF
13741f155d48SKyle Evans 
13751f155d48SKyle Evans }
13761f155d48SKyle Evans 
137709cdbf04SKyle Evans ATF_TC(recvmsg_msg_control_end);
ATF_TC_HEAD(recvmsg_msg_control_end,tc)137809cdbf04SKyle Evans ATF_TC_HEAD(recvmsg_msg_control_end, tc)
137909cdbf04SKyle Evans {
138009cdbf04SKyle Evans }
ATF_TC_BODY(recvmsg_msg_control_end,tc)13811f155d48SKyle Evans ATF_TC_BODY(recvmsg_msg_control_end, tc)
13821f155d48SKyle Evans {
13831f155d48SKyle Evans #define BUF &__stack.__buf
13841f155d48SKyle Evans 	struct {
13851f155d48SKyle Evans 		uint8_t padding_l;
13861f155d48SKyle Evans 		unsigned char __buf[CMSG_SPACE(sizeof(int))];
13871f155d48SKyle Evans 		uint8_t padding_r;
13881f155d48SKyle Evans 	} __stack;
13891f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
13901f155d48SKyle Evans 	const size_t __len = CMSG_SPACE(sizeof(int));
13911f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
13921f155d48SKyle Evans 	int sock[2] = { -1, -1 };
13931f155d48SKyle Evans 	struct msghdr msg;
13941f155d48SKyle Evans 
13951f155d48SKyle Evans 	memset(&msg, 0, sizeof(msg));
13961f155d48SKyle Evans 
13971f155d48SKyle Evans 	msg.msg_control = BUF;
13981f155d48SKyle Evans 	msg.msg_controllen = __len;
13991f155d48SKyle Evans 
14001f155d48SKyle Evans 	recvmsg(sock[0], &msg, 0);
14011f155d48SKyle Evans #undef BUF
14021f155d48SKyle Evans 
14031f155d48SKyle Evans }
14041f155d48SKyle Evans 
140509cdbf04SKyle Evans ATF_TC(recvmsg_msg_control_heap_before_end);
ATF_TC_HEAD(recvmsg_msg_control_heap_before_end,tc)140609cdbf04SKyle Evans ATF_TC_HEAD(recvmsg_msg_control_heap_before_end, tc)
140709cdbf04SKyle Evans {
140809cdbf04SKyle Evans }
ATF_TC_BODY(recvmsg_msg_control_heap_before_end,tc)14091f155d48SKyle Evans ATF_TC_BODY(recvmsg_msg_control_heap_before_end, tc)
14101f155d48SKyle Evans {
14111f155d48SKyle Evans #define BUF __stack.__buf
14121f155d48SKyle Evans 	struct {
14131f155d48SKyle Evans 		uint8_t padding_l;
14141f155d48SKyle Evans 		unsigned char * __buf;
14151f155d48SKyle Evans 		uint8_t padding_r;
14161f155d48SKyle Evans 	} __stack;
14171f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (CMSG_SPACE(sizeof(int)));
14181f155d48SKyle Evans 	const size_t __len = CMSG_SPACE(sizeof(int)) - 1;
14191f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
14201f155d48SKyle Evans 	int sock[2] = { -1, -1 };
14211f155d48SKyle Evans 	struct msghdr msg;
14221f155d48SKyle Evans 
14231f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
14241f155d48SKyle Evans 	memset(&msg, 0, sizeof(msg));
14251f155d48SKyle Evans 
14261f155d48SKyle Evans 	msg.msg_control = BUF;
14271f155d48SKyle Evans 	msg.msg_controllen = __len;
14281f155d48SKyle Evans 
14291f155d48SKyle Evans 	recvmsg(sock[0], &msg, 0);
14301f155d48SKyle Evans #undef BUF
14311f155d48SKyle Evans 
14321f155d48SKyle Evans }
14331f155d48SKyle Evans 
143409cdbf04SKyle Evans ATF_TC(recvmsg_msg_control_heap_end);
ATF_TC_HEAD(recvmsg_msg_control_heap_end,tc)143509cdbf04SKyle Evans ATF_TC_HEAD(recvmsg_msg_control_heap_end, tc)
143609cdbf04SKyle Evans {
143709cdbf04SKyle Evans }
ATF_TC_BODY(recvmsg_msg_control_heap_end,tc)14381f155d48SKyle Evans ATF_TC_BODY(recvmsg_msg_control_heap_end, tc)
14391f155d48SKyle Evans {
14401f155d48SKyle Evans #define BUF __stack.__buf
14411f155d48SKyle Evans 	struct {
14421f155d48SKyle Evans 		uint8_t padding_l;
14431f155d48SKyle Evans 		unsigned char * __buf;
14441f155d48SKyle Evans 		uint8_t padding_r;
14451f155d48SKyle Evans 	} __stack;
14461f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (CMSG_SPACE(sizeof(int)));
14471f155d48SKyle Evans 	const size_t __len = CMSG_SPACE(sizeof(int));
14481f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
14491f155d48SKyle Evans 	int sock[2] = { -1, -1 };
14501f155d48SKyle Evans 	struct msghdr msg;
14511f155d48SKyle Evans 
14521f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
14531f155d48SKyle Evans 	memset(&msg, 0, sizeof(msg));
14541f155d48SKyle Evans 
14551f155d48SKyle Evans 	msg.msg_control = BUF;
14561f155d48SKyle Evans 	msg.msg_controllen = __len;
14571f155d48SKyle Evans 
14581f155d48SKyle Evans 	recvmsg(sock[0], &msg, 0);
14591f155d48SKyle Evans #undef BUF
14601f155d48SKyle Evans 
14611f155d48SKyle Evans }
14621f155d48SKyle Evans 
146309cdbf04SKyle Evans ATF_TC(recvmsg_msg_control_heap_after_end);
ATF_TC_HEAD(recvmsg_msg_control_heap_after_end,tc)146409cdbf04SKyle Evans ATF_TC_HEAD(recvmsg_msg_control_heap_after_end, tc)
146509cdbf04SKyle Evans {
146609cdbf04SKyle Evans }
ATF_TC_BODY(recvmsg_msg_control_heap_after_end,tc)14671f155d48SKyle Evans ATF_TC_BODY(recvmsg_msg_control_heap_after_end, tc)
14681f155d48SKyle Evans {
14691f155d48SKyle Evans #define BUF __stack.__buf
14701f155d48SKyle Evans 	struct {
14711f155d48SKyle Evans 		uint8_t padding_l;
14721f155d48SKyle Evans 		unsigned char * __buf;
14731f155d48SKyle Evans 		uint8_t padding_r;
14741f155d48SKyle Evans 	} __stack;
14751f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (CMSG_SPACE(sizeof(int)));
14761f155d48SKyle Evans 	const size_t __len = CMSG_SPACE(sizeof(int)) + 1;
14771f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
14781f155d48SKyle Evans 	pid_t __child;
14791f155d48SKyle Evans 	int __status;
14801f155d48SKyle Evans 	int sock[2] = { -1, -1 };
14811f155d48SKyle Evans 	struct msghdr msg;
14821f155d48SKyle Evans 
14831f155d48SKyle Evans 	__child = fork();
14841f155d48SKyle Evans 	ATF_REQUIRE(__child >= 0);
14851f155d48SKyle Evans 	if (__child > 0)
14861f155d48SKyle Evans 		goto monitor;
14871f155d48SKyle Evans 
14881f155d48SKyle Evans 	/* Child */
14891f155d48SKyle Evans 	disable_coredumps();
14901f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
14911f155d48SKyle Evans 	memset(&msg, 0, sizeof(msg));
14921f155d48SKyle Evans 
14931f155d48SKyle Evans 	msg.msg_control = BUF;
14941f155d48SKyle Evans 	msg.msg_controllen = __len;
14951f155d48SKyle Evans 
14961f155d48SKyle Evans 	recvmsg(sock[0], &msg, 0);
14971f155d48SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
14981f155d48SKyle Evans 
14991f155d48SKyle Evans monitor:
15001f155d48SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
15011f155d48SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
15021f155d48SKyle Evans 	}
15031f155d48SKyle Evans 
15041f155d48SKyle Evans 	if (!WIFSIGNALED(__status)) {
15051f155d48SKyle Evans 		switch (WEXITSTATUS(__status)) {
15061f155d48SKyle Evans 		case EX_SOFTWARE:
15071f155d48SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
15081f155d48SKyle Evans 			break;
15091f155d48SKyle Evans 		case EX_OSERR:
15101f155d48SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
15111f155d48SKyle Evans 			break;
15121f155d48SKyle Evans 		default:
15131f155d48SKyle Evans 			atf_tc_fail("child exited with status %d",
15141f155d48SKyle Evans 			    WEXITSTATUS(__status));
15151f155d48SKyle Evans 		}
15161f155d48SKyle Evans 	} else {
15171f155d48SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
15181f155d48SKyle Evans 	}
15191f155d48SKyle Evans #undef BUF
15201f155d48SKyle Evans 
15211f155d48SKyle Evans }
15221f155d48SKyle Evans 
152309cdbf04SKyle Evans ATF_TC(recvmmsg_msgvec_before_end);
ATF_TC_HEAD(recvmmsg_msgvec_before_end,tc)152409cdbf04SKyle Evans ATF_TC_HEAD(recvmmsg_msgvec_before_end, tc)
152509cdbf04SKyle Evans {
152609cdbf04SKyle Evans }
ATF_TC_BODY(recvmmsg_msgvec_before_end,tc)15271f155d48SKyle Evans ATF_TC_BODY(recvmmsg_msgvec_before_end, tc)
15281f155d48SKyle Evans {
15291f155d48SKyle Evans #define BUF &__stack.__buf
15301f155d48SKyle Evans 	struct {
15311f155d48SKyle Evans 		uint8_t padding_l;
15321f155d48SKyle Evans 		struct mmsghdr __buf[2];
15331f155d48SKyle Evans 		uint8_t padding_r;
15341f155d48SKyle Evans 	} __stack;
15351f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
15361f155d48SKyle Evans 	const size_t __len = 2 - 1;
15371f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
15381f155d48SKyle Evans 	int sock[2] = { -1, -1 };
15391f155d48SKyle Evans 
15401f155d48SKyle Evans 	recvmmsg(sock[0], __stack.__buf, __len, 0, NULL);
15411f155d48SKyle Evans #undef BUF
15421f155d48SKyle Evans 
15431f155d48SKyle Evans }
15441f155d48SKyle Evans 
154509cdbf04SKyle Evans ATF_TC(recvmmsg_msgvec_end);
ATF_TC_HEAD(recvmmsg_msgvec_end,tc)154609cdbf04SKyle Evans ATF_TC_HEAD(recvmmsg_msgvec_end, tc)
154709cdbf04SKyle Evans {
154809cdbf04SKyle Evans }
ATF_TC_BODY(recvmmsg_msgvec_end,tc)15491f155d48SKyle Evans ATF_TC_BODY(recvmmsg_msgvec_end, tc)
15501f155d48SKyle Evans {
15511f155d48SKyle Evans #define BUF &__stack.__buf
15521f155d48SKyle Evans 	struct {
15531f155d48SKyle Evans 		uint8_t padding_l;
15541f155d48SKyle Evans 		struct mmsghdr __buf[2];
15551f155d48SKyle Evans 		uint8_t padding_r;
15561f155d48SKyle Evans 	} __stack;
15571f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
15581f155d48SKyle Evans 	const size_t __len = 2;
15591f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
15601f155d48SKyle Evans 	int sock[2] = { -1, -1 };
15611f155d48SKyle Evans 
15621f155d48SKyle Evans 	recvmmsg(sock[0], __stack.__buf, __len, 0, NULL);
15631f155d48SKyle Evans #undef BUF
15641f155d48SKyle Evans 
15651f155d48SKyle Evans }
15661f155d48SKyle Evans 
156709cdbf04SKyle Evans ATF_TC(recvmmsg_msgvec_after_end);
ATF_TC_HEAD(recvmmsg_msgvec_after_end,tc)156809cdbf04SKyle Evans ATF_TC_HEAD(recvmmsg_msgvec_after_end, tc)
156909cdbf04SKyle Evans {
157009cdbf04SKyle Evans }
ATF_TC_BODY(recvmmsg_msgvec_after_end,tc)15711f155d48SKyle Evans ATF_TC_BODY(recvmmsg_msgvec_after_end, tc)
15721f155d48SKyle Evans {
15731f155d48SKyle Evans #define BUF &__stack.__buf
15741f155d48SKyle Evans 	struct {
15751f155d48SKyle Evans 		uint8_t padding_l;
15761f155d48SKyle Evans 		struct mmsghdr __buf[2];
15771f155d48SKyle Evans 		uint8_t padding_r;
15781f155d48SKyle Evans 	} __stack;
15791f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
15801f155d48SKyle Evans 	const size_t __len = 2 + 1;
15811f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
15821f155d48SKyle Evans 	pid_t __child;
15831f155d48SKyle Evans 	int __status;
15841f155d48SKyle Evans 	int sock[2] = { -1, -1 };
15851f155d48SKyle Evans 
15861f155d48SKyle Evans 	__child = fork();
15871f155d48SKyle Evans 	ATF_REQUIRE(__child >= 0);
15881f155d48SKyle Evans 	if (__child > 0)
15891f155d48SKyle Evans 		goto monitor;
15901f155d48SKyle Evans 
15911f155d48SKyle Evans 	/* Child */
15921f155d48SKyle Evans 	disable_coredumps();
15931f155d48SKyle Evans 	recvmmsg(sock[0], __stack.__buf, __len, 0, NULL);
15941f155d48SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
15951f155d48SKyle Evans 
15961f155d48SKyle Evans monitor:
15971f155d48SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
15981f155d48SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
15991f155d48SKyle Evans 	}
16001f155d48SKyle Evans 
16011f155d48SKyle Evans 	if (!WIFSIGNALED(__status)) {
16021f155d48SKyle Evans 		switch (WEXITSTATUS(__status)) {
16031f155d48SKyle Evans 		case EX_SOFTWARE:
16041f155d48SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
16051f155d48SKyle Evans 			break;
16061f155d48SKyle Evans 		case EX_OSERR:
16071f155d48SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
16081f155d48SKyle Evans 			break;
16091f155d48SKyle Evans 		default:
16101f155d48SKyle Evans 			atf_tc_fail("child exited with status %d",
16111f155d48SKyle Evans 			    WEXITSTATUS(__status));
16121f155d48SKyle Evans 		}
16131f155d48SKyle Evans 	} else {
16141f155d48SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
16151f155d48SKyle Evans 	}
16161f155d48SKyle Evans #undef BUF
16171f155d48SKyle Evans 
16181f155d48SKyle Evans }
16191f155d48SKyle Evans 
162009cdbf04SKyle Evans ATF_TC(recvmmsg_msgvec_heap_before_end);
ATF_TC_HEAD(recvmmsg_msgvec_heap_before_end,tc)162109cdbf04SKyle Evans ATF_TC_HEAD(recvmmsg_msgvec_heap_before_end, tc)
162209cdbf04SKyle Evans {
162309cdbf04SKyle Evans }
ATF_TC_BODY(recvmmsg_msgvec_heap_before_end,tc)16241f155d48SKyle Evans ATF_TC_BODY(recvmmsg_msgvec_heap_before_end, tc)
16251f155d48SKyle Evans {
16261f155d48SKyle Evans #define BUF __stack.__buf
16271f155d48SKyle Evans 	struct {
16281f155d48SKyle Evans 		uint8_t padding_l;
16291f155d48SKyle Evans 		struct mmsghdr * __buf;
16301f155d48SKyle Evans 		uint8_t padding_r;
16311f155d48SKyle Evans 	} __stack;
16321f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (2);
16331f155d48SKyle Evans 	const size_t __len = 2 - 1;
16341f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
16351f155d48SKyle Evans 	int sock[2] = { -1, -1 };
16361f155d48SKyle Evans 
16371f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
16381f155d48SKyle Evans 
16391f155d48SKyle Evans 	recvmmsg(sock[0], __stack.__buf, __len, 0, NULL);
16401f155d48SKyle Evans #undef BUF
16411f155d48SKyle Evans 
16421f155d48SKyle Evans }
16431f155d48SKyle Evans 
164409cdbf04SKyle Evans ATF_TC(recvmmsg_msgvec_heap_end);
ATF_TC_HEAD(recvmmsg_msgvec_heap_end,tc)164509cdbf04SKyle Evans ATF_TC_HEAD(recvmmsg_msgvec_heap_end, tc)
164609cdbf04SKyle Evans {
164709cdbf04SKyle Evans }
ATF_TC_BODY(recvmmsg_msgvec_heap_end,tc)16481f155d48SKyle Evans ATF_TC_BODY(recvmmsg_msgvec_heap_end, tc)
16491f155d48SKyle Evans {
16501f155d48SKyle Evans #define BUF __stack.__buf
16511f155d48SKyle Evans 	struct {
16521f155d48SKyle Evans 		uint8_t padding_l;
16531f155d48SKyle Evans 		struct mmsghdr * __buf;
16541f155d48SKyle Evans 		uint8_t padding_r;
16551f155d48SKyle Evans 	} __stack;
16561f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (2);
16571f155d48SKyle Evans 	const size_t __len = 2;
16581f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
16591f155d48SKyle Evans 	int sock[2] = { -1, -1 };
16601f155d48SKyle Evans 
16611f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
16621f155d48SKyle Evans 
16631f155d48SKyle Evans 	recvmmsg(sock[0], __stack.__buf, __len, 0, NULL);
16641f155d48SKyle Evans #undef BUF
16651f155d48SKyle Evans 
16661f155d48SKyle Evans }
16671f155d48SKyle Evans 
166809cdbf04SKyle Evans ATF_TC(recvmmsg_msgvec_heap_after_end);
ATF_TC_HEAD(recvmmsg_msgvec_heap_after_end,tc)166909cdbf04SKyle Evans ATF_TC_HEAD(recvmmsg_msgvec_heap_after_end, tc)
167009cdbf04SKyle Evans {
167109cdbf04SKyle Evans }
ATF_TC_BODY(recvmmsg_msgvec_heap_after_end,tc)16721f155d48SKyle Evans ATF_TC_BODY(recvmmsg_msgvec_heap_after_end, tc)
16731f155d48SKyle Evans {
16741f155d48SKyle Evans #define BUF __stack.__buf
16751f155d48SKyle Evans 	struct {
16761f155d48SKyle Evans 		uint8_t padding_l;
16771f155d48SKyle Evans 		struct mmsghdr * __buf;
16781f155d48SKyle Evans 		uint8_t padding_r;
16791f155d48SKyle Evans 	} __stack;
16801f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (2);
16811f155d48SKyle Evans 	const size_t __len = 2 + 1;
16821f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
16831f155d48SKyle Evans 	pid_t __child;
16841f155d48SKyle Evans 	int __status;
16851f155d48SKyle Evans 	int sock[2] = { -1, -1 };
16861f155d48SKyle Evans 
16871f155d48SKyle Evans 	__child = fork();
16881f155d48SKyle Evans 	ATF_REQUIRE(__child >= 0);
16891f155d48SKyle Evans 	if (__child > 0)
16901f155d48SKyle Evans 		goto monitor;
16911f155d48SKyle Evans 
16921f155d48SKyle Evans 	/* Child */
16931f155d48SKyle Evans 	disable_coredumps();
16941f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
16951f155d48SKyle Evans 
16961f155d48SKyle Evans 	recvmmsg(sock[0], __stack.__buf, __len, 0, NULL);
16971f155d48SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
16981f155d48SKyle Evans 
16991f155d48SKyle Evans monitor:
17001f155d48SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
17011f155d48SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
17021f155d48SKyle Evans 	}
17031f155d48SKyle Evans 
17041f155d48SKyle Evans 	if (!WIFSIGNALED(__status)) {
17051f155d48SKyle Evans 		switch (WEXITSTATUS(__status)) {
17061f155d48SKyle Evans 		case EX_SOFTWARE:
17071f155d48SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
17081f155d48SKyle Evans 			break;
17091f155d48SKyle Evans 		case EX_OSERR:
17101f155d48SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
17111f155d48SKyle Evans 			break;
17121f155d48SKyle Evans 		default:
17131f155d48SKyle Evans 			atf_tc_fail("child exited with status %d",
17141f155d48SKyle Evans 			    WEXITSTATUS(__status));
17151f155d48SKyle Evans 		}
17161f155d48SKyle Evans 	} else {
17171f155d48SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
17181f155d48SKyle Evans 	}
17191f155d48SKyle Evans #undef BUF
17201f155d48SKyle Evans 
17211f155d48SKyle Evans }
17221f155d48SKyle Evans 
172309cdbf04SKyle Evans ATF_TC(recvmmsg_msghdr_before_end);
ATF_TC_HEAD(recvmmsg_msghdr_before_end,tc)172409cdbf04SKyle Evans ATF_TC_HEAD(recvmmsg_msghdr_before_end, tc)
172509cdbf04SKyle Evans {
172609cdbf04SKyle Evans }
ATF_TC_BODY(recvmmsg_msghdr_before_end,tc)17271f155d48SKyle Evans ATF_TC_BODY(recvmmsg_msghdr_before_end, tc)
17281f155d48SKyle Evans {
17291f155d48SKyle Evans #define BUF &__stack.__buf
17301f155d48SKyle Evans 	struct {
17311f155d48SKyle Evans 		uint8_t padding_l;
17321f155d48SKyle Evans 		unsigned char __buf[42];
17331f155d48SKyle Evans 		uint8_t padding_r;
17341f155d48SKyle Evans 	} __stack;
17351f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
17361f155d48SKyle Evans 	const size_t __len = 42 - 1;
17371f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
17381f155d48SKyle Evans 	int sock[2] = { -1, -1 };
17391f155d48SKyle Evans 	struct mmsghdr msgvec[2];
17401f155d48SKyle Evans 
17411f155d48SKyle Evans 	memset(&msgvec[0], 0, sizeof(msgvec));
17421f155d48SKyle Evans 
17431f155d48SKyle Evans 	/*
17441f155d48SKyle Evans 	 * Same as above, make sure fortification isn't ignoring n > 1 elements
17451f155d48SKyle Evans 	 * of the msgvec.
17461f155d48SKyle Evans 	 */
17471f155d48SKyle Evans 	msgvec[1].msg_hdr.msg_control = BUF;
17481f155d48SKyle Evans 	msgvec[1].msg_hdr.msg_controllen = __len;
17491f155d48SKyle Evans 
17501f155d48SKyle Evans 	recvmmsg(sock[0], &msgvec[0], nitems(msgvec), 0, NULL);
17511f155d48SKyle Evans #undef BUF
17521f155d48SKyle Evans 
17531f155d48SKyle Evans }
17541f155d48SKyle Evans 
175509cdbf04SKyle Evans ATF_TC(recvmmsg_msghdr_end);
ATF_TC_HEAD(recvmmsg_msghdr_end,tc)175609cdbf04SKyle Evans ATF_TC_HEAD(recvmmsg_msghdr_end, tc)
175709cdbf04SKyle Evans {
175809cdbf04SKyle Evans }
ATF_TC_BODY(recvmmsg_msghdr_end,tc)17591f155d48SKyle Evans ATF_TC_BODY(recvmmsg_msghdr_end, tc)
17601f155d48SKyle Evans {
17611f155d48SKyle Evans #define BUF &__stack.__buf
17621f155d48SKyle Evans 	struct {
17631f155d48SKyle Evans 		uint8_t padding_l;
17641f155d48SKyle Evans 		unsigned char __buf[42];
17651f155d48SKyle Evans 		uint8_t padding_r;
17661f155d48SKyle Evans 	} __stack;
17671f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
17681f155d48SKyle Evans 	const size_t __len = 42;
17691f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
17701f155d48SKyle Evans 	int sock[2] = { -1, -1 };
17711f155d48SKyle Evans 	struct mmsghdr msgvec[2];
17721f155d48SKyle Evans 
17731f155d48SKyle Evans 	memset(&msgvec[0], 0, sizeof(msgvec));
17741f155d48SKyle Evans 
17751f155d48SKyle Evans 	/*
17761f155d48SKyle Evans 	 * Same as above, make sure fortification isn't ignoring n > 1 elements
17771f155d48SKyle Evans 	 * of the msgvec.
17781f155d48SKyle Evans 	 */
17791f155d48SKyle Evans 	msgvec[1].msg_hdr.msg_control = BUF;
17801f155d48SKyle Evans 	msgvec[1].msg_hdr.msg_controllen = __len;
17811f155d48SKyle Evans 
17821f155d48SKyle Evans 	recvmmsg(sock[0], &msgvec[0], nitems(msgvec), 0, NULL);
17831f155d48SKyle Evans #undef BUF
17841f155d48SKyle Evans 
17851f155d48SKyle Evans }
17861f155d48SKyle Evans 
178709cdbf04SKyle Evans ATF_TC(recvmmsg_msghdr_heap_before_end);
ATF_TC_HEAD(recvmmsg_msghdr_heap_before_end,tc)178809cdbf04SKyle Evans ATF_TC_HEAD(recvmmsg_msghdr_heap_before_end, tc)
178909cdbf04SKyle Evans {
179009cdbf04SKyle Evans }
ATF_TC_BODY(recvmmsg_msghdr_heap_before_end,tc)17911f155d48SKyle Evans ATF_TC_BODY(recvmmsg_msghdr_heap_before_end, tc)
17921f155d48SKyle Evans {
17931f155d48SKyle Evans #define BUF __stack.__buf
17941f155d48SKyle Evans 	struct {
17951f155d48SKyle Evans 		uint8_t padding_l;
17961f155d48SKyle Evans 		unsigned char * __buf;
17971f155d48SKyle Evans 		uint8_t padding_r;
17981f155d48SKyle Evans 	} __stack;
17991f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
18001f155d48SKyle Evans 	const size_t __len = 42 - 1;
18011f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
18021f155d48SKyle Evans 	int sock[2] = { -1, -1 };
18031f155d48SKyle Evans 	struct mmsghdr msgvec[2];
18041f155d48SKyle Evans 
18051f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
18061f155d48SKyle Evans 	memset(&msgvec[0], 0, sizeof(msgvec));
18071f155d48SKyle Evans 
18081f155d48SKyle Evans 	/*
18091f155d48SKyle Evans 	 * Same as above, make sure fortification isn't ignoring n > 1 elements
18101f155d48SKyle Evans 	 * of the msgvec.
18111f155d48SKyle Evans 	 */
18121f155d48SKyle Evans 	msgvec[1].msg_hdr.msg_control = BUF;
18131f155d48SKyle Evans 	msgvec[1].msg_hdr.msg_controllen = __len;
18141f155d48SKyle Evans 
18151f155d48SKyle Evans 	recvmmsg(sock[0], &msgvec[0], nitems(msgvec), 0, NULL);
18161f155d48SKyle Evans #undef BUF
18171f155d48SKyle Evans 
18181f155d48SKyle Evans }
18191f155d48SKyle Evans 
182009cdbf04SKyle Evans ATF_TC(recvmmsg_msghdr_heap_end);
ATF_TC_HEAD(recvmmsg_msghdr_heap_end,tc)182109cdbf04SKyle Evans ATF_TC_HEAD(recvmmsg_msghdr_heap_end, tc)
182209cdbf04SKyle Evans {
182309cdbf04SKyle Evans }
ATF_TC_BODY(recvmmsg_msghdr_heap_end,tc)18241f155d48SKyle Evans ATF_TC_BODY(recvmmsg_msghdr_heap_end, tc)
18251f155d48SKyle Evans {
18261f155d48SKyle Evans #define BUF __stack.__buf
18271f155d48SKyle Evans 	struct {
18281f155d48SKyle Evans 		uint8_t padding_l;
18291f155d48SKyle Evans 		unsigned char * __buf;
18301f155d48SKyle Evans 		uint8_t padding_r;
18311f155d48SKyle Evans 	} __stack;
18321f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
18331f155d48SKyle Evans 	const size_t __len = 42;
18341f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
18351f155d48SKyle Evans 	int sock[2] = { -1, -1 };
18361f155d48SKyle Evans 	struct mmsghdr msgvec[2];
18371f155d48SKyle Evans 
18381f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
18391f155d48SKyle Evans 	memset(&msgvec[0], 0, sizeof(msgvec));
18401f155d48SKyle Evans 
18411f155d48SKyle Evans 	/*
18421f155d48SKyle Evans 	 * Same as above, make sure fortification isn't ignoring n > 1 elements
18431f155d48SKyle Evans 	 * of the msgvec.
18441f155d48SKyle Evans 	 */
18451f155d48SKyle Evans 	msgvec[1].msg_hdr.msg_control = BUF;
18461f155d48SKyle Evans 	msgvec[1].msg_hdr.msg_controllen = __len;
18471f155d48SKyle Evans 
18481f155d48SKyle Evans 	recvmmsg(sock[0], &msgvec[0], nitems(msgvec), 0, NULL);
18491f155d48SKyle Evans #undef BUF
18501f155d48SKyle Evans 
18511f155d48SKyle Evans }
18521f155d48SKyle Evans 
185309cdbf04SKyle Evans ATF_TC(recvmmsg_msghdr_heap_after_end);
ATF_TC_HEAD(recvmmsg_msghdr_heap_after_end,tc)185409cdbf04SKyle Evans ATF_TC_HEAD(recvmmsg_msghdr_heap_after_end, tc)
185509cdbf04SKyle Evans {
185609cdbf04SKyle Evans }
ATF_TC_BODY(recvmmsg_msghdr_heap_after_end,tc)18571f155d48SKyle Evans ATF_TC_BODY(recvmmsg_msghdr_heap_after_end, tc)
18581f155d48SKyle Evans {
18591f155d48SKyle Evans #define BUF __stack.__buf
18601f155d48SKyle Evans 	struct {
18611f155d48SKyle Evans 		uint8_t padding_l;
18621f155d48SKyle Evans 		unsigned char * __buf;
18631f155d48SKyle Evans 		uint8_t padding_r;
18641f155d48SKyle Evans 	} __stack;
18651f155d48SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
18661f155d48SKyle Evans 	const size_t __len = 42 + 1;
18671f155d48SKyle Evans 	const size_t __idx __unused = __len - 1;
18681f155d48SKyle Evans 	pid_t __child;
18691f155d48SKyle Evans 	int __status;
18701f155d48SKyle Evans 	int sock[2] = { -1, -1 };
18711f155d48SKyle Evans 	struct mmsghdr msgvec[2];
18721f155d48SKyle Evans 
18731f155d48SKyle Evans 	__child = fork();
18741f155d48SKyle Evans 	ATF_REQUIRE(__child >= 0);
18751f155d48SKyle Evans 	if (__child > 0)
18761f155d48SKyle Evans 		goto monitor;
18771f155d48SKyle Evans 
18781f155d48SKyle Evans 	/* Child */
18791f155d48SKyle Evans 	disable_coredumps();
18801f155d48SKyle Evans 	__stack.__buf = malloc(__bufsz);
18811f155d48SKyle Evans 	memset(&msgvec[0], 0, sizeof(msgvec));
18821f155d48SKyle Evans 
18831f155d48SKyle Evans 	/*
18841f155d48SKyle Evans 	 * Same as above, make sure fortification isn't ignoring n > 1 elements
18851f155d48SKyle Evans 	 * of the msgvec.
18861f155d48SKyle Evans 	 */
18871f155d48SKyle Evans 	msgvec[1].msg_hdr.msg_control = BUF;
18881f155d48SKyle Evans 	msgvec[1].msg_hdr.msg_controllen = __len;
18891f155d48SKyle Evans 
18901f155d48SKyle Evans 	recvmmsg(sock[0], &msgvec[0], nitems(msgvec), 0, NULL);
18911f155d48SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
18921f155d48SKyle Evans 
18931f155d48SKyle Evans monitor:
18941f155d48SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
18951f155d48SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
18961f155d48SKyle Evans 	}
18971f155d48SKyle Evans 
18981f155d48SKyle Evans 	if (!WIFSIGNALED(__status)) {
18991f155d48SKyle Evans 		switch (WEXITSTATUS(__status)) {
19001f155d48SKyle Evans 		case EX_SOFTWARE:
19011f155d48SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
19021f155d48SKyle Evans 			break;
19031f155d48SKyle Evans 		case EX_OSERR:
19041f155d48SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
19051f155d48SKyle Evans 			break;
19061f155d48SKyle Evans 		default:
19071f155d48SKyle Evans 			atf_tc_fail("child exited with status %d",
19081f155d48SKyle Evans 			    WEXITSTATUS(__status));
19091f155d48SKyle Evans 		}
19101f155d48SKyle Evans 	} else {
19111f155d48SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
19121f155d48SKyle Evans 	}
19131f155d48SKyle Evans #undef BUF
19141f155d48SKyle Evans 
19151f155d48SKyle Evans }
19161f155d48SKyle Evans 
ATF_TP_ADD_TCS(tp)19171f155d48SKyle Evans ATF_TP_ADD_TCS(tp)
19181f155d48SKyle Evans {
19191f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, getpeername_before_end);
19201f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, getpeername_end);
19211f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, getpeername_heap_before_end);
19221f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, getpeername_heap_end);
19231f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, getpeername_heap_after_end);
19241f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, getsockname_before_end);
19251f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, getsockname_end);
19261f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, getsockname_heap_before_end);
19271f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, getsockname_heap_end);
19281f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, getsockname_heap_after_end);
19291f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recv_before_end);
19301f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recv_end);
19311f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recv_heap_before_end);
19321f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recv_heap_end);
19331f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recv_heap_after_end);
19341f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvfrom_before_end);
19351f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvfrom_end);
19361f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvfrom_heap_before_end);
19371f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvfrom_heap_end);
19381f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvfrom_heap_after_end);
19391f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvfrom_sockaddr_before_end);
19401f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvfrom_sockaddr_end);
19411f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvfrom_sockaddr_heap_before_end);
19421f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvfrom_sockaddr_heap_end);
19431f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvfrom_sockaddr_heap_after_end);
19441f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmsg_msg_name_before_end);
19451f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmsg_msg_name_end);
19461f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmsg_msg_name_heap_before_end);
19471f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmsg_msg_name_heap_end);
19481f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmsg_msg_name_heap_after_end);
19491f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmsg_msg_iov_before_end);
19501f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmsg_msg_iov_end);
19511f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmsg_msg_iov_heap_before_end);
19521f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmsg_msg_iov_heap_end);
19531f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmsg_msg_iov_heap_after_end);
19541f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmsg_msg_control_before_end);
19551f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmsg_msg_control_end);
19561f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmsg_msg_control_heap_before_end);
19571f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmsg_msg_control_heap_end);
19581f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmsg_msg_control_heap_after_end);
19591f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmmsg_msgvec_before_end);
19601f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmmsg_msgvec_end);
19611f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmmsg_msgvec_after_end);
19621f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmmsg_msgvec_heap_before_end);
19631f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmmsg_msgvec_heap_end);
19641f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmmsg_msgvec_heap_after_end);
19651f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmmsg_msghdr_before_end);
19661f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmmsg_msghdr_end);
19671f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmmsg_msghdr_heap_before_end);
19681f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmmsg_msghdr_heap_end);
19691f155d48SKyle Evans 	ATF_TP_ADD_TC(tp, recvmmsg_msghdr_heap_after_end);
19701f155d48SKyle Evans 	return (atf_no_error());
19711f155d48SKyle Evans }
1972