xref: /freebsd/lib/libc/tests/secure/fortify_unistd_test.c (revision 22178cb29f03a3b7bf919f3605e0cd5d6b18fa0a)
1020d003cSKyle Evans /* @generated by `generate-fortify-tests.lua "unistd"` */
2020d003cSKyle Evans 
3020d003cSKyle Evans #define	_FORTIFY_SOURCE	2
4020d003cSKyle Evans #define	TMPFILE_SIZE	(1024 * 32)
5020d003cSKyle Evans 
6020d003cSKyle Evans #include <sys/param.h>
7*22178cb2SKyle Evans #include <sys/jail.h>
8062d9380SKyle Evans #include <sys/random.h>
9020d003cSKyle Evans #include <sys/resource.h>
102aba0eeaSKyle Evans #include <sys/select.h>
111f155d48SKyle Evans #include <sys/socket.h>
12020d003cSKyle Evans #include <sys/time.h>
131ace24b3SKyle Evans #include <sys/uio.h>
14020d003cSKyle Evans #include <sys/wait.h>
15020d003cSKyle Evans #include <dirent.h>
16020d003cSKyle Evans #include <errno.h>
17020d003cSKyle Evans #include <fcntl.h>
18020d003cSKyle Evans #include <limits.h>
1988276dfbSKyle Evans #include <poll.h>
20020d003cSKyle Evans #include <signal.h>
21020d003cSKyle Evans #include <stdio.h>
22020d003cSKyle Evans #include <stdlib.h>
23020d003cSKyle Evans #include <string.h>
24020d003cSKyle Evans #include <strings.h>
25020d003cSKyle Evans #include <sysexits.h>
26020d003cSKyle Evans #include <unistd.h>
27b53d7aa8SKyle Evans #include <wchar.h>
28020d003cSKyle Evans #include <atf-c.h>
29020d003cSKyle Evans 
30cf8e5289SKyle Evans static FILE * __unused
new_fp(size_t __len)31cf8e5289SKyle Evans new_fp(size_t __len)
32cf8e5289SKyle Evans {
33cf8e5289SKyle Evans 	static char fpbuf[LINE_MAX];
34cf8e5289SKyle Evans 	FILE *fp;
35cf8e5289SKyle Evans 
36cf8e5289SKyle Evans 	ATF_REQUIRE(__len <= sizeof(fpbuf));
37cf8e5289SKyle Evans 
38cf8e5289SKyle Evans 	memset(fpbuf, 'A', sizeof(fpbuf) - 1);
39cf8e5289SKyle Evans 	fpbuf[sizeof(fpbuf) - 1] = '\0';
40cf8e5289SKyle Evans 
41cf8e5289SKyle Evans 	fp = fmemopen(fpbuf, sizeof(fpbuf), "rb");
42cf8e5289SKyle Evans 	ATF_REQUIRE(fp != NULL);
43cf8e5289SKyle Evans 
44cf8e5289SKyle Evans 	return (fp);
45cf8e5289SKyle Evans }
46cf8e5289SKyle Evans 
47020d003cSKyle Evans /*
48020d003cSKyle Evans  * Create a new symlink to use for readlink(2) style tests, we'll just use a
49020d003cSKyle Evans  * random target name to have something interesting to look at.
50020d003cSKyle Evans  */
51020d003cSKyle Evans static const char * __unused
new_symlink(size_t __len)52020d003cSKyle Evans new_symlink(size_t __len)
53020d003cSKyle Evans {
54020d003cSKyle Evans 	static const char linkname[] = "link";
55020d003cSKyle Evans 	char target[MAXNAMLEN];
56020d003cSKyle Evans 	int error;
57020d003cSKyle Evans 
58020d003cSKyle Evans 	ATF_REQUIRE(__len <= sizeof(target));
59020d003cSKyle Evans 
60020d003cSKyle Evans 	arc4random_buf(target, sizeof(target));
61020d003cSKyle Evans 
62020d003cSKyle Evans 	error = unlink(linkname);
63020d003cSKyle Evans 	ATF_REQUIRE(error == 0 || errno == ENOENT);
64020d003cSKyle Evans 
65020d003cSKyle Evans 	error = symlink(target, linkname);
66020d003cSKyle Evans 	ATF_REQUIRE(error == 0);
67020d003cSKyle Evans 
68020d003cSKyle Evans 	return (linkname);
69020d003cSKyle Evans }
70020d003cSKyle Evans 
71020d003cSKyle Evans /*
721f155d48SKyle Evans  * For our purposes, first descriptor will be the reader; we'll send both
731f155d48SKyle Evans  * raw data and a control message over it so that the result can be used for
741f155d48SKyle Evans  * any of our recv*() tests.
751f155d48SKyle Evans  */
761f155d48SKyle Evans static void __unused
new_socket(int sock[2])771f155d48SKyle Evans new_socket(int sock[2])
781f155d48SKyle Evans {
791f155d48SKyle Evans 	unsigned char ctrl[CMSG_SPACE(sizeof(int))] = { 0 };
801f155d48SKyle Evans 	static char sockbuf[256];
811f155d48SKyle Evans 	ssize_t rv;
821f155d48SKyle Evans 	size_t total = 0;
831f155d48SKyle Evans 	struct msghdr hdr = { 0 };
841f155d48SKyle Evans 	struct cmsghdr *cmsg;
851f155d48SKyle Evans 	int error, fd;
861f155d48SKyle Evans 
871f155d48SKyle Evans 	error = socketpair(AF_UNIX, SOCK_STREAM, 0, sock);
881f155d48SKyle Evans 	ATF_REQUIRE(error == 0);
891f155d48SKyle Evans 
901f155d48SKyle Evans 	while (total != sizeof(sockbuf)) {
911f155d48SKyle Evans 		rv = send(sock[1], &sockbuf[total], sizeof(sockbuf) - total, 0);
921f155d48SKyle Evans 
931f155d48SKyle Evans 		ATF_REQUIRE_MSG(rv > 0,
941f155d48SKyle Evans 		    "expected bytes sent, got %zd with %zu left (size %zu, total %zu)",
951f155d48SKyle Evans 		    rv, sizeof(sockbuf) - total, sizeof(sockbuf), total);
961f155d48SKyle Evans 		ATF_REQUIRE_MSG(total + (size_t)rv <= sizeof(sockbuf),
971f155d48SKyle Evans 		    "%zd exceeds total %zu", rv, sizeof(sockbuf));
981f155d48SKyle Evans 		total += rv;
991f155d48SKyle Evans 	}
1001f155d48SKyle Evans 
1011f155d48SKyle Evans 	hdr.msg_control = ctrl;
1021f155d48SKyle Evans 	hdr.msg_controllen = sizeof(ctrl);
1031f155d48SKyle Evans 
1041f155d48SKyle Evans 	cmsg = CMSG_FIRSTHDR(&hdr);
1051f155d48SKyle Evans 	cmsg->cmsg_level = SOL_SOCKET;
1061f155d48SKyle Evans 	cmsg->cmsg_type = SCM_RIGHTS;
1071f155d48SKyle Evans 	cmsg->cmsg_len = CMSG_LEN(sizeof(fd));
1081f155d48SKyle Evans 	fd = STDIN_FILENO;
1091f155d48SKyle Evans 	memcpy(CMSG_DATA(cmsg), &fd, sizeof(fd));
1101f155d48SKyle Evans 
1111f155d48SKyle Evans 	error = sendmsg(sock[1], &hdr, 0);
1121f155d48SKyle Evans 	ATF_REQUIRE(error != -1);
1131f155d48SKyle Evans }
1141f155d48SKyle Evans 
1151f155d48SKyle Evans /*
116020d003cSKyle Evans  * Constructs a tmpfile that we can use for testing read(2) and friends.
117020d003cSKyle Evans  */
118020d003cSKyle Evans static int __unused
new_tmpfile(void)119020d003cSKyle Evans new_tmpfile(void)
120020d003cSKyle Evans {
121020d003cSKyle Evans 	char buf[1024];
122020d003cSKyle Evans 	ssize_t rv;
123020d003cSKyle Evans 	size_t written;
124020d003cSKyle Evans 	int fd;
125020d003cSKyle Evans 
126020d003cSKyle Evans 	fd = open("tmpfile", O_RDWR | O_CREAT | O_TRUNC, 0644);
127020d003cSKyle Evans 	ATF_REQUIRE(fd >= 0);
128020d003cSKyle Evans 
129020d003cSKyle Evans 	written = 0;
130020d003cSKyle Evans 	while (written < TMPFILE_SIZE) {
131020d003cSKyle Evans 		rv = write(fd, buf, sizeof(buf));
132020d003cSKyle Evans 		ATF_REQUIRE(rv > 0);
133020d003cSKyle Evans 
134020d003cSKyle Evans 		written += rv;
135020d003cSKyle Evans 	}
136020d003cSKyle Evans 
137020d003cSKyle Evans 	ATF_REQUIRE_EQ(0, lseek(fd, 0, SEEK_SET));
138020d003cSKyle Evans 	return (fd);
139020d003cSKyle Evans }
140020d003cSKyle Evans 
141020d003cSKyle Evans static void
disable_coredumps(void)142020d003cSKyle Evans disable_coredumps(void)
143020d003cSKyle Evans {
144020d003cSKyle Evans 	struct rlimit rl = { 0 };
145020d003cSKyle Evans 
146020d003cSKyle Evans 	if (setrlimit(RLIMIT_CORE, &rl) == -1)
147020d003cSKyle Evans 		_exit(EX_OSERR);
148020d003cSKyle Evans }
149020d003cSKyle Evans 
150cf8e5289SKyle Evans /*
151cf8e5289SKyle Evans  * Replaces stdin with a file that we can actually read from, for tests where
152cf8e5289SKyle Evans  * we want a FILE * or fd that we can get data from.
153cf8e5289SKyle Evans  */
154cf8e5289SKyle Evans static void __unused
replace_stdin(void)155cf8e5289SKyle Evans replace_stdin(void)
156cf8e5289SKyle Evans {
157cf8e5289SKyle Evans 	int fd;
158cf8e5289SKyle Evans 
159cf8e5289SKyle Evans 	fd = new_tmpfile();
160cf8e5289SKyle Evans 
161cf8e5289SKyle Evans 	(void)dup2(fd, STDIN_FILENO);
162cf8e5289SKyle Evans 	if (fd != STDIN_FILENO)
163cf8e5289SKyle Evans 		close(fd);
164cf8e5289SKyle Evans }
165cf8e5289SKyle Evans 
166*22178cb2SKyle Evans #define	JAIL_HOSTNAME	"host.example.com"
167*22178cb2SKyle Evans #define	JAIL_DOMAINNAME	"example.com"
168*22178cb2SKyle Evans static void
dhost_jail(void)169*22178cb2SKyle Evans dhost_jail(void)
170*22178cb2SKyle Evans {
171*22178cb2SKyle Evans 	struct iovec iov[4];
172*22178cb2SKyle Evans 	int jid;
173*22178cb2SKyle Evans 
174*22178cb2SKyle Evans 	iov[0].iov_base = __DECONST(char *, "host.hostname");
175*22178cb2SKyle Evans 	iov[0].iov_len = sizeof("host.hostname");
176*22178cb2SKyle Evans 	iov[1].iov_base = __DECONST(char *, JAIL_HOSTNAME);
177*22178cb2SKyle Evans 	iov[1].iov_len = sizeof(JAIL_HOSTNAME);
178*22178cb2SKyle Evans 	iov[2].iov_base = __DECONST(char *, "host.domainname");
179*22178cb2SKyle Evans 	iov[2].iov_len = sizeof("host.domainname");
180*22178cb2SKyle Evans 	iov[3].iov_base = __DECONST(char *, JAIL_DOMAINNAME);
181*22178cb2SKyle Evans 	iov[3].iov_len = sizeof(JAIL_DOMAINNAME);
182*22178cb2SKyle Evans 
183*22178cb2SKyle Evans 	jid = jail_set(iov, nitems(iov), JAIL_CREATE | JAIL_ATTACH);
184*22178cb2SKyle Evans 	ATF_REQUIRE_MSG(jid > 0, "Jail creation failed: %s", strerror(errno));
185*22178cb2SKyle Evans }
186*22178cb2SKyle Evans 
18709cdbf04SKyle Evans ATF_TC(getcwd_before_end);
ATF_TC_HEAD(getcwd_before_end,tc)18809cdbf04SKyle Evans ATF_TC_HEAD(getcwd_before_end, tc)
18909cdbf04SKyle Evans {
19009cdbf04SKyle Evans }
ATF_TC_BODY(getcwd_before_end,tc)191020d003cSKyle Evans ATF_TC_BODY(getcwd_before_end, tc)
192020d003cSKyle Evans {
193020d003cSKyle Evans #define BUF &__stack.__buf
194020d003cSKyle Evans 	struct {
195020d003cSKyle Evans 		uint8_t padding_l;
196020d003cSKyle Evans 		unsigned char __buf[8];
197020d003cSKyle Evans 		uint8_t padding_r;
198020d003cSKyle Evans 	} __stack;
199020d003cSKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
200020d003cSKyle Evans 	const size_t __len = 8 - 1;
201020d003cSKyle Evans 	const size_t __idx __unused = __len - 1;
202020d003cSKyle Evans 
203020d003cSKyle Evans 	getcwd(__stack.__buf, __len);
204020d003cSKyle Evans #undef BUF
205020d003cSKyle Evans 
206020d003cSKyle Evans }
207020d003cSKyle Evans 
20809cdbf04SKyle Evans ATF_TC(getcwd_end);
ATF_TC_HEAD(getcwd_end,tc)20909cdbf04SKyle Evans ATF_TC_HEAD(getcwd_end, tc)
21009cdbf04SKyle Evans {
21109cdbf04SKyle Evans }
ATF_TC_BODY(getcwd_end,tc)212020d003cSKyle Evans ATF_TC_BODY(getcwd_end, tc)
213020d003cSKyle Evans {
214020d003cSKyle Evans #define BUF &__stack.__buf
215020d003cSKyle Evans 	struct {
216020d003cSKyle Evans 		uint8_t padding_l;
217020d003cSKyle Evans 		unsigned char __buf[8];
218020d003cSKyle Evans 		uint8_t padding_r;
219020d003cSKyle Evans 	} __stack;
220020d003cSKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
221020d003cSKyle Evans 	const size_t __len = 8;
222020d003cSKyle Evans 	const size_t __idx __unused = __len - 1;
223020d003cSKyle Evans 
224020d003cSKyle Evans 	getcwd(__stack.__buf, __len);
225020d003cSKyle Evans #undef BUF
226020d003cSKyle Evans 
227020d003cSKyle Evans }
228020d003cSKyle Evans 
22909cdbf04SKyle Evans ATF_TC(getcwd_heap_before_end);
ATF_TC_HEAD(getcwd_heap_before_end,tc)23009cdbf04SKyle Evans ATF_TC_HEAD(getcwd_heap_before_end, tc)
23109cdbf04SKyle Evans {
23209cdbf04SKyle Evans }
ATF_TC_BODY(getcwd_heap_before_end,tc)233020d003cSKyle Evans ATF_TC_BODY(getcwd_heap_before_end, tc)
234020d003cSKyle Evans {
235020d003cSKyle Evans #define BUF __stack.__buf
236020d003cSKyle Evans 	struct {
237020d003cSKyle Evans 		uint8_t padding_l;
238020d003cSKyle Evans 		unsigned char * __buf;
239020d003cSKyle Evans 		uint8_t padding_r;
240020d003cSKyle Evans 	} __stack;
241020d003cSKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (8);
242020d003cSKyle Evans 	const size_t __len = 8 - 1;
243020d003cSKyle Evans 	const size_t __idx __unused = __len - 1;
244020d003cSKyle Evans 
245020d003cSKyle Evans 	__stack.__buf = malloc(__bufsz);
246020d003cSKyle Evans 
247020d003cSKyle Evans 	getcwd(__stack.__buf, __len);
248020d003cSKyle Evans #undef BUF
249020d003cSKyle Evans 
250020d003cSKyle Evans }
251020d003cSKyle Evans 
25209cdbf04SKyle Evans ATF_TC(getcwd_heap_end);
ATF_TC_HEAD(getcwd_heap_end,tc)25309cdbf04SKyle Evans ATF_TC_HEAD(getcwd_heap_end, tc)
25409cdbf04SKyle Evans {
25509cdbf04SKyle Evans }
ATF_TC_BODY(getcwd_heap_end,tc)256020d003cSKyle Evans ATF_TC_BODY(getcwd_heap_end, tc)
257020d003cSKyle Evans {
258020d003cSKyle Evans #define BUF __stack.__buf
259020d003cSKyle Evans 	struct {
260020d003cSKyle Evans 		uint8_t padding_l;
261020d003cSKyle Evans 		unsigned char * __buf;
262020d003cSKyle Evans 		uint8_t padding_r;
263020d003cSKyle Evans 	} __stack;
264020d003cSKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (8);
265020d003cSKyle Evans 	const size_t __len = 8;
266020d003cSKyle Evans 	const size_t __idx __unused = __len - 1;
267020d003cSKyle Evans 
268020d003cSKyle Evans 	__stack.__buf = malloc(__bufsz);
269020d003cSKyle Evans 
270020d003cSKyle Evans 	getcwd(__stack.__buf, __len);
271020d003cSKyle Evans #undef BUF
272020d003cSKyle Evans 
273020d003cSKyle Evans }
274020d003cSKyle Evans 
27509cdbf04SKyle Evans ATF_TC(getcwd_heap_after_end);
ATF_TC_HEAD(getcwd_heap_after_end,tc)27609cdbf04SKyle Evans ATF_TC_HEAD(getcwd_heap_after_end, tc)
27709cdbf04SKyle Evans {
27809cdbf04SKyle Evans }
ATF_TC_BODY(getcwd_heap_after_end,tc)279020d003cSKyle Evans ATF_TC_BODY(getcwd_heap_after_end, tc)
280020d003cSKyle Evans {
281020d003cSKyle Evans #define BUF __stack.__buf
282020d003cSKyle Evans 	struct {
283020d003cSKyle Evans 		uint8_t padding_l;
284020d003cSKyle Evans 		unsigned char * __buf;
285020d003cSKyle Evans 		uint8_t padding_r;
286020d003cSKyle Evans 	} __stack;
287020d003cSKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (8);
288020d003cSKyle Evans 	const size_t __len = 8 + 1;
289020d003cSKyle Evans 	const size_t __idx __unused = __len - 1;
290020d003cSKyle Evans 	pid_t __child;
291020d003cSKyle Evans 	int __status;
292020d003cSKyle Evans 
293020d003cSKyle Evans 	__child = fork();
294020d003cSKyle Evans 	ATF_REQUIRE(__child >= 0);
295020d003cSKyle Evans 	if (__child > 0)
296020d003cSKyle Evans 		goto monitor;
297020d003cSKyle Evans 
298020d003cSKyle Evans 	/* Child */
299020d003cSKyle Evans 	disable_coredumps();
300020d003cSKyle Evans 	__stack.__buf = malloc(__bufsz);
301020d003cSKyle Evans 
302020d003cSKyle Evans 	getcwd(__stack.__buf, __len);
303020d003cSKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
304020d003cSKyle Evans 
305020d003cSKyle Evans monitor:
306020d003cSKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
307020d003cSKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
308020d003cSKyle Evans 	}
309020d003cSKyle Evans 
310020d003cSKyle Evans 	if (!WIFSIGNALED(__status)) {
311020d003cSKyle Evans 		switch (WEXITSTATUS(__status)) {
312020d003cSKyle Evans 		case EX_SOFTWARE:
313020d003cSKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
314020d003cSKyle Evans 			break;
315020d003cSKyle Evans 		case EX_OSERR:
316020d003cSKyle Evans 			atf_tc_fail("setrlimit(2) failed");
317020d003cSKyle Evans 			break;
318020d003cSKyle Evans 		default:
319020d003cSKyle Evans 			atf_tc_fail("child exited with status %d",
320020d003cSKyle Evans 			    WEXITSTATUS(__status));
321020d003cSKyle Evans 		}
322020d003cSKyle Evans 	} else {
323020d003cSKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
324020d003cSKyle Evans 	}
325020d003cSKyle Evans #undef BUF
326020d003cSKyle Evans 
327020d003cSKyle Evans }
328020d003cSKyle Evans 
32909cdbf04SKyle Evans ATF_TC(getgrouplist_before_end);
ATF_TC_HEAD(getgrouplist_before_end,tc)33009cdbf04SKyle Evans ATF_TC_HEAD(getgrouplist_before_end, tc)
33109cdbf04SKyle Evans {
33209cdbf04SKyle Evans }
ATF_TC_BODY(getgrouplist_before_end,tc)333cf8e5289SKyle Evans ATF_TC_BODY(getgrouplist_before_end, tc)
334cf8e5289SKyle Evans {
335cf8e5289SKyle Evans #define BUF &__stack.__buf
336cf8e5289SKyle Evans 	struct {
337cf8e5289SKyle Evans 		uint8_t padding_l;
338cf8e5289SKyle Evans 		gid_t __buf[4];
339cf8e5289SKyle Evans 		uint8_t padding_r;
340cf8e5289SKyle Evans 	} __stack;
341cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
342cf8e5289SKyle Evans 	const size_t __len = 4 - 1;
343cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
344cf8e5289SKyle Evans 	int intlen = (int)__len;
345cf8e5289SKyle Evans 
346cf8e5289SKyle Evans 	getgrouplist("root", 0, __stack.__buf, &intlen);
347cf8e5289SKyle Evans #undef BUF
348cf8e5289SKyle Evans 
349cf8e5289SKyle Evans }
350cf8e5289SKyle Evans 
35109cdbf04SKyle Evans ATF_TC(getgrouplist_end);
ATF_TC_HEAD(getgrouplist_end,tc)35209cdbf04SKyle Evans ATF_TC_HEAD(getgrouplist_end, tc)
35309cdbf04SKyle Evans {
35409cdbf04SKyle Evans }
ATF_TC_BODY(getgrouplist_end,tc)355cf8e5289SKyle Evans ATF_TC_BODY(getgrouplist_end, tc)
356cf8e5289SKyle Evans {
357cf8e5289SKyle Evans #define BUF &__stack.__buf
358cf8e5289SKyle Evans 	struct {
359cf8e5289SKyle Evans 		uint8_t padding_l;
360cf8e5289SKyle Evans 		gid_t __buf[4];
361cf8e5289SKyle Evans 		uint8_t padding_r;
362cf8e5289SKyle Evans 	} __stack;
363cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
364cf8e5289SKyle Evans 	const size_t __len = 4;
365cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
366cf8e5289SKyle Evans 	int intlen = (int)__len;
367cf8e5289SKyle Evans 
368cf8e5289SKyle Evans 	getgrouplist("root", 0, __stack.__buf, &intlen);
369cf8e5289SKyle Evans #undef BUF
370cf8e5289SKyle Evans 
371cf8e5289SKyle Evans }
372cf8e5289SKyle Evans 
37309cdbf04SKyle Evans ATF_TC(getgrouplist_heap_before_end);
ATF_TC_HEAD(getgrouplist_heap_before_end,tc)37409cdbf04SKyle Evans ATF_TC_HEAD(getgrouplist_heap_before_end, tc)
37509cdbf04SKyle Evans {
37609cdbf04SKyle Evans }
ATF_TC_BODY(getgrouplist_heap_before_end,tc)377cf8e5289SKyle Evans ATF_TC_BODY(getgrouplist_heap_before_end, tc)
378cf8e5289SKyle Evans {
379cf8e5289SKyle Evans #define BUF __stack.__buf
380cf8e5289SKyle Evans 	struct {
381cf8e5289SKyle Evans 		uint8_t padding_l;
382cf8e5289SKyle Evans 		gid_t * __buf;
383cf8e5289SKyle Evans 		uint8_t padding_r;
384cf8e5289SKyle Evans 	} __stack;
385cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (4);
386cf8e5289SKyle Evans 	const size_t __len = 4 - 1;
387cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
388cf8e5289SKyle Evans 	int intlen = (int)__len;
389cf8e5289SKyle Evans 
390cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
391cf8e5289SKyle Evans 
392cf8e5289SKyle Evans 	getgrouplist("root", 0, __stack.__buf, &intlen);
393cf8e5289SKyle Evans #undef BUF
394cf8e5289SKyle Evans 
395cf8e5289SKyle Evans }
396cf8e5289SKyle Evans 
39709cdbf04SKyle Evans ATF_TC(getgrouplist_heap_end);
ATF_TC_HEAD(getgrouplist_heap_end,tc)39809cdbf04SKyle Evans ATF_TC_HEAD(getgrouplist_heap_end, tc)
39909cdbf04SKyle Evans {
40009cdbf04SKyle Evans }
ATF_TC_BODY(getgrouplist_heap_end,tc)401cf8e5289SKyle Evans ATF_TC_BODY(getgrouplist_heap_end, tc)
402cf8e5289SKyle Evans {
403cf8e5289SKyle Evans #define BUF __stack.__buf
404cf8e5289SKyle Evans 	struct {
405cf8e5289SKyle Evans 		uint8_t padding_l;
406cf8e5289SKyle Evans 		gid_t * __buf;
407cf8e5289SKyle Evans 		uint8_t padding_r;
408cf8e5289SKyle Evans 	} __stack;
409cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (4);
410cf8e5289SKyle Evans 	const size_t __len = 4;
411cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
412cf8e5289SKyle Evans 	int intlen = (int)__len;
413cf8e5289SKyle Evans 
414cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
415cf8e5289SKyle Evans 
416cf8e5289SKyle Evans 	getgrouplist("root", 0, __stack.__buf, &intlen);
417cf8e5289SKyle Evans #undef BUF
418cf8e5289SKyle Evans 
419cf8e5289SKyle Evans }
420cf8e5289SKyle Evans 
42109cdbf04SKyle Evans ATF_TC(getgrouplist_heap_after_end);
ATF_TC_HEAD(getgrouplist_heap_after_end,tc)42209cdbf04SKyle Evans ATF_TC_HEAD(getgrouplist_heap_after_end, tc)
42309cdbf04SKyle Evans {
42409cdbf04SKyle Evans }
ATF_TC_BODY(getgrouplist_heap_after_end,tc)425cf8e5289SKyle Evans ATF_TC_BODY(getgrouplist_heap_after_end, tc)
426cf8e5289SKyle Evans {
427cf8e5289SKyle Evans #define BUF __stack.__buf
428cf8e5289SKyle Evans 	struct {
429cf8e5289SKyle Evans 		uint8_t padding_l;
430cf8e5289SKyle Evans 		gid_t * __buf;
431cf8e5289SKyle Evans 		uint8_t padding_r;
432cf8e5289SKyle Evans 	} __stack;
433cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (4);
434cf8e5289SKyle Evans 	const size_t __len = 4 + 1;
435cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
436cf8e5289SKyle Evans 	pid_t __child;
437cf8e5289SKyle Evans 	int __status;
438cf8e5289SKyle Evans 	int intlen = (int)__len;
439cf8e5289SKyle Evans 
440cf8e5289SKyle Evans 	__child = fork();
441cf8e5289SKyle Evans 	ATF_REQUIRE(__child >= 0);
442cf8e5289SKyle Evans 	if (__child > 0)
443cf8e5289SKyle Evans 		goto monitor;
444cf8e5289SKyle Evans 
445cf8e5289SKyle Evans 	/* Child */
446cf8e5289SKyle Evans 	disable_coredumps();
447cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
448cf8e5289SKyle Evans 
449cf8e5289SKyle Evans 	getgrouplist("root", 0, __stack.__buf, &intlen);
450cf8e5289SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
451cf8e5289SKyle Evans 
452cf8e5289SKyle Evans monitor:
453cf8e5289SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
454cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
455cf8e5289SKyle Evans 	}
456cf8e5289SKyle Evans 
457cf8e5289SKyle Evans 	if (!WIFSIGNALED(__status)) {
458cf8e5289SKyle Evans 		switch (WEXITSTATUS(__status)) {
459cf8e5289SKyle Evans 		case EX_SOFTWARE:
460cf8e5289SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
461cf8e5289SKyle Evans 			break;
462cf8e5289SKyle Evans 		case EX_OSERR:
463cf8e5289SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
464cf8e5289SKyle Evans 			break;
465cf8e5289SKyle Evans 		default:
466cf8e5289SKyle Evans 			atf_tc_fail("child exited with status %d",
467cf8e5289SKyle Evans 			    WEXITSTATUS(__status));
468cf8e5289SKyle Evans 		}
469cf8e5289SKyle Evans 	} else {
470cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
471cf8e5289SKyle Evans 	}
472cf8e5289SKyle Evans #undef BUF
473cf8e5289SKyle Evans 
474cf8e5289SKyle Evans }
475cf8e5289SKyle Evans 
47609cdbf04SKyle Evans ATF_TC(getgroups_before_end);
ATF_TC_HEAD(getgroups_before_end,tc)47709cdbf04SKyle Evans ATF_TC_HEAD(getgroups_before_end, tc)
47809cdbf04SKyle Evans {
47909cdbf04SKyle Evans }
ATF_TC_BODY(getgroups_before_end,tc)480cf8e5289SKyle Evans ATF_TC_BODY(getgroups_before_end, tc)
481cf8e5289SKyle Evans {
482cf8e5289SKyle Evans #define BUF &__stack.__buf
483cf8e5289SKyle Evans 	struct {
484cf8e5289SKyle Evans 		uint8_t padding_l;
485cf8e5289SKyle Evans 		gid_t __buf[4];
486cf8e5289SKyle Evans 		uint8_t padding_r;
487cf8e5289SKyle Evans 	} __stack;
488cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
489cf8e5289SKyle Evans 	const size_t __len = 4 - 1;
490cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
491cf8e5289SKyle Evans 
492cf8e5289SKyle Evans 	getgroups(__len, __stack.__buf);
493cf8e5289SKyle Evans #undef BUF
494cf8e5289SKyle Evans 
495cf8e5289SKyle Evans }
496cf8e5289SKyle Evans 
49709cdbf04SKyle Evans ATF_TC(getgroups_end);
ATF_TC_HEAD(getgroups_end,tc)49809cdbf04SKyle Evans ATF_TC_HEAD(getgroups_end, tc)
49909cdbf04SKyle Evans {
50009cdbf04SKyle Evans }
ATF_TC_BODY(getgroups_end,tc)501cf8e5289SKyle Evans ATF_TC_BODY(getgroups_end, tc)
502cf8e5289SKyle Evans {
503cf8e5289SKyle Evans #define BUF &__stack.__buf
504cf8e5289SKyle Evans 	struct {
505cf8e5289SKyle Evans 		uint8_t padding_l;
506cf8e5289SKyle Evans 		gid_t __buf[4];
507cf8e5289SKyle Evans 		uint8_t padding_r;
508cf8e5289SKyle Evans 	} __stack;
509cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
510cf8e5289SKyle Evans 	const size_t __len = 4;
511cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
512cf8e5289SKyle Evans 
513cf8e5289SKyle Evans 	getgroups(__len, __stack.__buf);
514cf8e5289SKyle Evans #undef BUF
515cf8e5289SKyle Evans 
516cf8e5289SKyle Evans }
517cf8e5289SKyle Evans 
51809cdbf04SKyle Evans ATF_TC(getgroups_heap_before_end);
ATF_TC_HEAD(getgroups_heap_before_end,tc)51909cdbf04SKyle Evans ATF_TC_HEAD(getgroups_heap_before_end, tc)
52009cdbf04SKyle Evans {
52109cdbf04SKyle Evans }
ATF_TC_BODY(getgroups_heap_before_end,tc)522cf8e5289SKyle Evans ATF_TC_BODY(getgroups_heap_before_end, tc)
523cf8e5289SKyle Evans {
524cf8e5289SKyle Evans #define BUF __stack.__buf
525cf8e5289SKyle Evans 	struct {
526cf8e5289SKyle Evans 		uint8_t padding_l;
527cf8e5289SKyle Evans 		gid_t * __buf;
528cf8e5289SKyle Evans 		uint8_t padding_r;
529cf8e5289SKyle Evans 	} __stack;
530cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (4);
531cf8e5289SKyle Evans 	const size_t __len = 4 - 1;
532cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
533cf8e5289SKyle Evans 
534cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
535cf8e5289SKyle Evans 
536cf8e5289SKyle Evans 	getgroups(__len, __stack.__buf);
537cf8e5289SKyle Evans #undef BUF
538cf8e5289SKyle Evans 
539cf8e5289SKyle Evans }
540cf8e5289SKyle Evans 
54109cdbf04SKyle Evans ATF_TC(getgroups_heap_end);
ATF_TC_HEAD(getgroups_heap_end,tc)54209cdbf04SKyle Evans ATF_TC_HEAD(getgroups_heap_end, tc)
54309cdbf04SKyle Evans {
54409cdbf04SKyle Evans }
ATF_TC_BODY(getgroups_heap_end,tc)545cf8e5289SKyle Evans ATF_TC_BODY(getgroups_heap_end, tc)
546cf8e5289SKyle Evans {
547cf8e5289SKyle Evans #define BUF __stack.__buf
548cf8e5289SKyle Evans 	struct {
549cf8e5289SKyle Evans 		uint8_t padding_l;
550cf8e5289SKyle Evans 		gid_t * __buf;
551cf8e5289SKyle Evans 		uint8_t padding_r;
552cf8e5289SKyle Evans 	} __stack;
553cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (4);
554cf8e5289SKyle Evans 	const size_t __len = 4;
555cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
556cf8e5289SKyle Evans 
557cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
558cf8e5289SKyle Evans 
559cf8e5289SKyle Evans 	getgroups(__len, __stack.__buf);
560cf8e5289SKyle Evans #undef BUF
561cf8e5289SKyle Evans 
562cf8e5289SKyle Evans }
563cf8e5289SKyle Evans 
56409cdbf04SKyle Evans ATF_TC(getgroups_heap_after_end);
ATF_TC_HEAD(getgroups_heap_after_end,tc)56509cdbf04SKyle Evans ATF_TC_HEAD(getgroups_heap_after_end, tc)
56609cdbf04SKyle Evans {
56709cdbf04SKyle Evans }
ATF_TC_BODY(getgroups_heap_after_end,tc)568cf8e5289SKyle Evans ATF_TC_BODY(getgroups_heap_after_end, tc)
569cf8e5289SKyle Evans {
570cf8e5289SKyle Evans #define BUF __stack.__buf
571cf8e5289SKyle Evans 	struct {
572cf8e5289SKyle Evans 		uint8_t padding_l;
573cf8e5289SKyle Evans 		gid_t * __buf;
574cf8e5289SKyle Evans 		uint8_t padding_r;
575cf8e5289SKyle Evans 	} __stack;
576cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (4);
577cf8e5289SKyle Evans 	const size_t __len = 4 + 1;
578cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
579cf8e5289SKyle Evans 	pid_t __child;
580cf8e5289SKyle Evans 	int __status;
581cf8e5289SKyle Evans 
582cf8e5289SKyle Evans 	__child = fork();
583cf8e5289SKyle Evans 	ATF_REQUIRE(__child >= 0);
584cf8e5289SKyle Evans 	if (__child > 0)
585cf8e5289SKyle Evans 		goto monitor;
586cf8e5289SKyle Evans 
587cf8e5289SKyle Evans 	/* Child */
588cf8e5289SKyle Evans 	disable_coredumps();
589cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
590cf8e5289SKyle Evans 
591cf8e5289SKyle Evans 	getgroups(__len, __stack.__buf);
592cf8e5289SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
593cf8e5289SKyle Evans 
594cf8e5289SKyle Evans monitor:
595cf8e5289SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
596cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
597cf8e5289SKyle Evans 	}
598cf8e5289SKyle Evans 
599cf8e5289SKyle Evans 	if (!WIFSIGNALED(__status)) {
600cf8e5289SKyle Evans 		switch (WEXITSTATUS(__status)) {
601cf8e5289SKyle Evans 		case EX_SOFTWARE:
602cf8e5289SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
603cf8e5289SKyle Evans 			break;
604cf8e5289SKyle Evans 		case EX_OSERR:
605cf8e5289SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
606cf8e5289SKyle Evans 			break;
607cf8e5289SKyle Evans 		default:
608cf8e5289SKyle Evans 			atf_tc_fail("child exited with status %d",
609cf8e5289SKyle Evans 			    WEXITSTATUS(__status));
610cf8e5289SKyle Evans 		}
611cf8e5289SKyle Evans 	} else {
612cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
613cf8e5289SKyle Evans 	}
614cf8e5289SKyle Evans #undef BUF
615cf8e5289SKyle Evans 
616cf8e5289SKyle Evans }
617cf8e5289SKyle Evans 
61809cdbf04SKyle Evans ATF_TC(getloginclass_before_end);
ATF_TC_HEAD(getloginclass_before_end,tc)61909cdbf04SKyle Evans ATF_TC_HEAD(getloginclass_before_end, tc)
62009cdbf04SKyle Evans {
62109cdbf04SKyle Evans }
ATF_TC_BODY(getloginclass_before_end,tc)622cf8e5289SKyle Evans ATF_TC_BODY(getloginclass_before_end, tc)
623cf8e5289SKyle Evans {
624cf8e5289SKyle Evans #define BUF &__stack.__buf
625cf8e5289SKyle Evans 	struct {
626cf8e5289SKyle Evans 		uint8_t padding_l;
627cf8e5289SKyle Evans 		unsigned char __buf[42];
628cf8e5289SKyle Evans 		uint8_t padding_r;
629cf8e5289SKyle Evans 	} __stack;
630cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
631cf8e5289SKyle Evans 	const size_t __len = 42 - 1;
632cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
633cf8e5289SKyle Evans 
634cf8e5289SKyle Evans 	getloginclass(__stack.__buf, __len);
635cf8e5289SKyle Evans #undef BUF
636cf8e5289SKyle Evans 
637cf8e5289SKyle Evans }
638cf8e5289SKyle Evans 
63909cdbf04SKyle Evans ATF_TC(getloginclass_end);
ATF_TC_HEAD(getloginclass_end,tc)64009cdbf04SKyle Evans ATF_TC_HEAD(getloginclass_end, tc)
64109cdbf04SKyle Evans {
64209cdbf04SKyle Evans }
ATF_TC_BODY(getloginclass_end,tc)643cf8e5289SKyle Evans ATF_TC_BODY(getloginclass_end, tc)
644cf8e5289SKyle Evans {
645cf8e5289SKyle Evans #define BUF &__stack.__buf
646cf8e5289SKyle Evans 	struct {
647cf8e5289SKyle Evans 		uint8_t padding_l;
648cf8e5289SKyle Evans 		unsigned char __buf[42];
649cf8e5289SKyle Evans 		uint8_t padding_r;
650cf8e5289SKyle Evans 	} __stack;
651cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
652cf8e5289SKyle Evans 	const size_t __len = 42;
653cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
654cf8e5289SKyle Evans 
655cf8e5289SKyle Evans 	getloginclass(__stack.__buf, __len);
656cf8e5289SKyle Evans #undef BUF
657cf8e5289SKyle Evans 
658cf8e5289SKyle Evans }
659cf8e5289SKyle Evans 
66009cdbf04SKyle Evans ATF_TC(getloginclass_heap_before_end);
ATF_TC_HEAD(getloginclass_heap_before_end,tc)66109cdbf04SKyle Evans ATF_TC_HEAD(getloginclass_heap_before_end, tc)
66209cdbf04SKyle Evans {
66309cdbf04SKyle Evans }
ATF_TC_BODY(getloginclass_heap_before_end,tc)664cf8e5289SKyle Evans ATF_TC_BODY(getloginclass_heap_before_end, tc)
665cf8e5289SKyle Evans {
666cf8e5289SKyle Evans #define BUF __stack.__buf
667cf8e5289SKyle Evans 	struct {
668cf8e5289SKyle Evans 		uint8_t padding_l;
669cf8e5289SKyle Evans 		unsigned char * __buf;
670cf8e5289SKyle Evans 		uint8_t padding_r;
671cf8e5289SKyle Evans 	} __stack;
672cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
673cf8e5289SKyle Evans 	const size_t __len = 42 - 1;
674cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
675cf8e5289SKyle Evans 
676cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
677cf8e5289SKyle Evans 
678cf8e5289SKyle Evans 	getloginclass(__stack.__buf, __len);
679cf8e5289SKyle Evans #undef BUF
680cf8e5289SKyle Evans 
681cf8e5289SKyle Evans }
682cf8e5289SKyle Evans 
68309cdbf04SKyle Evans ATF_TC(getloginclass_heap_end);
ATF_TC_HEAD(getloginclass_heap_end,tc)68409cdbf04SKyle Evans ATF_TC_HEAD(getloginclass_heap_end, tc)
68509cdbf04SKyle Evans {
68609cdbf04SKyle Evans }
ATF_TC_BODY(getloginclass_heap_end,tc)687cf8e5289SKyle Evans ATF_TC_BODY(getloginclass_heap_end, tc)
688cf8e5289SKyle Evans {
689cf8e5289SKyle Evans #define BUF __stack.__buf
690cf8e5289SKyle Evans 	struct {
691cf8e5289SKyle Evans 		uint8_t padding_l;
692cf8e5289SKyle Evans 		unsigned char * __buf;
693cf8e5289SKyle Evans 		uint8_t padding_r;
694cf8e5289SKyle Evans 	} __stack;
695cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
696cf8e5289SKyle Evans 	const size_t __len = 42;
697cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
698cf8e5289SKyle Evans 
699cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
700cf8e5289SKyle Evans 
701cf8e5289SKyle Evans 	getloginclass(__stack.__buf, __len);
702cf8e5289SKyle Evans #undef BUF
703cf8e5289SKyle Evans 
704cf8e5289SKyle Evans }
705cf8e5289SKyle Evans 
70609cdbf04SKyle Evans ATF_TC(getloginclass_heap_after_end);
ATF_TC_HEAD(getloginclass_heap_after_end,tc)70709cdbf04SKyle Evans ATF_TC_HEAD(getloginclass_heap_after_end, tc)
70809cdbf04SKyle Evans {
70909cdbf04SKyle Evans }
ATF_TC_BODY(getloginclass_heap_after_end,tc)710cf8e5289SKyle Evans ATF_TC_BODY(getloginclass_heap_after_end, tc)
711cf8e5289SKyle Evans {
712cf8e5289SKyle Evans #define BUF __stack.__buf
713cf8e5289SKyle Evans 	struct {
714cf8e5289SKyle Evans 		uint8_t padding_l;
715cf8e5289SKyle Evans 		unsigned char * __buf;
716cf8e5289SKyle Evans 		uint8_t padding_r;
717cf8e5289SKyle Evans 	} __stack;
718cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
719cf8e5289SKyle Evans 	const size_t __len = 42 + 1;
720cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
721cf8e5289SKyle Evans 	pid_t __child;
722cf8e5289SKyle Evans 	int __status;
723cf8e5289SKyle Evans 
724cf8e5289SKyle Evans 	__child = fork();
725cf8e5289SKyle Evans 	ATF_REQUIRE(__child >= 0);
726cf8e5289SKyle Evans 	if (__child > 0)
727cf8e5289SKyle Evans 		goto monitor;
728cf8e5289SKyle Evans 
729cf8e5289SKyle Evans 	/* Child */
730cf8e5289SKyle Evans 	disable_coredumps();
731cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
732cf8e5289SKyle Evans 
733cf8e5289SKyle Evans 	getloginclass(__stack.__buf, __len);
734cf8e5289SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
735cf8e5289SKyle Evans 
736cf8e5289SKyle Evans monitor:
737cf8e5289SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
738cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
739cf8e5289SKyle Evans 	}
740cf8e5289SKyle Evans 
741cf8e5289SKyle Evans 	if (!WIFSIGNALED(__status)) {
742cf8e5289SKyle Evans 		switch (WEXITSTATUS(__status)) {
743cf8e5289SKyle Evans 		case EX_SOFTWARE:
744cf8e5289SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
745cf8e5289SKyle Evans 			break;
746cf8e5289SKyle Evans 		case EX_OSERR:
747cf8e5289SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
748cf8e5289SKyle Evans 			break;
749cf8e5289SKyle Evans 		default:
750cf8e5289SKyle Evans 			atf_tc_fail("child exited with status %d",
751cf8e5289SKyle Evans 			    WEXITSTATUS(__status));
752cf8e5289SKyle Evans 		}
753cf8e5289SKyle Evans 	} else {
754cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
755cf8e5289SKyle Evans 	}
756cf8e5289SKyle Evans #undef BUF
757cf8e5289SKyle Evans 
758cf8e5289SKyle Evans }
759cf8e5289SKyle Evans 
76009cdbf04SKyle Evans ATF_TC(pread_before_end);
ATF_TC_HEAD(pread_before_end,tc)76109cdbf04SKyle Evans ATF_TC_HEAD(pread_before_end, tc)
76209cdbf04SKyle Evans {
76309cdbf04SKyle Evans }
ATF_TC_BODY(pread_before_end,tc)764cf8e5289SKyle Evans ATF_TC_BODY(pread_before_end, tc)
765cf8e5289SKyle Evans {
766cf8e5289SKyle Evans #define BUF &__stack.__buf
767cf8e5289SKyle Evans 	struct {
768cf8e5289SKyle Evans 		uint8_t padding_l;
769cf8e5289SKyle Evans 		unsigned char __buf[41];
770cf8e5289SKyle Evans 		uint8_t padding_r;
771cf8e5289SKyle Evans 	} __stack;
772cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
773cf8e5289SKyle Evans 	const size_t __len = 41 - 1;
774cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
775cf8e5289SKyle Evans 	int fd;
776cf8e5289SKyle Evans 
777cf8e5289SKyle Evans 	fd = new_tmpfile();	/* Cannot fail */
778cf8e5289SKyle Evans 
779cf8e5289SKyle Evans 	pread(fd, __stack.__buf, __len, 0);
780cf8e5289SKyle Evans #undef BUF
781cf8e5289SKyle Evans 
782cf8e5289SKyle Evans }
783cf8e5289SKyle Evans 
78409cdbf04SKyle Evans ATF_TC(pread_end);
ATF_TC_HEAD(pread_end,tc)78509cdbf04SKyle Evans ATF_TC_HEAD(pread_end, tc)
78609cdbf04SKyle Evans {
78709cdbf04SKyle Evans }
ATF_TC_BODY(pread_end,tc)788cf8e5289SKyle Evans ATF_TC_BODY(pread_end, tc)
789cf8e5289SKyle Evans {
790cf8e5289SKyle Evans #define BUF &__stack.__buf
791cf8e5289SKyle Evans 	struct {
792cf8e5289SKyle Evans 		uint8_t padding_l;
793cf8e5289SKyle Evans 		unsigned char __buf[41];
794cf8e5289SKyle Evans 		uint8_t padding_r;
795cf8e5289SKyle Evans 	} __stack;
796cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
797cf8e5289SKyle Evans 	const size_t __len = 41;
798cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
799cf8e5289SKyle Evans 	int fd;
800cf8e5289SKyle Evans 
801cf8e5289SKyle Evans 	fd = new_tmpfile();	/* Cannot fail */
802cf8e5289SKyle Evans 
803cf8e5289SKyle Evans 	pread(fd, __stack.__buf, __len, 0);
804cf8e5289SKyle Evans #undef BUF
805cf8e5289SKyle Evans 
806cf8e5289SKyle Evans }
807cf8e5289SKyle Evans 
80809cdbf04SKyle Evans ATF_TC(pread_heap_before_end);
ATF_TC_HEAD(pread_heap_before_end,tc)80909cdbf04SKyle Evans ATF_TC_HEAD(pread_heap_before_end, tc)
81009cdbf04SKyle Evans {
81109cdbf04SKyle Evans }
ATF_TC_BODY(pread_heap_before_end,tc)812cf8e5289SKyle Evans ATF_TC_BODY(pread_heap_before_end, tc)
813cf8e5289SKyle Evans {
814cf8e5289SKyle Evans #define BUF __stack.__buf
815cf8e5289SKyle Evans 	struct {
816cf8e5289SKyle Evans 		uint8_t padding_l;
817cf8e5289SKyle Evans 		unsigned char * __buf;
818cf8e5289SKyle Evans 		uint8_t padding_r;
819cf8e5289SKyle Evans 	} __stack;
820cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (41);
821cf8e5289SKyle Evans 	const size_t __len = 41 - 1;
822cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
823cf8e5289SKyle Evans 	int fd;
824cf8e5289SKyle Evans 
825cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
826cf8e5289SKyle Evans 	fd = new_tmpfile();	/* Cannot fail */
827cf8e5289SKyle Evans 
828cf8e5289SKyle Evans 	pread(fd, __stack.__buf, __len, 0);
829cf8e5289SKyle Evans #undef BUF
830cf8e5289SKyle Evans 
831cf8e5289SKyle Evans }
832cf8e5289SKyle Evans 
83309cdbf04SKyle Evans ATF_TC(pread_heap_end);
ATF_TC_HEAD(pread_heap_end,tc)83409cdbf04SKyle Evans ATF_TC_HEAD(pread_heap_end, tc)
83509cdbf04SKyle Evans {
83609cdbf04SKyle Evans }
ATF_TC_BODY(pread_heap_end,tc)837cf8e5289SKyle Evans ATF_TC_BODY(pread_heap_end, tc)
838cf8e5289SKyle Evans {
839cf8e5289SKyle Evans #define BUF __stack.__buf
840cf8e5289SKyle Evans 	struct {
841cf8e5289SKyle Evans 		uint8_t padding_l;
842cf8e5289SKyle Evans 		unsigned char * __buf;
843cf8e5289SKyle Evans 		uint8_t padding_r;
844cf8e5289SKyle Evans 	} __stack;
845cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (41);
846cf8e5289SKyle Evans 	const size_t __len = 41;
847cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
848cf8e5289SKyle Evans 	int fd;
849cf8e5289SKyle Evans 
850cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
851cf8e5289SKyle Evans 	fd = new_tmpfile();	/* Cannot fail */
852cf8e5289SKyle Evans 
853cf8e5289SKyle Evans 	pread(fd, __stack.__buf, __len, 0);
854cf8e5289SKyle Evans #undef BUF
855cf8e5289SKyle Evans 
856cf8e5289SKyle Evans }
857cf8e5289SKyle Evans 
85809cdbf04SKyle Evans ATF_TC(pread_heap_after_end);
ATF_TC_HEAD(pread_heap_after_end,tc)85909cdbf04SKyle Evans ATF_TC_HEAD(pread_heap_after_end, tc)
86009cdbf04SKyle Evans {
86109cdbf04SKyle Evans }
ATF_TC_BODY(pread_heap_after_end,tc)862cf8e5289SKyle Evans ATF_TC_BODY(pread_heap_after_end, tc)
863cf8e5289SKyle Evans {
864cf8e5289SKyle Evans #define BUF __stack.__buf
865cf8e5289SKyle Evans 	struct {
866cf8e5289SKyle Evans 		uint8_t padding_l;
867cf8e5289SKyle Evans 		unsigned char * __buf;
868cf8e5289SKyle Evans 		uint8_t padding_r;
869cf8e5289SKyle Evans 	} __stack;
870cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (41);
871cf8e5289SKyle Evans 	const size_t __len = 41 + 1;
872cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
873cf8e5289SKyle Evans 	pid_t __child;
874cf8e5289SKyle Evans 	int __status;
875cf8e5289SKyle Evans 	int fd;
876cf8e5289SKyle Evans 
877cf8e5289SKyle Evans 	__child = fork();
878cf8e5289SKyle Evans 	ATF_REQUIRE(__child >= 0);
879cf8e5289SKyle Evans 	if (__child > 0)
880cf8e5289SKyle Evans 		goto monitor;
881cf8e5289SKyle Evans 
882cf8e5289SKyle Evans 	/* Child */
883cf8e5289SKyle Evans 	disable_coredumps();
884cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
885cf8e5289SKyle Evans 	fd = new_tmpfile();	/* Cannot fail */
886cf8e5289SKyle Evans 
887cf8e5289SKyle Evans 	pread(fd, __stack.__buf, __len, 0);
888cf8e5289SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
889cf8e5289SKyle Evans 
890cf8e5289SKyle Evans monitor:
891cf8e5289SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
892cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
893cf8e5289SKyle Evans 	}
894cf8e5289SKyle Evans 
895cf8e5289SKyle Evans 	if (!WIFSIGNALED(__status)) {
896cf8e5289SKyle Evans 		switch (WEXITSTATUS(__status)) {
897cf8e5289SKyle Evans 		case EX_SOFTWARE:
898cf8e5289SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
899cf8e5289SKyle Evans 			break;
900cf8e5289SKyle Evans 		case EX_OSERR:
901cf8e5289SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
902cf8e5289SKyle Evans 			break;
903cf8e5289SKyle Evans 		default:
904cf8e5289SKyle Evans 			atf_tc_fail("child exited with status %d",
905cf8e5289SKyle Evans 			    WEXITSTATUS(__status));
906cf8e5289SKyle Evans 		}
907cf8e5289SKyle Evans 	} else {
908cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
909cf8e5289SKyle Evans 	}
910cf8e5289SKyle Evans #undef BUF
911cf8e5289SKyle Evans 
912cf8e5289SKyle Evans }
913cf8e5289SKyle Evans 
91409cdbf04SKyle Evans ATF_TC(read_before_end);
ATF_TC_HEAD(read_before_end,tc)91509cdbf04SKyle Evans ATF_TC_HEAD(read_before_end, tc)
91609cdbf04SKyle Evans {
91709cdbf04SKyle Evans }
ATF_TC_BODY(read_before_end,tc)918020d003cSKyle Evans ATF_TC_BODY(read_before_end, tc)
919020d003cSKyle Evans {
920020d003cSKyle Evans #define BUF &__stack.__buf
921020d003cSKyle Evans 	struct {
922020d003cSKyle Evans 		uint8_t padding_l;
923020d003cSKyle Evans 		unsigned char __buf[41];
924020d003cSKyle Evans 		uint8_t padding_r;
925020d003cSKyle Evans 	} __stack;
926020d003cSKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
927020d003cSKyle Evans 	const size_t __len = 41 - 1;
928020d003cSKyle Evans 	const size_t __idx __unused = __len - 1;
929020d003cSKyle Evans 	int fd;
930020d003cSKyle Evans 
931020d003cSKyle Evans 	fd = new_tmpfile();	/* Cannot fail */
932020d003cSKyle Evans 
933020d003cSKyle Evans 	read(fd, __stack.__buf, __len);
934020d003cSKyle Evans #undef BUF
935020d003cSKyle Evans 
936020d003cSKyle Evans }
937020d003cSKyle Evans 
93809cdbf04SKyle Evans ATF_TC(read_end);
ATF_TC_HEAD(read_end,tc)93909cdbf04SKyle Evans ATF_TC_HEAD(read_end, tc)
94009cdbf04SKyle Evans {
94109cdbf04SKyle Evans }
ATF_TC_BODY(read_end,tc)942020d003cSKyle Evans ATF_TC_BODY(read_end, tc)
943020d003cSKyle Evans {
944020d003cSKyle Evans #define BUF &__stack.__buf
945020d003cSKyle Evans 	struct {
946020d003cSKyle Evans 		uint8_t padding_l;
947020d003cSKyle Evans 		unsigned char __buf[41];
948020d003cSKyle Evans 		uint8_t padding_r;
949020d003cSKyle Evans 	} __stack;
950020d003cSKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
951020d003cSKyle Evans 	const size_t __len = 41;
952020d003cSKyle Evans 	const size_t __idx __unused = __len - 1;
953020d003cSKyle Evans 	int fd;
954020d003cSKyle Evans 
955020d003cSKyle Evans 	fd = new_tmpfile();	/* Cannot fail */
956020d003cSKyle Evans 
957020d003cSKyle Evans 	read(fd, __stack.__buf, __len);
958020d003cSKyle Evans #undef BUF
959020d003cSKyle Evans 
960020d003cSKyle Evans }
961020d003cSKyle Evans 
96209cdbf04SKyle Evans ATF_TC(read_heap_before_end);
ATF_TC_HEAD(read_heap_before_end,tc)96309cdbf04SKyle Evans ATF_TC_HEAD(read_heap_before_end, tc)
96409cdbf04SKyle Evans {
96509cdbf04SKyle Evans }
ATF_TC_BODY(read_heap_before_end,tc)966020d003cSKyle Evans ATF_TC_BODY(read_heap_before_end, tc)
967020d003cSKyle Evans {
968020d003cSKyle Evans #define BUF __stack.__buf
969020d003cSKyle Evans 	struct {
970020d003cSKyle Evans 		uint8_t padding_l;
971020d003cSKyle Evans 		unsigned char * __buf;
972020d003cSKyle Evans 		uint8_t padding_r;
973020d003cSKyle Evans 	} __stack;
974020d003cSKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (41);
975020d003cSKyle Evans 	const size_t __len = 41 - 1;
976020d003cSKyle Evans 	const size_t __idx __unused = __len - 1;
977020d003cSKyle Evans 	int fd;
978020d003cSKyle Evans 
979020d003cSKyle Evans 	__stack.__buf = malloc(__bufsz);
980020d003cSKyle Evans 	fd = new_tmpfile();	/* Cannot fail */
981020d003cSKyle Evans 
982020d003cSKyle Evans 	read(fd, __stack.__buf, __len);
983020d003cSKyle Evans #undef BUF
984020d003cSKyle Evans 
985020d003cSKyle Evans }
986020d003cSKyle Evans 
98709cdbf04SKyle Evans ATF_TC(read_heap_end);
ATF_TC_HEAD(read_heap_end,tc)98809cdbf04SKyle Evans ATF_TC_HEAD(read_heap_end, tc)
98909cdbf04SKyle Evans {
99009cdbf04SKyle Evans }
ATF_TC_BODY(read_heap_end,tc)991020d003cSKyle Evans ATF_TC_BODY(read_heap_end, tc)
992020d003cSKyle Evans {
993020d003cSKyle Evans #define BUF __stack.__buf
994020d003cSKyle Evans 	struct {
995020d003cSKyle Evans 		uint8_t padding_l;
996020d003cSKyle Evans 		unsigned char * __buf;
997020d003cSKyle Evans 		uint8_t padding_r;
998020d003cSKyle Evans 	} __stack;
999020d003cSKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (41);
1000020d003cSKyle Evans 	const size_t __len = 41;
1001020d003cSKyle Evans 	const size_t __idx __unused = __len - 1;
1002020d003cSKyle Evans 	int fd;
1003020d003cSKyle Evans 
1004020d003cSKyle Evans 	__stack.__buf = malloc(__bufsz);
1005020d003cSKyle Evans 	fd = new_tmpfile();	/* Cannot fail */
1006020d003cSKyle Evans 
1007020d003cSKyle Evans 	read(fd, __stack.__buf, __len);
1008020d003cSKyle Evans #undef BUF
1009020d003cSKyle Evans 
1010020d003cSKyle Evans }
1011020d003cSKyle Evans 
101209cdbf04SKyle Evans ATF_TC(read_heap_after_end);
ATF_TC_HEAD(read_heap_after_end,tc)101309cdbf04SKyle Evans ATF_TC_HEAD(read_heap_after_end, tc)
101409cdbf04SKyle Evans {
101509cdbf04SKyle Evans }
ATF_TC_BODY(read_heap_after_end,tc)1016020d003cSKyle Evans ATF_TC_BODY(read_heap_after_end, tc)
1017020d003cSKyle Evans {
1018020d003cSKyle Evans #define BUF __stack.__buf
1019020d003cSKyle Evans 	struct {
1020020d003cSKyle Evans 		uint8_t padding_l;
1021020d003cSKyle Evans 		unsigned char * __buf;
1022020d003cSKyle Evans 		uint8_t padding_r;
1023020d003cSKyle Evans 	} __stack;
1024020d003cSKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (41);
1025020d003cSKyle Evans 	const size_t __len = 41 + 1;
1026020d003cSKyle Evans 	const size_t __idx __unused = __len - 1;
1027020d003cSKyle Evans 	pid_t __child;
1028020d003cSKyle Evans 	int __status;
1029020d003cSKyle Evans 	int fd;
1030020d003cSKyle Evans 
1031020d003cSKyle Evans 	__child = fork();
1032020d003cSKyle Evans 	ATF_REQUIRE(__child >= 0);
1033020d003cSKyle Evans 	if (__child > 0)
1034020d003cSKyle Evans 		goto monitor;
1035020d003cSKyle Evans 
1036020d003cSKyle Evans 	/* Child */
1037020d003cSKyle Evans 	disable_coredumps();
1038020d003cSKyle Evans 	__stack.__buf = malloc(__bufsz);
1039020d003cSKyle Evans 	fd = new_tmpfile();	/* Cannot fail */
1040020d003cSKyle Evans 
1041020d003cSKyle Evans 	read(fd, __stack.__buf, __len);
1042020d003cSKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
1043020d003cSKyle Evans 
1044020d003cSKyle Evans monitor:
1045020d003cSKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
1046020d003cSKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
1047020d003cSKyle Evans 	}
1048020d003cSKyle Evans 
1049020d003cSKyle Evans 	if (!WIFSIGNALED(__status)) {
1050020d003cSKyle Evans 		switch (WEXITSTATUS(__status)) {
1051020d003cSKyle Evans 		case EX_SOFTWARE:
1052020d003cSKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
1053020d003cSKyle Evans 			break;
1054020d003cSKyle Evans 		case EX_OSERR:
1055020d003cSKyle Evans 			atf_tc_fail("setrlimit(2) failed");
1056020d003cSKyle Evans 			break;
1057020d003cSKyle Evans 		default:
1058020d003cSKyle Evans 			atf_tc_fail("child exited with status %d",
1059020d003cSKyle Evans 			    WEXITSTATUS(__status));
1060020d003cSKyle Evans 		}
1061020d003cSKyle Evans 	} else {
1062020d003cSKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
1063020d003cSKyle Evans 	}
1064020d003cSKyle Evans #undef BUF
1065020d003cSKyle Evans 
1066020d003cSKyle Evans }
1067020d003cSKyle Evans 
106809cdbf04SKyle Evans ATF_TC(readlink_before_end);
ATF_TC_HEAD(readlink_before_end,tc)106909cdbf04SKyle Evans ATF_TC_HEAD(readlink_before_end, tc)
107009cdbf04SKyle Evans {
107109cdbf04SKyle Evans }
ATF_TC_BODY(readlink_before_end,tc)1072020d003cSKyle Evans ATF_TC_BODY(readlink_before_end, tc)
1073020d003cSKyle Evans {
1074020d003cSKyle Evans #define BUF &__stack.__buf
1075020d003cSKyle Evans 	struct {
1076020d003cSKyle Evans 		uint8_t padding_l;
1077020d003cSKyle Evans 		unsigned char __buf[42];
1078020d003cSKyle Evans 		uint8_t padding_r;
1079020d003cSKyle Evans 	} __stack;
1080020d003cSKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
1081020d003cSKyle Evans 	const size_t __len = 42 - 1;
1082020d003cSKyle Evans 	const size_t __idx __unused = __len - 1;
1083020d003cSKyle Evans 	const char *path;
1084020d003cSKyle Evans 
1085020d003cSKyle Evans 	path = new_symlink(__len);		/* Cannot fail */
1086020d003cSKyle Evans 
1087020d003cSKyle Evans 	readlink(path, __stack.__buf, __len);
1088020d003cSKyle Evans #undef BUF
1089020d003cSKyle Evans 
1090020d003cSKyle Evans }
1091020d003cSKyle Evans 
109209cdbf04SKyle Evans ATF_TC(readlink_end);
ATF_TC_HEAD(readlink_end,tc)109309cdbf04SKyle Evans ATF_TC_HEAD(readlink_end, tc)
109409cdbf04SKyle Evans {
109509cdbf04SKyle Evans }
ATF_TC_BODY(readlink_end,tc)1096020d003cSKyle Evans ATF_TC_BODY(readlink_end, tc)
1097020d003cSKyle Evans {
1098020d003cSKyle Evans #define BUF &__stack.__buf
1099020d003cSKyle Evans 	struct {
1100020d003cSKyle Evans 		uint8_t padding_l;
1101020d003cSKyle Evans 		unsigned char __buf[42];
1102020d003cSKyle Evans 		uint8_t padding_r;
1103020d003cSKyle Evans 	} __stack;
1104020d003cSKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
1105020d003cSKyle Evans 	const size_t __len = 42;
1106020d003cSKyle Evans 	const size_t __idx __unused = __len - 1;
1107020d003cSKyle Evans 	const char *path;
1108020d003cSKyle Evans 
1109020d003cSKyle Evans 	path = new_symlink(__len);		/* Cannot fail */
1110020d003cSKyle Evans 
1111020d003cSKyle Evans 	readlink(path, __stack.__buf, __len);
1112020d003cSKyle Evans #undef BUF
1113020d003cSKyle Evans 
1114020d003cSKyle Evans }
1115020d003cSKyle Evans 
111609cdbf04SKyle Evans ATF_TC(readlink_heap_before_end);
ATF_TC_HEAD(readlink_heap_before_end,tc)111709cdbf04SKyle Evans ATF_TC_HEAD(readlink_heap_before_end, tc)
111809cdbf04SKyle Evans {
111909cdbf04SKyle Evans }
ATF_TC_BODY(readlink_heap_before_end,tc)1120020d003cSKyle Evans ATF_TC_BODY(readlink_heap_before_end, tc)
1121020d003cSKyle Evans {
1122020d003cSKyle Evans #define BUF __stack.__buf
1123020d003cSKyle Evans 	struct {
1124020d003cSKyle Evans 		uint8_t padding_l;
1125020d003cSKyle Evans 		unsigned char * __buf;
1126020d003cSKyle Evans 		uint8_t padding_r;
1127020d003cSKyle Evans 	} __stack;
1128020d003cSKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1129020d003cSKyle Evans 	const size_t __len = 42 - 1;
1130020d003cSKyle Evans 	const size_t __idx __unused = __len - 1;
1131020d003cSKyle Evans 	const char *path;
1132020d003cSKyle Evans 
1133020d003cSKyle Evans 	__stack.__buf = malloc(__bufsz);
1134020d003cSKyle Evans 	path = new_symlink(__len);		/* Cannot fail */
1135020d003cSKyle Evans 
1136020d003cSKyle Evans 	readlink(path, __stack.__buf, __len);
1137020d003cSKyle Evans #undef BUF
1138020d003cSKyle Evans 
1139020d003cSKyle Evans }
1140020d003cSKyle Evans 
114109cdbf04SKyle Evans ATF_TC(readlink_heap_end);
ATF_TC_HEAD(readlink_heap_end,tc)114209cdbf04SKyle Evans ATF_TC_HEAD(readlink_heap_end, tc)
114309cdbf04SKyle Evans {
114409cdbf04SKyle Evans }
ATF_TC_BODY(readlink_heap_end,tc)1145020d003cSKyle Evans ATF_TC_BODY(readlink_heap_end, tc)
1146020d003cSKyle Evans {
1147020d003cSKyle Evans #define BUF __stack.__buf
1148020d003cSKyle Evans 	struct {
1149020d003cSKyle Evans 		uint8_t padding_l;
1150020d003cSKyle Evans 		unsigned char * __buf;
1151020d003cSKyle Evans 		uint8_t padding_r;
1152020d003cSKyle Evans 	} __stack;
1153020d003cSKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1154020d003cSKyle Evans 	const size_t __len = 42;
1155020d003cSKyle Evans 	const size_t __idx __unused = __len - 1;
1156020d003cSKyle Evans 	const char *path;
1157020d003cSKyle Evans 
1158020d003cSKyle Evans 	__stack.__buf = malloc(__bufsz);
1159020d003cSKyle Evans 	path = new_symlink(__len);		/* Cannot fail */
1160020d003cSKyle Evans 
1161020d003cSKyle Evans 	readlink(path, __stack.__buf, __len);
1162020d003cSKyle Evans #undef BUF
1163020d003cSKyle Evans 
1164020d003cSKyle Evans }
1165020d003cSKyle Evans 
116609cdbf04SKyle Evans ATF_TC(readlink_heap_after_end);
ATF_TC_HEAD(readlink_heap_after_end,tc)116709cdbf04SKyle Evans ATF_TC_HEAD(readlink_heap_after_end, tc)
116809cdbf04SKyle Evans {
116909cdbf04SKyle Evans }
ATF_TC_BODY(readlink_heap_after_end,tc)1170020d003cSKyle Evans ATF_TC_BODY(readlink_heap_after_end, tc)
1171020d003cSKyle Evans {
1172020d003cSKyle Evans #define BUF __stack.__buf
1173020d003cSKyle Evans 	struct {
1174020d003cSKyle Evans 		uint8_t padding_l;
1175020d003cSKyle Evans 		unsigned char * __buf;
1176020d003cSKyle Evans 		uint8_t padding_r;
1177020d003cSKyle Evans 	} __stack;
1178020d003cSKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1179020d003cSKyle Evans 	const size_t __len = 42 + 1;
1180020d003cSKyle Evans 	const size_t __idx __unused = __len - 1;
1181020d003cSKyle Evans 	pid_t __child;
1182020d003cSKyle Evans 	int __status;
1183020d003cSKyle Evans 	const char *path;
1184020d003cSKyle Evans 
1185020d003cSKyle Evans 	__child = fork();
1186020d003cSKyle Evans 	ATF_REQUIRE(__child >= 0);
1187020d003cSKyle Evans 	if (__child > 0)
1188020d003cSKyle Evans 		goto monitor;
1189020d003cSKyle Evans 
1190020d003cSKyle Evans 	/* Child */
1191020d003cSKyle Evans 	disable_coredumps();
1192020d003cSKyle Evans 	__stack.__buf = malloc(__bufsz);
1193020d003cSKyle Evans 	path = new_symlink(__len);		/* Cannot fail */
1194020d003cSKyle Evans 
1195020d003cSKyle Evans 	readlink(path, __stack.__buf, __len);
1196020d003cSKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
1197020d003cSKyle Evans 
1198020d003cSKyle Evans monitor:
1199020d003cSKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
1200020d003cSKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
1201020d003cSKyle Evans 	}
1202020d003cSKyle Evans 
1203020d003cSKyle Evans 	if (!WIFSIGNALED(__status)) {
1204020d003cSKyle Evans 		switch (WEXITSTATUS(__status)) {
1205020d003cSKyle Evans 		case EX_SOFTWARE:
1206020d003cSKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
1207020d003cSKyle Evans 			break;
1208020d003cSKyle Evans 		case EX_OSERR:
1209020d003cSKyle Evans 			atf_tc_fail("setrlimit(2) failed");
1210020d003cSKyle Evans 			break;
1211020d003cSKyle Evans 		default:
1212020d003cSKyle Evans 			atf_tc_fail("child exited with status %d",
1213020d003cSKyle Evans 			    WEXITSTATUS(__status));
1214020d003cSKyle Evans 		}
1215020d003cSKyle Evans 	} else {
1216020d003cSKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
1217020d003cSKyle Evans 	}
1218020d003cSKyle Evans #undef BUF
1219020d003cSKyle Evans 
1220020d003cSKyle Evans }
1221020d003cSKyle Evans 
122209cdbf04SKyle Evans ATF_TC(readlinkat_before_end);
ATF_TC_HEAD(readlinkat_before_end,tc)122309cdbf04SKyle Evans ATF_TC_HEAD(readlinkat_before_end, tc)
122409cdbf04SKyle Evans {
122509cdbf04SKyle Evans }
ATF_TC_BODY(readlinkat_before_end,tc)1226cf8e5289SKyle Evans ATF_TC_BODY(readlinkat_before_end, tc)
1227cf8e5289SKyle Evans {
1228cf8e5289SKyle Evans #define BUF &__stack.__buf
1229cf8e5289SKyle Evans 	struct {
1230cf8e5289SKyle Evans 		uint8_t padding_l;
1231cf8e5289SKyle Evans 		unsigned char __buf[42];
1232cf8e5289SKyle Evans 		uint8_t padding_r;
1233cf8e5289SKyle Evans 	} __stack;
1234cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
1235cf8e5289SKyle Evans 	const size_t __len = 42 - 1;
1236cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1237cf8e5289SKyle Evans 	const char *path;
1238cf8e5289SKyle Evans 
1239cf8e5289SKyle Evans 	path = new_symlink(__len);		/* Cannot fail */
1240cf8e5289SKyle Evans 
1241cf8e5289SKyle Evans 	readlinkat(AT_FDCWD, path, __stack.__buf, __len);
1242cf8e5289SKyle Evans #undef BUF
1243cf8e5289SKyle Evans 
1244cf8e5289SKyle Evans }
1245cf8e5289SKyle Evans 
124609cdbf04SKyle Evans ATF_TC(readlinkat_end);
ATF_TC_HEAD(readlinkat_end,tc)124709cdbf04SKyle Evans ATF_TC_HEAD(readlinkat_end, tc)
124809cdbf04SKyle Evans {
124909cdbf04SKyle Evans }
ATF_TC_BODY(readlinkat_end,tc)1250cf8e5289SKyle Evans ATF_TC_BODY(readlinkat_end, tc)
1251cf8e5289SKyle Evans {
1252cf8e5289SKyle Evans #define BUF &__stack.__buf
1253cf8e5289SKyle Evans 	struct {
1254cf8e5289SKyle Evans 		uint8_t padding_l;
1255cf8e5289SKyle Evans 		unsigned char __buf[42];
1256cf8e5289SKyle Evans 		uint8_t padding_r;
1257cf8e5289SKyle Evans 	} __stack;
1258cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
1259cf8e5289SKyle Evans 	const size_t __len = 42;
1260cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1261cf8e5289SKyle Evans 	const char *path;
1262cf8e5289SKyle Evans 
1263cf8e5289SKyle Evans 	path = new_symlink(__len);		/* Cannot fail */
1264cf8e5289SKyle Evans 
1265cf8e5289SKyle Evans 	readlinkat(AT_FDCWD, path, __stack.__buf, __len);
1266cf8e5289SKyle Evans #undef BUF
1267cf8e5289SKyle Evans 
1268cf8e5289SKyle Evans }
1269cf8e5289SKyle Evans 
127009cdbf04SKyle Evans ATF_TC(readlinkat_heap_before_end);
ATF_TC_HEAD(readlinkat_heap_before_end,tc)127109cdbf04SKyle Evans ATF_TC_HEAD(readlinkat_heap_before_end, tc)
127209cdbf04SKyle Evans {
127309cdbf04SKyle Evans }
ATF_TC_BODY(readlinkat_heap_before_end,tc)1274cf8e5289SKyle Evans ATF_TC_BODY(readlinkat_heap_before_end, tc)
1275cf8e5289SKyle Evans {
1276cf8e5289SKyle Evans #define BUF __stack.__buf
1277cf8e5289SKyle Evans 	struct {
1278cf8e5289SKyle Evans 		uint8_t padding_l;
1279cf8e5289SKyle Evans 		unsigned char * __buf;
1280cf8e5289SKyle Evans 		uint8_t padding_r;
1281cf8e5289SKyle Evans 	} __stack;
1282cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1283cf8e5289SKyle Evans 	const size_t __len = 42 - 1;
1284cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1285cf8e5289SKyle Evans 	const char *path;
1286cf8e5289SKyle Evans 
1287cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
1288cf8e5289SKyle Evans 	path = new_symlink(__len);		/* Cannot fail */
1289cf8e5289SKyle Evans 
1290cf8e5289SKyle Evans 	readlinkat(AT_FDCWD, path, __stack.__buf, __len);
1291cf8e5289SKyle Evans #undef BUF
1292cf8e5289SKyle Evans 
1293cf8e5289SKyle Evans }
1294cf8e5289SKyle Evans 
129509cdbf04SKyle Evans ATF_TC(readlinkat_heap_end);
ATF_TC_HEAD(readlinkat_heap_end,tc)129609cdbf04SKyle Evans ATF_TC_HEAD(readlinkat_heap_end, tc)
129709cdbf04SKyle Evans {
129809cdbf04SKyle Evans }
ATF_TC_BODY(readlinkat_heap_end,tc)1299cf8e5289SKyle Evans ATF_TC_BODY(readlinkat_heap_end, tc)
1300cf8e5289SKyle Evans {
1301cf8e5289SKyle Evans #define BUF __stack.__buf
1302cf8e5289SKyle Evans 	struct {
1303cf8e5289SKyle Evans 		uint8_t padding_l;
1304cf8e5289SKyle Evans 		unsigned char * __buf;
1305cf8e5289SKyle Evans 		uint8_t padding_r;
1306cf8e5289SKyle Evans 	} __stack;
1307cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1308cf8e5289SKyle Evans 	const size_t __len = 42;
1309cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1310cf8e5289SKyle Evans 	const char *path;
1311cf8e5289SKyle Evans 
1312cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
1313cf8e5289SKyle Evans 	path = new_symlink(__len);		/* Cannot fail */
1314cf8e5289SKyle Evans 
1315cf8e5289SKyle Evans 	readlinkat(AT_FDCWD, path, __stack.__buf, __len);
1316cf8e5289SKyle Evans #undef BUF
1317cf8e5289SKyle Evans 
1318cf8e5289SKyle Evans }
1319cf8e5289SKyle Evans 
132009cdbf04SKyle Evans ATF_TC(readlinkat_heap_after_end);
ATF_TC_HEAD(readlinkat_heap_after_end,tc)132109cdbf04SKyle Evans ATF_TC_HEAD(readlinkat_heap_after_end, tc)
132209cdbf04SKyle Evans {
132309cdbf04SKyle Evans }
ATF_TC_BODY(readlinkat_heap_after_end,tc)1324cf8e5289SKyle Evans ATF_TC_BODY(readlinkat_heap_after_end, tc)
1325cf8e5289SKyle Evans {
1326cf8e5289SKyle Evans #define BUF __stack.__buf
1327cf8e5289SKyle Evans 	struct {
1328cf8e5289SKyle Evans 		uint8_t padding_l;
1329cf8e5289SKyle Evans 		unsigned char * __buf;
1330cf8e5289SKyle Evans 		uint8_t padding_r;
1331cf8e5289SKyle Evans 	} __stack;
1332cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1333cf8e5289SKyle Evans 	const size_t __len = 42 + 1;
1334cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1335cf8e5289SKyle Evans 	pid_t __child;
1336cf8e5289SKyle Evans 	int __status;
1337cf8e5289SKyle Evans 	const char *path;
1338cf8e5289SKyle Evans 
1339cf8e5289SKyle Evans 	__child = fork();
1340cf8e5289SKyle Evans 	ATF_REQUIRE(__child >= 0);
1341cf8e5289SKyle Evans 	if (__child > 0)
1342cf8e5289SKyle Evans 		goto monitor;
1343cf8e5289SKyle Evans 
1344cf8e5289SKyle Evans 	/* Child */
1345cf8e5289SKyle Evans 	disable_coredumps();
1346cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
1347cf8e5289SKyle Evans 	path = new_symlink(__len);		/* Cannot fail */
1348cf8e5289SKyle Evans 
1349cf8e5289SKyle Evans 	readlinkat(AT_FDCWD, path, __stack.__buf, __len);
1350cf8e5289SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
1351cf8e5289SKyle Evans 
1352cf8e5289SKyle Evans monitor:
1353cf8e5289SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
1354cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
1355cf8e5289SKyle Evans 	}
1356cf8e5289SKyle Evans 
1357cf8e5289SKyle Evans 	if (!WIFSIGNALED(__status)) {
1358cf8e5289SKyle Evans 		switch (WEXITSTATUS(__status)) {
1359cf8e5289SKyle Evans 		case EX_SOFTWARE:
1360cf8e5289SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
1361cf8e5289SKyle Evans 			break;
1362cf8e5289SKyle Evans 		case EX_OSERR:
1363cf8e5289SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
1364cf8e5289SKyle Evans 			break;
1365cf8e5289SKyle Evans 		default:
1366cf8e5289SKyle Evans 			atf_tc_fail("child exited with status %d",
1367cf8e5289SKyle Evans 			    WEXITSTATUS(__status));
1368cf8e5289SKyle Evans 		}
1369cf8e5289SKyle Evans 	} else {
1370cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
1371cf8e5289SKyle Evans 	}
1372cf8e5289SKyle Evans #undef BUF
1373cf8e5289SKyle Evans 
1374cf8e5289SKyle Evans }
1375cf8e5289SKyle Evans 
137609cdbf04SKyle Evans ATF_TC(getdomainname_before_end);
ATF_TC_HEAD(getdomainname_before_end,tc)137709cdbf04SKyle Evans ATF_TC_HEAD(getdomainname_before_end, tc)
137809cdbf04SKyle Evans {
1379*22178cb2SKyle Evans 	atf_tc_set_md_var(tc, "require.user", "root");
138009cdbf04SKyle Evans }
ATF_TC_BODY(getdomainname_before_end,tc)1381cf8e5289SKyle Evans ATF_TC_BODY(getdomainname_before_end, tc)
1382cf8e5289SKyle Evans {
1383cf8e5289SKyle Evans #define BUF &__stack.__buf
1384cf8e5289SKyle Evans 	struct {
1385cf8e5289SKyle Evans 		uint8_t padding_l;
1386*22178cb2SKyle Evans 		unsigned char __buf[12];
1387cf8e5289SKyle Evans 		uint8_t padding_r;
1388cf8e5289SKyle Evans 	} __stack;
1389cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
1390*22178cb2SKyle Evans 	const size_t __len = 12 - 1;
1391cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1392cf8e5289SKyle Evans 
1393*22178cb2SKyle Evans 	dhost_jail();
1394cf8e5289SKyle Evans 	getdomainname(__stack.__buf, __len);
1395cf8e5289SKyle Evans #undef BUF
1396cf8e5289SKyle Evans 
1397cf8e5289SKyle Evans }
1398cf8e5289SKyle Evans 
139909cdbf04SKyle Evans ATF_TC(getdomainname_end);
ATF_TC_HEAD(getdomainname_end,tc)140009cdbf04SKyle Evans ATF_TC_HEAD(getdomainname_end, tc)
140109cdbf04SKyle Evans {
1402*22178cb2SKyle Evans 	atf_tc_set_md_var(tc, "require.user", "root");
140309cdbf04SKyle Evans }
ATF_TC_BODY(getdomainname_end,tc)1404cf8e5289SKyle Evans ATF_TC_BODY(getdomainname_end, tc)
1405cf8e5289SKyle Evans {
1406cf8e5289SKyle Evans #define BUF &__stack.__buf
1407cf8e5289SKyle Evans 	struct {
1408cf8e5289SKyle Evans 		uint8_t padding_l;
1409*22178cb2SKyle Evans 		unsigned char __buf[12];
1410cf8e5289SKyle Evans 		uint8_t padding_r;
1411cf8e5289SKyle Evans 	} __stack;
1412cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
1413*22178cb2SKyle Evans 	const size_t __len = 12;
1414cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1415cf8e5289SKyle Evans 
1416*22178cb2SKyle Evans 	dhost_jail();
1417cf8e5289SKyle Evans 	getdomainname(__stack.__buf, __len);
1418cf8e5289SKyle Evans #undef BUF
1419cf8e5289SKyle Evans 
1420cf8e5289SKyle Evans }
1421cf8e5289SKyle Evans 
142209cdbf04SKyle Evans ATF_TC(getdomainname_heap_before_end);
ATF_TC_HEAD(getdomainname_heap_before_end,tc)142309cdbf04SKyle Evans ATF_TC_HEAD(getdomainname_heap_before_end, tc)
142409cdbf04SKyle Evans {
1425*22178cb2SKyle Evans 	atf_tc_set_md_var(tc, "require.user", "root");
142609cdbf04SKyle Evans }
ATF_TC_BODY(getdomainname_heap_before_end,tc)1427cf8e5289SKyle Evans ATF_TC_BODY(getdomainname_heap_before_end, tc)
1428cf8e5289SKyle Evans {
1429cf8e5289SKyle Evans #define BUF __stack.__buf
1430cf8e5289SKyle Evans 	struct {
1431cf8e5289SKyle Evans 		uint8_t padding_l;
1432cf8e5289SKyle Evans 		unsigned char * __buf;
1433cf8e5289SKyle Evans 		uint8_t padding_r;
1434cf8e5289SKyle Evans 	} __stack;
1435*22178cb2SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (12);
1436*22178cb2SKyle Evans 	const size_t __len = 12 - 1;
1437cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1438cf8e5289SKyle Evans 
1439*22178cb2SKyle Evans 	dhost_jail();
1440cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
1441cf8e5289SKyle Evans 
1442cf8e5289SKyle Evans 	getdomainname(__stack.__buf, __len);
1443cf8e5289SKyle Evans #undef BUF
1444cf8e5289SKyle Evans 
1445cf8e5289SKyle Evans }
1446cf8e5289SKyle Evans 
144709cdbf04SKyle Evans ATF_TC(getdomainname_heap_end);
ATF_TC_HEAD(getdomainname_heap_end,tc)144809cdbf04SKyle Evans ATF_TC_HEAD(getdomainname_heap_end, tc)
144909cdbf04SKyle Evans {
1450*22178cb2SKyle Evans 	atf_tc_set_md_var(tc, "require.user", "root");
145109cdbf04SKyle Evans }
ATF_TC_BODY(getdomainname_heap_end,tc)1452cf8e5289SKyle Evans ATF_TC_BODY(getdomainname_heap_end, tc)
1453cf8e5289SKyle Evans {
1454cf8e5289SKyle Evans #define BUF __stack.__buf
1455cf8e5289SKyle Evans 	struct {
1456cf8e5289SKyle Evans 		uint8_t padding_l;
1457cf8e5289SKyle Evans 		unsigned char * __buf;
1458cf8e5289SKyle Evans 		uint8_t padding_r;
1459cf8e5289SKyle Evans 	} __stack;
1460*22178cb2SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (12);
1461*22178cb2SKyle Evans 	const size_t __len = 12;
1462cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1463cf8e5289SKyle Evans 
1464*22178cb2SKyle Evans 	dhost_jail();
1465cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
1466cf8e5289SKyle Evans 
1467cf8e5289SKyle Evans 	getdomainname(__stack.__buf, __len);
1468cf8e5289SKyle Evans #undef BUF
1469cf8e5289SKyle Evans 
1470cf8e5289SKyle Evans }
1471cf8e5289SKyle Evans 
147209cdbf04SKyle Evans ATF_TC(getdomainname_heap_after_end);
ATF_TC_HEAD(getdomainname_heap_after_end,tc)147309cdbf04SKyle Evans ATF_TC_HEAD(getdomainname_heap_after_end, tc)
147409cdbf04SKyle Evans {
1475*22178cb2SKyle Evans 	atf_tc_set_md_var(tc, "require.user", "root");
147609cdbf04SKyle Evans }
ATF_TC_BODY(getdomainname_heap_after_end,tc)1477cf8e5289SKyle Evans ATF_TC_BODY(getdomainname_heap_after_end, tc)
1478cf8e5289SKyle Evans {
1479cf8e5289SKyle Evans #define BUF __stack.__buf
1480cf8e5289SKyle Evans 	struct {
1481cf8e5289SKyle Evans 		uint8_t padding_l;
1482cf8e5289SKyle Evans 		unsigned char * __buf;
1483cf8e5289SKyle Evans 		uint8_t padding_r;
1484cf8e5289SKyle Evans 	} __stack;
1485*22178cb2SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (12);
1486*22178cb2SKyle Evans 	const size_t __len = 12 + 1;
1487cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1488cf8e5289SKyle Evans 	pid_t __child;
1489cf8e5289SKyle Evans 	int __status;
1490cf8e5289SKyle Evans 
1491*22178cb2SKyle Evans 	dhost_jail();
1492cf8e5289SKyle Evans 	__child = fork();
1493cf8e5289SKyle Evans 	ATF_REQUIRE(__child >= 0);
1494cf8e5289SKyle Evans 	if (__child > 0)
1495cf8e5289SKyle Evans 		goto monitor;
1496cf8e5289SKyle Evans 
1497cf8e5289SKyle Evans 	/* Child */
1498cf8e5289SKyle Evans 	disable_coredumps();
1499cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
1500cf8e5289SKyle Evans 
1501cf8e5289SKyle Evans 	getdomainname(__stack.__buf, __len);
1502cf8e5289SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
1503cf8e5289SKyle Evans 
1504cf8e5289SKyle Evans monitor:
1505cf8e5289SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
1506cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
1507cf8e5289SKyle Evans 	}
1508cf8e5289SKyle Evans 
1509cf8e5289SKyle Evans 	if (!WIFSIGNALED(__status)) {
1510cf8e5289SKyle Evans 		switch (WEXITSTATUS(__status)) {
1511cf8e5289SKyle Evans 		case EX_SOFTWARE:
1512cf8e5289SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
1513cf8e5289SKyle Evans 			break;
1514cf8e5289SKyle Evans 		case EX_OSERR:
1515cf8e5289SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
1516cf8e5289SKyle Evans 			break;
1517cf8e5289SKyle Evans 		default:
1518cf8e5289SKyle Evans 			atf_tc_fail("child exited with status %d",
1519cf8e5289SKyle Evans 			    WEXITSTATUS(__status));
1520cf8e5289SKyle Evans 		}
1521cf8e5289SKyle Evans 	} else {
1522cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
1523cf8e5289SKyle Evans 	}
1524cf8e5289SKyle Evans #undef BUF
1525cf8e5289SKyle Evans 
1526cf8e5289SKyle Evans }
1527cf8e5289SKyle Evans 
152809cdbf04SKyle Evans ATF_TC(getentropy_before_end);
ATF_TC_HEAD(getentropy_before_end,tc)152909cdbf04SKyle Evans ATF_TC_HEAD(getentropy_before_end, tc)
153009cdbf04SKyle Evans {
153109cdbf04SKyle Evans }
ATF_TC_BODY(getentropy_before_end,tc)1532cf8e5289SKyle Evans ATF_TC_BODY(getentropy_before_end, tc)
1533cf8e5289SKyle Evans {
1534cf8e5289SKyle Evans #define BUF &__stack.__buf
1535cf8e5289SKyle Evans 	struct {
1536cf8e5289SKyle Evans 		uint8_t padding_l;
1537cf8e5289SKyle Evans 		unsigned char __buf[42];
1538cf8e5289SKyle Evans 		uint8_t padding_r;
1539cf8e5289SKyle Evans 	} __stack;
1540cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
1541cf8e5289SKyle Evans 	const size_t __len = 42 - 1;
1542cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1543cf8e5289SKyle Evans 
1544cf8e5289SKyle Evans 	getentropy(__stack.__buf, __len);
1545cf8e5289SKyle Evans #undef BUF
1546cf8e5289SKyle Evans 
1547cf8e5289SKyle Evans }
1548cf8e5289SKyle Evans 
154909cdbf04SKyle Evans ATF_TC(getentropy_end);
ATF_TC_HEAD(getentropy_end,tc)155009cdbf04SKyle Evans ATF_TC_HEAD(getentropy_end, tc)
155109cdbf04SKyle Evans {
155209cdbf04SKyle Evans }
ATF_TC_BODY(getentropy_end,tc)1553cf8e5289SKyle Evans ATF_TC_BODY(getentropy_end, tc)
1554cf8e5289SKyle Evans {
1555cf8e5289SKyle Evans #define BUF &__stack.__buf
1556cf8e5289SKyle Evans 	struct {
1557cf8e5289SKyle Evans 		uint8_t padding_l;
1558cf8e5289SKyle Evans 		unsigned char __buf[42];
1559cf8e5289SKyle Evans 		uint8_t padding_r;
1560cf8e5289SKyle Evans 	} __stack;
1561cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
1562cf8e5289SKyle Evans 	const size_t __len = 42;
1563cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1564cf8e5289SKyle Evans 
1565cf8e5289SKyle Evans 	getentropy(__stack.__buf, __len);
1566cf8e5289SKyle Evans #undef BUF
1567cf8e5289SKyle Evans 
1568cf8e5289SKyle Evans }
1569cf8e5289SKyle Evans 
157009cdbf04SKyle Evans ATF_TC(getentropy_heap_before_end);
ATF_TC_HEAD(getentropy_heap_before_end,tc)157109cdbf04SKyle Evans ATF_TC_HEAD(getentropy_heap_before_end, tc)
157209cdbf04SKyle Evans {
157309cdbf04SKyle Evans }
ATF_TC_BODY(getentropy_heap_before_end,tc)1574cf8e5289SKyle Evans ATF_TC_BODY(getentropy_heap_before_end, tc)
1575cf8e5289SKyle Evans {
1576cf8e5289SKyle Evans #define BUF __stack.__buf
1577cf8e5289SKyle Evans 	struct {
1578cf8e5289SKyle Evans 		uint8_t padding_l;
1579cf8e5289SKyle Evans 		unsigned char * __buf;
1580cf8e5289SKyle Evans 		uint8_t padding_r;
1581cf8e5289SKyle Evans 	} __stack;
1582cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1583cf8e5289SKyle Evans 	const size_t __len = 42 - 1;
1584cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1585cf8e5289SKyle Evans 
1586cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
1587cf8e5289SKyle Evans 
1588cf8e5289SKyle Evans 	getentropy(__stack.__buf, __len);
1589cf8e5289SKyle Evans #undef BUF
1590cf8e5289SKyle Evans 
1591cf8e5289SKyle Evans }
1592cf8e5289SKyle Evans 
159309cdbf04SKyle Evans ATF_TC(getentropy_heap_end);
ATF_TC_HEAD(getentropy_heap_end,tc)159409cdbf04SKyle Evans ATF_TC_HEAD(getentropy_heap_end, tc)
159509cdbf04SKyle Evans {
159609cdbf04SKyle Evans }
ATF_TC_BODY(getentropy_heap_end,tc)1597cf8e5289SKyle Evans ATF_TC_BODY(getentropy_heap_end, tc)
1598cf8e5289SKyle Evans {
1599cf8e5289SKyle Evans #define BUF __stack.__buf
1600cf8e5289SKyle Evans 	struct {
1601cf8e5289SKyle Evans 		uint8_t padding_l;
1602cf8e5289SKyle Evans 		unsigned char * __buf;
1603cf8e5289SKyle Evans 		uint8_t padding_r;
1604cf8e5289SKyle Evans 	} __stack;
1605cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1606cf8e5289SKyle Evans 	const size_t __len = 42;
1607cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1608cf8e5289SKyle Evans 
1609cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
1610cf8e5289SKyle Evans 
1611cf8e5289SKyle Evans 	getentropy(__stack.__buf, __len);
1612cf8e5289SKyle Evans #undef BUF
1613cf8e5289SKyle Evans 
1614cf8e5289SKyle Evans }
1615cf8e5289SKyle Evans 
161609cdbf04SKyle Evans ATF_TC(getentropy_heap_after_end);
ATF_TC_HEAD(getentropy_heap_after_end,tc)161709cdbf04SKyle Evans ATF_TC_HEAD(getentropy_heap_after_end, tc)
161809cdbf04SKyle Evans {
161909cdbf04SKyle Evans }
ATF_TC_BODY(getentropy_heap_after_end,tc)1620cf8e5289SKyle Evans ATF_TC_BODY(getentropy_heap_after_end, tc)
1621cf8e5289SKyle Evans {
1622cf8e5289SKyle Evans #define BUF __stack.__buf
1623cf8e5289SKyle Evans 	struct {
1624cf8e5289SKyle Evans 		uint8_t padding_l;
1625cf8e5289SKyle Evans 		unsigned char * __buf;
1626cf8e5289SKyle Evans 		uint8_t padding_r;
1627cf8e5289SKyle Evans 	} __stack;
1628cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
1629cf8e5289SKyle Evans 	const size_t __len = 42 + 1;
1630cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1631cf8e5289SKyle Evans 	pid_t __child;
1632cf8e5289SKyle Evans 	int __status;
1633cf8e5289SKyle Evans 
1634cf8e5289SKyle Evans 	__child = fork();
1635cf8e5289SKyle Evans 	ATF_REQUIRE(__child >= 0);
1636cf8e5289SKyle Evans 	if (__child > 0)
1637cf8e5289SKyle Evans 		goto monitor;
1638cf8e5289SKyle Evans 
1639cf8e5289SKyle Evans 	/* Child */
1640cf8e5289SKyle Evans 	disable_coredumps();
1641cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
1642cf8e5289SKyle Evans 
1643cf8e5289SKyle Evans 	getentropy(__stack.__buf, __len);
1644cf8e5289SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
1645cf8e5289SKyle Evans 
1646cf8e5289SKyle Evans monitor:
1647cf8e5289SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
1648cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
1649cf8e5289SKyle Evans 	}
1650cf8e5289SKyle Evans 
1651cf8e5289SKyle Evans 	if (!WIFSIGNALED(__status)) {
1652cf8e5289SKyle Evans 		switch (WEXITSTATUS(__status)) {
1653cf8e5289SKyle Evans 		case EX_SOFTWARE:
1654cf8e5289SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
1655cf8e5289SKyle Evans 			break;
1656cf8e5289SKyle Evans 		case EX_OSERR:
1657cf8e5289SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
1658cf8e5289SKyle Evans 			break;
1659cf8e5289SKyle Evans 		default:
1660cf8e5289SKyle Evans 			atf_tc_fail("child exited with status %d",
1661cf8e5289SKyle Evans 			    WEXITSTATUS(__status));
1662cf8e5289SKyle Evans 		}
1663cf8e5289SKyle Evans 	} else {
1664cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
1665cf8e5289SKyle Evans 	}
1666cf8e5289SKyle Evans #undef BUF
1667cf8e5289SKyle Evans 
1668cf8e5289SKyle Evans }
1669cf8e5289SKyle Evans 
167009cdbf04SKyle Evans ATF_TC(gethostname_before_end);
ATF_TC_HEAD(gethostname_before_end,tc)167109cdbf04SKyle Evans ATF_TC_HEAD(gethostname_before_end, tc)
167209cdbf04SKyle Evans {
1673*22178cb2SKyle Evans 	atf_tc_set_md_var(tc, "require.user", "root");
167409cdbf04SKyle Evans }
ATF_TC_BODY(gethostname_before_end,tc)1675cf8e5289SKyle Evans ATF_TC_BODY(gethostname_before_end, tc)
1676cf8e5289SKyle Evans {
1677cf8e5289SKyle Evans #define BUF &__stack.__buf
1678cf8e5289SKyle Evans 	struct {
1679cf8e5289SKyle Evans 		uint8_t padding_l;
1680*22178cb2SKyle Evans 		unsigned char __buf[17];
1681cf8e5289SKyle Evans 		uint8_t padding_r;
1682cf8e5289SKyle Evans 	} __stack;
1683cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
1684*22178cb2SKyle Evans 	const size_t __len = 17 - 1;
1685cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1686cf8e5289SKyle Evans 
1687*22178cb2SKyle Evans 	dhost_jail();
1688cf8e5289SKyle Evans 	gethostname(__stack.__buf, __len);
1689cf8e5289SKyle Evans #undef BUF
1690cf8e5289SKyle Evans 
1691cf8e5289SKyle Evans }
1692cf8e5289SKyle Evans 
169309cdbf04SKyle Evans ATF_TC(gethostname_end);
ATF_TC_HEAD(gethostname_end,tc)169409cdbf04SKyle Evans ATF_TC_HEAD(gethostname_end, tc)
169509cdbf04SKyle Evans {
1696*22178cb2SKyle Evans 	atf_tc_set_md_var(tc, "require.user", "root");
169709cdbf04SKyle Evans }
ATF_TC_BODY(gethostname_end,tc)1698cf8e5289SKyle Evans ATF_TC_BODY(gethostname_end, tc)
1699cf8e5289SKyle Evans {
1700cf8e5289SKyle Evans #define BUF &__stack.__buf
1701cf8e5289SKyle Evans 	struct {
1702cf8e5289SKyle Evans 		uint8_t padding_l;
1703*22178cb2SKyle Evans 		unsigned char __buf[17];
1704cf8e5289SKyle Evans 		uint8_t padding_r;
1705cf8e5289SKyle Evans 	} __stack;
1706cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
1707*22178cb2SKyle Evans 	const size_t __len = 17;
1708cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1709cf8e5289SKyle Evans 
1710*22178cb2SKyle Evans 	dhost_jail();
1711cf8e5289SKyle Evans 	gethostname(__stack.__buf, __len);
1712cf8e5289SKyle Evans #undef BUF
1713cf8e5289SKyle Evans 
1714cf8e5289SKyle Evans }
1715cf8e5289SKyle Evans 
171609cdbf04SKyle Evans ATF_TC(gethostname_heap_before_end);
ATF_TC_HEAD(gethostname_heap_before_end,tc)171709cdbf04SKyle Evans ATF_TC_HEAD(gethostname_heap_before_end, tc)
171809cdbf04SKyle Evans {
1719*22178cb2SKyle Evans 	atf_tc_set_md_var(tc, "require.user", "root");
172009cdbf04SKyle Evans }
ATF_TC_BODY(gethostname_heap_before_end,tc)1721cf8e5289SKyle Evans ATF_TC_BODY(gethostname_heap_before_end, tc)
1722cf8e5289SKyle Evans {
1723cf8e5289SKyle Evans #define BUF __stack.__buf
1724cf8e5289SKyle Evans 	struct {
1725cf8e5289SKyle Evans 		uint8_t padding_l;
1726cf8e5289SKyle Evans 		unsigned char * __buf;
1727cf8e5289SKyle Evans 		uint8_t padding_r;
1728cf8e5289SKyle Evans 	} __stack;
1729*22178cb2SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (17);
1730*22178cb2SKyle Evans 	const size_t __len = 17 - 1;
1731cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1732cf8e5289SKyle Evans 
1733*22178cb2SKyle Evans 	dhost_jail();
1734cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
1735cf8e5289SKyle Evans 
1736cf8e5289SKyle Evans 	gethostname(__stack.__buf, __len);
1737cf8e5289SKyle Evans #undef BUF
1738cf8e5289SKyle Evans 
1739cf8e5289SKyle Evans }
1740cf8e5289SKyle Evans 
174109cdbf04SKyle Evans ATF_TC(gethostname_heap_end);
ATF_TC_HEAD(gethostname_heap_end,tc)174209cdbf04SKyle Evans ATF_TC_HEAD(gethostname_heap_end, tc)
174309cdbf04SKyle Evans {
1744*22178cb2SKyle Evans 	atf_tc_set_md_var(tc, "require.user", "root");
174509cdbf04SKyle Evans }
ATF_TC_BODY(gethostname_heap_end,tc)1746cf8e5289SKyle Evans ATF_TC_BODY(gethostname_heap_end, tc)
1747cf8e5289SKyle Evans {
1748cf8e5289SKyle Evans #define BUF __stack.__buf
1749cf8e5289SKyle Evans 	struct {
1750cf8e5289SKyle Evans 		uint8_t padding_l;
1751cf8e5289SKyle Evans 		unsigned char * __buf;
1752cf8e5289SKyle Evans 		uint8_t padding_r;
1753cf8e5289SKyle Evans 	} __stack;
1754*22178cb2SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (17);
1755*22178cb2SKyle Evans 	const size_t __len = 17;
1756cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1757cf8e5289SKyle Evans 
1758*22178cb2SKyle Evans 	dhost_jail();
1759cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
1760cf8e5289SKyle Evans 
1761cf8e5289SKyle Evans 	gethostname(__stack.__buf, __len);
1762cf8e5289SKyle Evans #undef BUF
1763cf8e5289SKyle Evans 
1764cf8e5289SKyle Evans }
1765cf8e5289SKyle Evans 
176609cdbf04SKyle Evans ATF_TC(gethostname_heap_after_end);
ATF_TC_HEAD(gethostname_heap_after_end,tc)176709cdbf04SKyle Evans ATF_TC_HEAD(gethostname_heap_after_end, tc)
176809cdbf04SKyle Evans {
1769*22178cb2SKyle Evans 	atf_tc_set_md_var(tc, "require.user", "root");
177009cdbf04SKyle Evans }
ATF_TC_BODY(gethostname_heap_after_end,tc)1771cf8e5289SKyle Evans ATF_TC_BODY(gethostname_heap_after_end, tc)
1772cf8e5289SKyle Evans {
1773cf8e5289SKyle Evans #define BUF __stack.__buf
1774cf8e5289SKyle Evans 	struct {
1775cf8e5289SKyle Evans 		uint8_t padding_l;
1776cf8e5289SKyle Evans 		unsigned char * __buf;
1777cf8e5289SKyle Evans 		uint8_t padding_r;
1778cf8e5289SKyle Evans 	} __stack;
1779*22178cb2SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (17);
1780*22178cb2SKyle Evans 	const size_t __len = 17 + 1;
1781cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1782cf8e5289SKyle Evans 	pid_t __child;
1783cf8e5289SKyle Evans 	int __status;
1784cf8e5289SKyle Evans 
1785*22178cb2SKyle Evans 	dhost_jail();
1786cf8e5289SKyle Evans 	__child = fork();
1787cf8e5289SKyle Evans 	ATF_REQUIRE(__child >= 0);
1788cf8e5289SKyle Evans 	if (__child > 0)
1789cf8e5289SKyle Evans 		goto monitor;
1790cf8e5289SKyle Evans 
1791cf8e5289SKyle Evans 	/* Child */
1792cf8e5289SKyle Evans 	disable_coredumps();
1793cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
1794cf8e5289SKyle Evans 
1795cf8e5289SKyle Evans 	gethostname(__stack.__buf, __len);
1796cf8e5289SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
1797cf8e5289SKyle Evans 
1798cf8e5289SKyle Evans monitor:
1799cf8e5289SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
1800cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
1801cf8e5289SKyle Evans 	}
1802cf8e5289SKyle Evans 
1803cf8e5289SKyle Evans 	if (!WIFSIGNALED(__status)) {
1804cf8e5289SKyle Evans 		switch (WEXITSTATUS(__status)) {
1805cf8e5289SKyle Evans 		case EX_SOFTWARE:
1806cf8e5289SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
1807cf8e5289SKyle Evans 			break;
1808cf8e5289SKyle Evans 		case EX_OSERR:
1809cf8e5289SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
1810cf8e5289SKyle Evans 			break;
1811cf8e5289SKyle Evans 		default:
1812cf8e5289SKyle Evans 			atf_tc_fail("child exited with status %d",
1813cf8e5289SKyle Evans 			    WEXITSTATUS(__status));
1814cf8e5289SKyle Evans 		}
1815cf8e5289SKyle Evans 	} else {
1816cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
1817cf8e5289SKyle Evans 	}
1818cf8e5289SKyle Evans #undef BUF
1819cf8e5289SKyle Evans 
1820cf8e5289SKyle Evans }
1821cf8e5289SKyle Evans 
182209cdbf04SKyle Evans ATF_TC(getlogin_r_before_end);
ATF_TC_HEAD(getlogin_r_before_end,tc)182309cdbf04SKyle Evans ATF_TC_HEAD(getlogin_r_before_end, tc)
182409cdbf04SKyle Evans {
182509cdbf04SKyle Evans }
ATF_TC_BODY(getlogin_r_before_end,tc)1826cf8e5289SKyle Evans ATF_TC_BODY(getlogin_r_before_end, tc)
1827cf8e5289SKyle Evans {
1828cf8e5289SKyle Evans #define BUF &__stack.__buf
1829cf8e5289SKyle Evans 	struct {
1830cf8e5289SKyle Evans 		uint8_t padding_l;
1831cf8e5289SKyle Evans 		unsigned char __buf[MAXLOGNAME + 1];
1832cf8e5289SKyle Evans 		uint8_t padding_r;
1833cf8e5289SKyle Evans 	} __stack;
1834cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
1835cf8e5289SKyle Evans 	const size_t __len = MAXLOGNAME + 1 - 1;
1836cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1837cf8e5289SKyle Evans 
1838cf8e5289SKyle Evans 	getlogin_r(__stack.__buf, __len);
1839cf8e5289SKyle Evans #undef BUF
1840cf8e5289SKyle Evans 
1841cf8e5289SKyle Evans }
1842cf8e5289SKyle Evans 
184309cdbf04SKyle Evans ATF_TC(getlogin_r_end);
ATF_TC_HEAD(getlogin_r_end,tc)184409cdbf04SKyle Evans ATF_TC_HEAD(getlogin_r_end, tc)
184509cdbf04SKyle Evans {
184609cdbf04SKyle Evans }
ATF_TC_BODY(getlogin_r_end,tc)1847cf8e5289SKyle Evans ATF_TC_BODY(getlogin_r_end, tc)
1848cf8e5289SKyle Evans {
1849cf8e5289SKyle Evans #define BUF &__stack.__buf
1850cf8e5289SKyle Evans 	struct {
1851cf8e5289SKyle Evans 		uint8_t padding_l;
1852cf8e5289SKyle Evans 		unsigned char __buf[MAXLOGNAME + 1];
1853cf8e5289SKyle Evans 		uint8_t padding_r;
1854cf8e5289SKyle Evans 	} __stack;
1855cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
1856cf8e5289SKyle Evans 	const size_t __len = MAXLOGNAME + 1;
1857cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1858cf8e5289SKyle Evans 
1859cf8e5289SKyle Evans 	getlogin_r(__stack.__buf, __len);
1860cf8e5289SKyle Evans #undef BUF
1861cf8e5289SKyle Evans 
1862cf8e5289SKyle Evans }
1863cf8e5289SKyle Evans 
186409cdbf04SKyle Evans ATF_TC(getlogin_r_heap_before_end);
ATF_TC_HEAD(getlogin_r_heap_before_end,tc)186509cdbf04SKyle Evans ATF_TC_HEAD(getlogin_r_heap_before_end, tc)
186609cdbf04SKyle Evans {
186709cdbf04SKyle Evans }
ATF_TC_BODY(getlogin_r_heap_before_end,tc)1868cf8e5289SKyle Evans ATF_TC_BODY(getlogin_r_heap_before_end, tc)
1869cf8e5289SKyle Evans {
1870cf8e5289SKyle Evans #define BUF __stack.__buf
1871cf8e5289SKyle Evans 	struct {
1872cf8e5289SKyle Evans 		uint8_t padding_l;
1873cf8e5289SKyle Evans 		unsigned char * __buf;
1874cf8e5289SKyle Evans 		uint8_t padding_r;
1875cf8e5289SKyle Evans 	} __stack;
1876cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (MAXLOGNAME + 1);
1877cf8e5289SKyle Evans 	const size_t __len = MAXLOGNAME + 1 - 1;
1878cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1879cf8e5289SKyle Evans 
1880cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
1881cf8e5289SKyle Evans 
1882cf8e5289SKyle Evans 	getlogin_r(__stack.__buf, __len);
1883cf8e5289SKyle Evans #undef BUF
1884cf8e5289SKyle Evans 
1885cf8e5289SKyle Evans }
1886cf8e5289SKyle Evans 
188709cdbf04SKyle Evans ATF_TC(getlogin_r_heap_end);
ATF_TC_HEAD(getlogin_r_heap_end,tc)188809cdbf04SKyle Evans ATF_TC_HEAD(getlogin_r_heap_end, tc)
188909cdbf04SKyle Evans {
189009cdbf04SKyle Evans }
ATF_TC_BODY(getlogin_r_heap_end,tc)1891cf8e5289SKyle Evans ATF_TC_BODY(getlogin_r_heap_end, tc)
1892cf8e5289SKyle Evans {
1893cf8e5289SKyle Evans #define BUF __stack.__buf
1894cf8e5289SKyle Evans 	struct {
1895cf8e5289SKyle Evans 		uint8_t padding_l;
1896cf8e5289SKyle Evans 		unsigned char * __buf;
1897cf8e5289SKyle Evans 		uint8_t padding_r;
1898cf8e5289SKyle Evans 	} __stack;
1899cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (MAXLOGNAME + 1);
1900cf8e5289SKyle Evans 	const size_t __len = MAXLOGNAME + 1;
1901cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1902cf8e5289SKyle Evans 
1903cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
1904cf8e5289SKyle Evans 
1905cf8e5289SKyle Evans 	getlogin_r(__stack.__buf, __len);
1906cf8e5289SKyle Evans #undef BUF
1907cf8e5289SKyle Evans 
1908cf8e5289SKyle Evans }
1909cf8e5289SKyle Evans 
191009cdbf04SKyle Evans ATF_TC(getlogin_r_heap_after_end);
ATF_TC_HEAD(getlogin_r_heap_after_end,tc)191109cdbf04SKyle Evans ATF_TC_HEAD(getlogin_r_heap_after_end, tc)
191209cdbf04SKyle Evans {
191309cdbf04SKyle Evans }
ATF_TC_BODY(getlogin_r_heap_after_end,tc)1914cf8e5289SKyle Evans ATF_TC_BODY(getlogin_r_heap_after_end, tc)
1915cf8e5289SKyle Evans {
1916cf8e5289SKyle Evans #define BUF __stack.__buf
1917cf8e5289SKyle Evans 	struct {
1918cf8e5289SKyle Evans 		uint8_t padding_l;
1919cf8e5289SKyle Evans 		unsigned char * __buf;
1920cf8e5289SKyle Evans 		uint8_t padding_r;
1921cf8e5289SKyle Evans 	} __stack;
1922cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (MAXLOGNAME + 1);
1923cf8e5289SKyle Evans 	const size_t __len = MAXLOGNAME + 1 + 1;
1924cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1925cf8e5289SKyle Evans 	pid_t __child;
1926cf8e5289SKyle Evans 	int __status;
1927cf8e5289SKyle Evans 
1928cf8e5289SKyle Evans 	__child = fork();
1929cf8e5289SKyle Evans 	ATF_REQUIRE(__child >= 0);
1930cf8e5289SKyle Evans 	if (__child > 0)
1931cf8e5289SKyle Evans 		goto monitor;
1932cf8e5289SKyle Evans 
1933cf8e5289SKyle Evans 	/* Child */
1934cf8e5289SKyle Evans 	disable_coredumps();
1935cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
1936cf8e5289SKyle Evans 
1937cf8e5289SKyle Evans 	getlogin_r(__stack.__buf, __len);
1938cf8e5289SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
1939cf8e5289SKyle Evans 
1940cf8e5289SKyle Evans monitor:
1941cf8e5289SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
1942cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
1943cf8e5289SKyle Evans 	}
1944cf8e5289SKyle Evans 
1945cf8e5289SKyle Evans 	if (!WIFSIGNALED(__status)) {
1946cf8e5289SKyle Evans 		switch (WEXITSTATUS(__status)) {
1947cf8e5289SKyle Evans 		case EX_SOFTWARE:
1948cf8e5289SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
1949cf8e5289SKyle Evans 			break;
1950cf8e5289SKyle Evans 		case EX_OSERR:
1951cf8e5289SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
1952cf8e5289SKyle Evans 			break;
1953cf8e5289SKyle Evans 		default:
1954cf8e5289SKyle Evans 			atf_tc_fail("child exited with status %d",
1955cf8e5289SKyle Evans 			    WEXITSTATUS(__status));
1956cf8e5289SKyle Evans 		}
1957cf8e5289SKyle Evans 	} else {
1958cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
1959cf8e5289SKyle Evans 	}
1960cf8e5289SKyle Evans #undef BUF
1961cf8e5289SKyle Evans 
1962cf8e5289SKyle Evans }
1963cf8e5289SKyle Evans 
196409cdbf04SKyle Evans ATF_TC(ttyname_r_before_end);
ATF_TC_HEAD(ttyname_r_before_end,tc)196509cdbf04SKyle Evans ATF_TC_HEAD(ttyname_r_before_end, tc)
196609cdbf04SKyle Evans {
196709cdbf04SKyle Evans }
ATF_TC_BODY(ttyname_r_before_end,tc)1968cf8e5289SKyle Evans ATF_TC_BODY(ttyname_r_before_end, tc)
1969cf8e5289SKyle Evans {
1970cf8e5289SKyle Evans #define BUF &__stack.__buf
1971cf8e5289SKyle Evans 	struct {
1972cf8e5289SKyle Evans 		uint8_t padding_l;
1973cf8e5289SKyle Evans 		unsigned char __buf[42];
1974cf8e5289SKyle Evans 		uint8_t padding_r;
1975cf8e5289SKyle Evans 	} __stack;
1976cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
1977cf8e5289SKyle Evans 	const size_t __len = 42 - 1;
1978cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
1979cf8e5289SKyle Evans 	int fd;
1980cf8e5289SKyle Evans 
1981cf8e5289SKyle Evans 	fd = STDIN_FILENO;
1982cf8e5289SKyle Evans 	if (!isatty(fd))
1983cf8e5289SKyle Evans 		atf_tc_skip("stdin is not an fd");
1984cf8e5289SKyle Evans 
1985cf8e5289SKyle Evans 	ttyname_r(fd, __stack.__buf, __len);
1986cf8e5289SKyle Evans #undef BUF
1987cf8e5289SKyle Evans 
1988cf8e5289SKyle Evans }
1989cf8e5289SKyle Evans 
199009cdbf04SKyle Evans ATF_TC(ttyname_r_end);
ATF_TC_HEAD(ttyname_r_end,tc)199109cdbf04SKyle Evans ATF_TC_HEAD(ttyname_r_end, tc)
199209cdbf04SKyle Evans {
199309cdbf04SKyle Evans }
ATF_TC_BODY(ttyname_r_end,tc)1994cf8e5289SKyle Evans ATF_TC_BODY(ttyname_r_end, tc)
1995cf8e5289SKyle Evans {
1996cf8e5289SKyle Evans #define BUF &__stack.__buf
1997cf8e5289SKyle Evans 	struct {
1998cf8e5289SKyle Evans 		uint8_t padding_l;
1999cf8e5289SKyle Evans 		unsigned char __buf[42];
2000cf8e5289SKyle Evans 		uint8_t padding_r;
2001cf8e5289SKyle Evans 	} __stack;
2002cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(__stack.__buf);
2003cf8e5289SKyle Evans 	const size_t __len = 42;
2004cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
2005cf8e5289SKyle Evans 	int fd;
2006cf8e5289SKyle Evans 
2007cf8e5289SKyle Evans 	fd = STDIN_FILENO;
2008cf8e5289SKyle Evans 	if (!isatty(fd))
2009cf8e5289SKyle Evans 		atf_tc_skip("stdin is not an fd");
2010cf8e5289SKyle Evans 
2011cf8e5289SKyle Evans 	ttyname_r(fd, __stack.__buf, __len);
2012cf8e5289SKyle Evans #undef BUF
2013cf8e5289SKyle Evans 
2014cf8e5289SKyle Evans }
2015cf8e5289SKyle Evans 
201609cdbf04SKyle Evans ATF_TC(ttyname_r_heap_before_end);
ATF_TC_HEAD(ttyname_r_heap_before_end,tc)201709cdbf04SKyle Evans ATF_TC_HEAD(ttyname_r_heap_before_end, tc)
201809cdbf04SKyle Evans {
201909cdbf04SKyle Evans }
ATF_TC_BODY(ttyname_r_heap_before_end,tc)2020cf8e5289SKyle Evans ATF_TC_BODY(ttyname_r_heap_before_end, tc)
2021cf8e5289SKyle Evans {
2022cf8e5289SKyle Evans #define BUF __stack.__buf
2023cf8e5289SKyle Evans 	struct {
2024cf8e5289SKyle Evans 		uint8_t padding_l;
2025cf8e5289SKyle Evans 		unsigned char * __buf;
2026cf8e5289SKyle Evans 		uint8_t padding_r;
2027cf8e5289SKyle Evans 	} __stack;
2028cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
2029cf8e5289SKyle Evans 	const size_t __len = 42 - 1;
2030cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
2031cf8e5289SKyle Evans 	int fd;
2032cf8e5289SKyle Evans 
2033cf8e5289SKyle Evans 	fd = STDIN_FILENO;
2034cf8e5289SKyle Evans 	if (!isatty(fd))
2035cf8e5289SKyle Evans 		atf_tc_skip("stdin is not an fd");
2036cf8e5289SKyle Evans 
2037cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
2038cf8e5289SKyle Evans 
2039cf8e5289SKyle Evans 	ttyname_r(fd, __stack.__buf, __len);
2040cf8e5289SKyle Evans #undef BUF
2041cf8e5289SKyle Evans 
2042cf8e5289SKyle Evans }
2043cf8e5289SKyle Evans 
204409cdbf04SKyle Evans ATF_TC(ttyname_r_heap_end);
ATF_TC_HEAD(ttyname_r_heap_end,tc)204509cdbf04SKyle Evans ATF_TC_HEAD(ttyname_r_heap_end, tc)
204609cdbf04SKyle Evans {
204709cdbf04SKyle Evans }
ATF_TC_BODY(ttyname_r_heap_end,tc)2048cf8e5289SKyle Evans ATF_TC_BODY(ttyname_r_heap_end, tc)
2049cf8e5289SKyle Evans {
2050cf8e5289SKyle Evans #define BUF __stack.__buf
2051cf8e5289SKyle Evans 	struct {
2052cf8e5289SKyle Evans 		uint8_t padding_l;
2053cf8e5289SKyle Evans 		unsigned char * __buf;
2054cf8e5289SKyle Evans 		uint8_t padding_r;
2055cf8e5289SKyle Evans 	} __stack;
2056cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
2057cf8e5289SKyle Evans 	const size_t __len = 42;
2058cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
2059cf8e5289SKyle Evans 	int fd;
2060cf8e5289SKyle Evans 
2061cf8e5289SKyle Evans 	fd = STDIN_FILENO;
2062cf8e5289SKyle Evans 	if (!isatty(fd))
2063cf8e5289SKyle Evans 		atf_tc_skip("stdin is not an fd");
2064cf8e5289SKyle Evans 
2065cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
2066cf8e5289SKyle Evans 
2067cf8e5289SKyle Evans 	ttyname_r(fd, __stack.__buf, __len);
2068cf8e5289SKyle Evans #undef BUF
2069cf8e5289SKyle Evans 
2070cf8e5289SKyle Evans }
2071cf8e5289SKyle Evans 
207209cdbf04SKyle Evans ATF_TC(ttyname_r_heap_after_end);
ATF_TC_HEAD(ttyname_r_heap_after_end,tc)207309cdbf04SKyle Evans ATF_TC_HEAD(ttyname_r_heap_after_end, tc)
207409cdbf04SKyle Evans {
207509cdbf04SKyle Evans }
ATF_TC_BODY(ttyname_r_heap_after_end,tc)2076cf8e5289SKyle Evans ATF_TC_BODY(ttyname_r_heap_after_end, tc)
2077cf8e5289SKyle Evans {
2078cf8e5289SKyle Evans #define BUF __stack.__buf
2079cf8e5289SKyle Evans 	struct {
2080cf8e5289SKyle Evans 		uint8_t padding_l;
2081cf8e5289SKyle Evans 		unsigned char * __buf;
2082cf8e5289SKyle Evans 		uint8_t padding_r;
2083cf8e5289SKyle Evans 	} __stack;
2084cf8e5289SKyle Evans 	const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);
2085cf8e5289SKyle Evans 	const size_t __len = 42 + 1;
2086cf8e5289SKyle Evans 	const size_t __idx __unused = __len - 1;
2087cf8e5289SKyle Evans 	pid_t __child;
2088cf8e5289SKyle Evans 	int __status;
2089cf8e5289SKyle Evans 	int fd;
2090cf8e5289SKyle Evans 
2091cf8e5289SKyle Evans 	fd = STDIN_FILENO;
2092cf8e5289SKyle Evans 	if (!isatty(fd))
2093cf8e5289SKyle Evans 		atf_tc_skip("stdin is not an fd");
2094cf8e5289SKyle Evans 
2095cf8e5289SKyle Evans 	__child = fork();
2096cf8e5289SKyle Evans 	ATF_REQUIRE(__child >= 0);
2097cf8e5289SKyle Evans 	if (__child > 0)
2098cf8e5289SKyle Evans 		goto monitor;
2099cf8e5289SKyle Evans 
2100cf8e5289SKyle Evans 	/* Child */
2101cf8e5289SKyle Evans 	disable_coredumps();
2102cf8e5289SKyle Evans 	__stack.__buf = malloc(__bufsz);
2103cf8e5289SKyle Evans 
2104cf8e5289SKyle Evans 	ttyname_r(fd, __stack.__buf, __len);
2105cf8e5289SKyle Evans 	_exit(EX_SOFTWARE);	/* Should have aborted. */
2106cf8e5289SKyle Evans 
2107cf8e5289SKyle Evans monitor:
2108cf8e5289SKyle Evans 	while (waitpid(__child, &__status, 0) != __child) {
2109cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(EINTR, errno);
2110cf8e5289SKyle Evans 	}
2111cf8e5289SKyle Evans 
2112cf8e5289SKyle Evans 	if (!WIFSIGNALED(__status)) {
2113cf8e5289SKyle Evans 		switch (WEXITSTATUS(__status)) {
2114cf8e5289SKyle Evans 		case EX_SOFTWARE:
2115cf8e5289SKyle Evans 			atf_tc_fail("FORTIFY_SOURCE failed to abort");
2116cf8e5289SKyle Evans 			break;
2117cf8e5289SKyle Evans 		case EX_OSERR:
2118cf8e5289SKyle Evans 			atf_tc_fail("setrlimit(2) failed");
2119cf8e5289SKyle Evans 			break;
2120cf8e5289SKyle Evans 		default:
2121cf8e5289SKyle Evans 			atf_tc_fail("child exited with status %d",
2122cf8e5289SKyle Evans 			    WEXITSTATUS(__status));
2123cf8e5289SKyle Evans 		}
2124cf8e5289SKyle Evans 	} else {
2125cf8e5289SKyle Evans 		ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));
2126cf8e5289SKyle Evans 	}
2127cf8e5289SKyle Evans #undef BUF
2128cf8e5289SKyle Evans 
2129cf8e5289SKyle Evans }
2130cf8e5289SKyle Evans 
ATF_TP_ADD_TCS(tp)2131020d003cSKyle Evans ATF_TP_ADD_TCS(tp)
2132020d003cSKyle Evans {
2133020d003cSKyle Evans 	ATF_TP_ADD_TC(tp, getcwd_before_end);
2134020d003cSKyle Evans 	ATF_TP_ADD_TC(tp, getcwd_end);
2135020d003cSKyle Evans 	ATF_TP_ADD_TC(tp, getcwd_heap_before_end);
2136020d003cSKyle Evans 	ATF_TP_ADD_TC(tp, getcwd_heap_end);
2137020d003cSKyle Evans 	ATF_TP_ADD_TC(tp, getcwd_heap_after_end);
2138cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getgrouplist_before_end);
2139cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getgrouplist_end);
2140cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getgrouplist_heap_before_end);
2141cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getgrouplist_heap_end);
2142cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getgrouplist_heap_after_end);
2143cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getgroups_before_end);
2144cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getgroups_end);
2145cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getgroups_heap_before_end);
2146cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getgroups_heap_end);
2147cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getgroups_heap_after_end);
2148cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getloginclass_before_end);
2149cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getloginclass_end);
2150cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getloginclass_heap_before_end);
2151cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getloginclass_heap_end);
2152cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getloginclass_heap_after_end);
2153cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, pread_before_end);
2154cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, pread_end);
2155cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, pread_heap_before_end);
2156cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, pread_heap_end);
2157cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, pread_heap_after_end);
2158020d003cSKyle Evans 	ATF_TP_ADD_TC(tp, read_before_end);
2159020d003cSKyle Evans 	ATF_TP_ADD_TC(tp, read_end);
2160020d003cSKyle Evans 	ATF_TP_ADD_TC(tp, read_heap_before_end);
2161020d003cSKyle Evans 	ATF_TP_ADD_TC(tp, read_heap_end);
2162020d003cSKyle Evans 	ATF_TP_ADD_TC(tp, read_heap_after_end);
2163020d003cSKyle Evans 	ATF_TP_ADD_TC(tp, readlink_before_end);
2164020d003cSKyle Evans 	ATF_TP_ADD_TC(tp, readlink_end);
2165020d003cSKyle Evans 	ATF_TP_ADD_TC(tp, readlink_heap_before_end);
2166020d003cSKyle Evans 	ATF_TP_ADD_TC(tp, readlink_heap_end);
2167020d003cSKyle Evans 	ATF_TP_ADD_TC(tp, readlink_heap_after_end);
2168cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, readlinkat_before_end);
2169cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, readlinkat_end);
2170cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, readlinkat_heap_before_end);
2171cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, readlinkat_heap_end);
2172cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, readlinkat_heap_after_end);
2173cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getdomainname_before_end);
2174cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getdomainname_end);
2175cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getdomainname_heap_before_end);
2176cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getdomainname_heap_end);
2177cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getdomainname_heap_after_end);
2178cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getentropy_before_end);
2179cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getentropy_end);
2180cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getentropy_heap_before_end);
2181cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getentropy_heap_end);
2182cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getentropy_heap_after_end);
2183cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, gethostname_before_end);
2184cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, gethostname_end);
2185cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, gethostname_heap_before_end);
2186cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, gethostname_heap_end);
2187cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, gethostname_heap_after_end);
2188cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getlogin_r_before_end);
2189cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getlogin_r_end);
2190cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getlogin_r_heap_before_end);
2191cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getlogin_r_heap_end);
2192cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, getlogin_r_heap_after_end);
2193cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, ttyname_r_before_end);
2194cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, ttyname_r_end);
2195cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, ttyname_r_heap_before_end);
2196cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, ttyname_r_heap_end);
2197cf8e5289SKyle Evans 	ATF_TP_ADD_TC(tp, ttyname_r_heap_after_end);
2198020d003cSKyle Evans 	return (atf_no_error());
2199020d003cSKyle Evans }
2200