Path: blob/main/lib/libc/tests/secure/fortify_stdio_test.c
39553 views
/* @generated by `generate-fortify-tests.lua "stdio"` */12#define _FORTIFY_SOURCE 23#define TMPFILE_SIZE (1024 * 32)45#include <sys/param.h>6#include <sys/jail.h>7#include <sys/random.h>8#include <sys/resource.h>9#include <sys/select.h>10#include <sys/socket.h>11#include <sys/time.h>12#include <sys/uio.h>13#include <sys/wait.h>14#include <dirent.h>15#include <errno.h>16#include <fcntl.h>17#include <limits.h>18#include <poll.h>19#include <signal.h>20#include <stdio.h>21#include <stdlib.h>22#include <string.h>23#include <strings.h>24#include <sysexits.h>25#include <unistd.h>26#include <wchar.h>27#include <atf-c.h>2829static FILE * __unused30new_fp(size_t __len)31{32static char fpbuf[LINE_MAX];33FILE *fp;3435ATF_REQUIRE(__len <= sizeof(fpbuf));3637memset(fpbuf, 'A', sizeof(fpbuf) - 1);38fpbuf[sizeof(fpbuf) - 1] = '\0';3940fp = fmemopen(fpbuf, sizeof(fpbuf), "rb");41ATF_REQUIRE(fp != NULL);4243return (fp);44}4546/*47* Create a new symlink to use for readlink(2) style tests, we'll just use a48* random target name to have something interesting to look at.49*/50static const char * __unused51new_symlink(size_t __len)52{53static const char linkname[] = "link";54char target[MAXNAMLEN];55int error;5657ATF_REQUIRE(__len <= sizeof(target));5859arc4random_buf(target, sizeof(target));6061error = unlink(linkname);62ATF_REQUIRE(error == 0 || errno == ENOENT);6364error = symlink(target, linkname);65ATF_REQUIRE(error == 0);6667return (linkname);68}6970/*71* For our purposes, first descriptor will be the reader; we'll send both72* raw data and a control message over it so that the result can be used for73* any of our recv*() tests.74*/75static void __unused76new_socket(int sock[2])77{78unsigned char ctrl[CMSG_SPACE(sizeof(int))] = { 0 };79static char sockbuf[256];80ssize_t rv;81size_t total = 0;82struct msghdr hdr = { 0 };83struct cmsghdr *cmsg;84int error, fd;8586error = socketpair(AF_UNIX, SOCK_STREAM, 0, sock);87ATF_REQUIRE(error == 0);8889while (total != sizeof(sockbuf)) {90rv = send(sock[1], &sockbuf[total], sizeof(sockbuf) - total, 0);9192ATF_REQUIRE_MSG(rv > 0,93"expected bytes sent, got %zd with %zu left (size %zu, total %zu)",94rv, sizeof(sockbuf) - total, sizeof(sockbuf), total);95ATF_REQUIRE_MSG(total + (size_t)rv <= sizeof(sockbuf),96"%zd exceeds total %zu", rv, sizeof(sockbuf));97total += rv;98}99100hdr.msg_control = ctrl;101hdr.msg_controllen = sizeof(ctrl);102103cmsg = CMSG_FIRSTHDR(&hdr);104cmsg->cmsg_level = SOL_SOCKET;105cmsg->cmsg_type = SCM_RIGHTS;106cmsg->cmsg_len = CMSG_LEN(sizeof(fd));107fd = STDIN_FILENO;108memcpy(CMSG_DATA(cmsg), &fd, sizeof(fd));109110error = sendmsg(sock[1], &hdr, 0);111ATF_REQUIRE(error != -1);112}113114/*115* Constructs a tmpfile that we can use for testing read(2) and friends.116*/117static int __unused118new_tmpfile(void)119{120char buf[1024];121ssize_t rv;122size_t written;123int fd;124125fd = open("tmpfile", O_RDWR | O_CREAT | O_TRUNC, 0644);126ATF_REQUIRE(fd >= 0);127128written = 0;129while (written < TMPFILE_SIZE) {130rv = write(fd, buf, sizeof(buf));131ATF_REQUIRE(rv > 0);132133written += rv;134}135136ATF_REQUIRE_EQ(0, lseek(fd, 0, SEEK_SET));137return (fd);138}139140static void141disable_coredumps(void)142{143struct rlimit rl = { 0 };144145if (setrlimit(RLIMIT_CORE, &rl) == -1)146_exit(EX_OSERR);147}148149/*150* Replaces stdin with a file that we can actually read from, for tests where151* we want a FILE * or fd that we can get data from.152*/153static void __unused154replace_stdin(void)155{156int fd;157158fd = new_tmpfile();159160(void)dup2(fd, STDIN_FILENO);161if (fd != STDIN_FILENO)162close(fd);163}164165ATF_TC(ctermid_before_end);166ATF_TC_HEAD(ctermid_before_end, tc)167{168}169ATF_TC_BODY(ctermid_before_end, tc)170{171#define BUF &__stack.__buf172struct {173uint8_t padding_l;174unsigned char __buf[L_ctermid + 1];175uint8_t padding_r;176} __stack;177const size_t __bufsz __unused = sizeof(__stack.__buf);178const size_t __len = L_ctermid + 1;179const size_t __idx __unused = __len - 1;180181ctermid(__stack.__buf);182#undef BUF183184}185186ATF_TC(ctermid_end);187ATF_TC_HEAD(ctermid_end, tc)188{189}190ATF_TC_BODY(ctermid_end, tc)191{192#define BUF &__stack.__buf193struct {194uint8_t padding_l;195unsigned char __buf[L_ctermid];196uint8_t padding_r;197} __stack;198const size_t __bufsz __unused = sizeof(__stack.__buf);199const size_t __len = L_ctermid;200const size_t __idx __unused = __len - 1;201202ctermid(__stack.__buf);203#undef BUF204205}206207ATF_TC(ctermid_heap_before_end);208ATF_TC_HEAD(ctermid_heap_before_end, tc)209{210}211ATF_TC_BODY(ctermid_heap_before_end, tc)212{213#define BUF __stack.__buf214struct {215uint8_t padding_l;216unsigned char * __buf;217uint8_t padding_r;218} __stack;219const size_t __bufsz __unused = sizeof(*__stack.__buf) * (L_ctermid + 1);220const size_t __len = L_ctermid + 1;221const size_t __idx __unused = __len - 1;222223__stack.__buf = malloc(__bufsz);224225ctermid(__stack.__buf);226#undef BUF227228}229230ATF_TC(ctermid_heap_end);231ATF_TC_HEAD(ctermid_heap_end, tc)232{233}234ATF_TC_BODY(ctermid_heap_end, tc)235{236#define BUF __stack.__buf237struct {238uint8_t padding_l;239unsigned char * __buf;240uint8_t padding_r;241} __stack;242const size_t __bufsz __unused = sizeof(*__stack.__buf) * (L_ctermid);243const size_t __len = L_ctermid;244const size_t __idx __unused = __len - 1;245246__stack.__buf = malloc(__bufsz);247248ctermid(__stack.__buf);249#undef BUF250251}252253ATF_TC(ctermid_heap_after_end);254ATF_TC_HEAD(ctermid_heap_after_end, tc)255{256}257ATF_TC_BODY(ctermid_heap_after_end, tc)258{259#define BUF __stack.__buf260struct {261uint8_t padding_l;262unsigned char * __buf;263uint8_t padding_r;264} __stack;265const size_t __bufsz __unused = sizeof(*__stack.__buf) * (L_ctermid - 1);266const size_t __len = L_ctermid - 1;267const size_t __idx __unused = __len - 1;268pid_t __child;269int __status;270271__child = fork();272ATF_REQUIRE(__child >= 0);273if (__child > 0)274goto monitor;275276/* Child */277disable_coredumps();278__stack.__buf = malloc(__bufsz);279280ctermid(__stack.__buf);281_exit(EX_SOFTWARE); /* Should have aborted. */282283monitor:284while (waitpid(__child, &__status, 0) != __child) {285ATF_REQUIRE_EQ(EINTR, errno);286}287288if (!WIFSIGNALED(__status)) {289switch (WEXITSTATUS(__status)) {290case EX_SOFTWARE:291atf_tc_fail("FORTIFY_SOURCE failed to abort");292break;293case EX_OSERR:294atf_tc_fail("setrlimit(2) failed");295break;296default:297atf_tc_fail("child exited with status %d",298WEXITSTATUS(__status));299}300} else {301ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));302}303#undef BUF304305}306307ATF_TC(ctermid_r_before_end);308ATF_TC_HEAD(ctermid_r_before_end, tc)309{310}311ATF_TC_BODY(ctermid_r_before_end, tc)312{313#define BUF &__stack.__buf314struct {315uint8_t padding_l;316unsigned char __buf[L_ctermid + 1];317uint8_t padding_r;318} __stack;319const size_t __bufsz __unused = sizeof(__stack.__buf);320const size_t __len = L_ctermid + 1;321const size_t __idx __unused = __len - 1;322323ctermid_r(__stack.__buf);324#undef BUF325326}327328ATF_TC(ctermid_r_end);329ATF_TC_HEAD(ctermid_r_end, tc)330{331}332ATF_TC_BODY(ctermid_r_end, tc)333{334#define BUF &__stack.__buf335struct {336uint8_t padding_l;337unsigned char __buf[L_ctermid];338uint8_t padding_r;339} __stack;340const size_t __bufsz __unused = sizeof(__stack.__buf);341const size_t __len = L_ctermid;342const size_t __idx __unused = __len - 1;343344ctermid_r(__stack.__buf);345#undef BUF346347}348349ATF_TC(ctermid_r_heap_before_end);350ATF_TC_HEAD(ctermid_r_heap_before_end, tc)351{352}353ATF_TC_BODY(ctermid_r_heap_before_end, tc)354{355#define BUF __stack.__buf356struct {357uint8_t padding_l;358unsigned char * __buf;359uint8_t padding_r;360} __stack;361const size_t __bufsz __unused = sizeof(*__stack.__buf) * (L_ctermid + 1);362const size_t __len = L_ctermid + 1;363const size_t __idx __unused = __len - 1;364365__stack.__buf = malloc(__bufsz);366367ctermid_r(__stack.__buf);368#undef BUF369370}371372ATF_TC(ctermid_r_heap_end);373ATF_TC_HEAD(ctermid_r_heap_end, tc)374{375}376ATF_TC_BODY(ctermid_r_heap_end, tc)377{378#define BUF __stack.__buf379struct {380uint8_t padding_l;381unsigned char * __buf;382uint8_t padding_r;383} __stack;384const size_t __bufsz __unused = sizeof(*__stack.__buf) * (L_ctermid);385const size_t __len = L_ctermid;386const size_t __idx __unused = __len - 1;387388__stack.__buf = malloc(__bufsz);389390ctermid_r(__stack.__buf);391#undef BUF392393}394395ATF_TC(ctermid_r_heap_after_end);396ATF_TC_HEAD(ctermid_r_heap_after_end, tc)397{398}399ATF_TC_BODY(ctermid_r_heap_after_end, tc)400{401#define BUF __stack.__buf402struct {403uint8_t padding_l;404unsigned char * __buf;405uint8_t padding_r;406} __stack;407const size_t __bufsz __unused = sizeof(*__stack.__buf) * (L_ctermid - 1);408const size_t __len = L_ctermid - 1;409const size_t __idx __unused = __len - 1;410pid_t __child;411int __status;412413__child = fork();414ATF_REQUIRE(__child >= 0);415if (__child > 0)416goto monitor;417418/* Child */419disable_coredumps();420__stack.__buf = malloc(__bufsz);421422ctermid_r(__stack.__buf);423_exit(EX_SOFTWARE); /* Should have aborted. */424425monitor:426while (waitpid(__child, &__status, 0) != __child) {427ATF_REQUIRE_EQ(EINTR, errno);428}429430if (!WIFSIGNALED(__status)) {431switch (WEXITSTATUS(__status)) {432case EX_SOFTWARE:433atf_tc_fail("FORTIFY_SOURCE failed to abort");434break;435case EX_OSERR:436atf_tc_fail("setrlimit(2) failed");437break;438default:439atf_tc_fail("child exited with status %d",440WEXITSTATUS(__status));441}442} else {443ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));444}445#undef BUF446447}448449ATF_TC(fread_before_end);450ATF_TC_HEAD(fread_before_end, tc)451{452}453ATF_TC_BODY(fread_before_end, tc)454{455#define BUF &__stack.__buf456struct {457uint8_t padding_l;458unsigned char __buf[42];459uint8_t padding_r;460} __stack;461const size_t __bufsz __unused = sizeof(__stack.__buf);462const size_t __len = 42 - 1;463const size_t __idx __unused = __len - 1;464465replace_stdin();466467fread(__stack.__buf, __len, 1, stdin);468#undef BUF469470}471472ATF_TC(fread_end);473ATF_TC_HEAD(fread_end, tc)474{475}476ATF_TC_BODY(fread_end, tc)477{478#define BUF &__stack.__buf479struct {480uint8_t padding_l;481unsigned char __buf[42];482uint8_t padding_r;483} __stack;484const size_t __bufsz __unused = sizeof(__stack.__buf);485const size_t __len = 42;486const size_t __idx __unused = __len - 1;487488replace_stdin();489490fread(__stack.__buf, __len, 1, stdin);491#undef BUF492493}494495ATF_TC(fread_heap_before_end);496ATF_TC_HEAD(fread_heap_before_end, tc)497{498}499ATF_TC_BODY(fread_heap_before_end, tc)500{501#define BUF __stack.__buf502struct {503uint8_t padding_l;504unsigned char * __buf;505uint8_t padding_r;506} __stack;507const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);508const size_t __len = 42 - 1;509const size_t __idx __unused = __len - 1;510511__stack.__buf = malloc(__bufsz);512replace_stdin();513514fread(__stack.__buf, __len, 1, stdin);515#undef BUF516517}518519ATF_TC(fread_heap_end);520ATF_TC_HEAD(fread_heap_end, tc)521{522}523ATF_TC_BODY(fread_heap_end, tc)524{525#define BUF __stack.__buf526struct {527uint8_t padding_l;528unsigned char * __buf;529uint8_t padding_r;530} __stack;531const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);532const size_t __len = 42;533const size_t __idx __unused = __len - 1;534535__stack.__buf = malloc(__bufsz);536replace_stdin();537538fread(__stack.__buf, __len, 1, stdin);539#undef BUF540541}542543ATF_TC(fread_heap_after_end);544ATF_TC_HEAD(fread_heap_after_end, tc)545{546}547ATF_TC_BODY(fread_heap_after_end, tc)548{549#define BUF __stack.__buf550struct {551uint8_t padding_l;552unsigned char * __buf;553uint8_t padding_r;554} __stack;555const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);556const size_t __len = 42 + 1;557const size_t __idx __unused = __len - 1;558pid_t __child;559int __status;560561__child = fork();562ATF_REQUIRE(__child >= 0);563if (__child > 0)564goto monitor;565566/* Child */567disable_coredumps();568__stack.__buf = malloc(__bufsz);569replace_stdin();570571fread(__stack.__buf, __len, 1, stdin);572_exit(EX_SOFTWARE); /* Should have aborted. */573574monitor:575while (waitpid(__child, &__status, 0) != __child) {576ATF_REQUIRE_EQ(EINTR, errno);577}578579if (!WIFSIGNALED(__status)) {580switch (WEXITSTATUS(__status)) {581case EX_SOFTWARE:582atf_tc_fail("FORTIFY_SOURCE failed to abort");583break;584case EX_OSERR:585atf_tc_fail("setrlimit(2) failed");586break;587default:588atf_tc_fail("child exited with status %d",589WEXITSTATUS(__status));590}591} else {592ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));593}594#undef BUF595596}597598ATF_TC(fread_unlocked_before_end);599ATF_TC_HEAD(fread_unlocked_before_end, tc)600{601}602ATF_TC_BODY(fread_unlocked_before_end, tc)603{604#define BUF &__stack.__buf605struct {606uint8_t padding_l;607unsigned char __buf[42];608uint8_t padding_r;609} __stack;610const size_t __bufsz __unused = sizeof(__stack.__buf);611const size_t __len = 42 - 1;612const size_t __idx __unused = __len - 1;613614replace_stdin();615616fread_unlocked(__stack.__buf, __len, 1, stdin);617#undef BUF618619}620621ATF_TC(fread_unlocked_end);622ATF_TC_HEAD(fread_unlocked_end, tc)623{624}625ATF_TC_BODY(fread_unlocked_end, tc)626{627#define BUF &__stack.__buf628struct {629uint8_t padding_l;630unsigned char __buf[42];631uint8_t padding_r;632} __stack;633const size_t __bufsz __unused = sizeof(__stack.__buf);634const size_t __len = 42;635const size_t __idx __unused = __len - 1;636637replace_stdin();638639fread_unlocked(__stack.__buf, __len, 1, stdin);640#undef BUF641642}643644ATF_TC(fread_unlocked_heap_before_end);645ATF_TC_HEAD(fread_unlocked_heap_before_end, tc)646{647}648ATF_TC_BODY(fread_unlocked_heap_before_end, tc)649{650#define BUF __stack.__buf651struct {652uint8_t padding_l;653unsigned char * __buf;654uint8_t padding_r;655} __stack;656const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);657const size_t __len = 42 - 1;658const size_t __idx __unused = __len - 1;659660__stack.__buf = malloc(__bufsz);661replace_stdin();662663fread_unlocked(__stack.__buf, __len, 1, stdin);664#undef BUF665666}667668ATF_TC(fread_unlocked_heap_end);669ATF_TC_HEAD(fread_unlocked_heap_end, tc)670{671}672ATF_TC_BODY(fread_unlocked_heap_end, tc)673{674#define BUF __stack.__buf675struct {676uint8_t padding_l;677unsigned char * __buf;678uint8_t padding_r;679} __stack;680const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);681const size_t __len = 42;682const size_t __idx __unused = __len - 1;683684__stack.__buf = malloc(__bufsz);685replace_stdin();686687fread_unlocked(__stack.__buf, __len, 1, stdin);688#undef BUF689690}691692ATF_TC(fread_unlocked_heap_after_end);693ATF_TC_HEAD(fread_unlocked_heap_after_end, tc)694{695}696ATF_TC_BODY(fread_unlocked_heap_after_end, tc)697{698#define BUF __stack.__buf699struct {700uint8_t padding_l;701unsigned char * __buf;702uint8_t padding_r;703} __stack;704const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);705const size_t __len = 42 + 1;706const size_t __idx __unused = __len - 1;707pid_t __child;708int __status;709710__child = fork();711ATF_REQUIRE(__child >= 0);712if (__child > 0)713goto monitor;714715/* Child */716disable_coredumps();717__stack.__buf = malloc(__bufsz);718replace_stdin();719720fread_unlocked(__stack.__buf, __len, 1, stdin);721_exit(EX_SOFTWARE); /* Should have aborted. */722723monitor:724while (waitpid(__child, &__status, 0) != __child) {725ATF_REQUIRE_EQ(EINTR, errno);726}727728if (!WIFSIGNALED(__status)) {729switch (WEXITSTATUS(__status)) {730case EX_SOFTWARE:731atf_tc_fail("FORTIFY_SOURCE failed to abort");732break;733case EX_OSERR:734atf_tc_fail("setrlimit(2) failed");735break;736default:737atf_tc_fail("child exited with status %d",738WEXITSTATUS(__status));739}740} else {741ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));742}743#undef BUF744745}746747ATF_TC(gets_s_before_end);748ATF_TC_HEAD(gets_s_before_end, tc)749{750}751ATF_TC_BODY(gets_s_before_end, tc)752{753#define BUF &__stack.__buf754struct {755uint8_t padding_l;756unsigned char __buf[42];757uint8_t padding_r;758} __stack;759const size_t __bufsz __unused = sizeof(__stack.__buf);760const size_t __len = 42 - 1;761const size_t __idx __unused = __len - 1;762763replace_stdin();764765gets_s(__stack.__buf, __len);766#undef BUF767768}769770ATF_TC(gets_s_end);771ATF_TC_HEAD(gets_s_end, tc)772{773}774ATF_TC_BODY(gets_s_end, tc)775{776#define BUF &__stack.__buf777struct {778uint8_t padding_l;779unsigned char __buf[42];780uint8_t padding_r;781} __stack;782const size_t __bufsz __unused = sizeof(__stack.__buf);783const size_t __len = 42;784const size_t __idx __unused = __len - 1;785786replace_stdin();787788gets_s(__stack.__buf, __len);789#undef BUF790791}792793ATF_TC(gets_s_heap_before_end);794ATF_TC_HEAD(gets_s_heap_before_end, tc)795{796}797ATF_TC_BODY(gets_s_heap_before_end, tc)798{799#define BUF __stack.__buf800struct {801uint8_t padding_l;802unsigned char * __buf;803uint8_t padding_r;804} __stack;805const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);806const size_t __len = 42 - 1;807const size_t __idx __unused = __len - 1;808809__stack.__buf = malloc(__bufsz);810replace_stdin();811812gets_s(__stack.__buf, __len);813#undef BUF814815}816817ATF_TC(gets_s_heap_end);818ATF_TC_HEAD(gets_s_heap_end, tc)819{820}821ATF_TC_BODY(gets_s_heap_end, tc)822{823#define BUF __stack.__buf824struct {825uint8_t padding_l;826unsigned char * __buf;827uint8_t padding_r;828} __stack;829const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);830const size_t __len = 42;831const size_t __idx __unused = __len - 1;832833__stack.__buf = malloc(__bufsz);834replace_stdin();835836gets_s(__stack.__buf, __len);837#undef BUF838839}840841ATF_TC(gets_s_heap_after_end);842ATF_TC_HEAD(gets_s_heap_after_end, tc)843{844}845ATF_TC_BODY(gets_s_heap_after_end, tc)846{847#define BUF __stack.__buf848struct {849uint8_t padding_l;850unsigned char * __buf;851uint8_t padding_r;852} __stack;853const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);854const size_t __len = 42 + 1;855const size_t __idx __unused = __len - 1;856pid_t __child;857int __status;858859__child = fork();860ATF_REQUIRE(__child >= 0);861if (__child > 0)862goto monitor;863864/* Child */865disable_coredumps();866__stack.__buf = malloc(__bufsz);867replace_stdin();868869gets_s(__stack.__buf, __len);870_exit(EX_SOFTWARE); /* Should have aborted. */871872monitor:873while (waitpid(__child, &__status, 0) != __child) {874ATF_REQUIRE_EQ(EINTR, errno);875}876877if (!WIFSIGNALED(__status)) {878switch (WEXITSTATUS(__status)) {879case EX_SOFTWARE:880atf_tc_fail("FORTIFY_SOURCE failed to abort");881break;882case EX_OSERR:883atf_tc_fail("setrlimit(2) failed");884break;885default:886atf_tc_fail("child exited with status %d",887WEXITSTATUS(__status));888}889} else {890ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));891}892#undef BUF893894}895896ATF_TC(sprintf_before_end);897ATF_TC_HEAD(sprintf_before_end, tc)898{899}900ATF_TC_BODY(sprintf_before_end, tc)901{902#define BUF &__stack.__buf903struct {904uint8_t padding_l;905unsigned char __buf[42];906uint8_t padding_r;907} __stack;908const size_t __bufsz __unused = sizeof(__stack.__buf);909const size_t __len = 42 - 1;910const size_t __idx __unused = __len - 1;911char srcvar[__len + 10];912913memset(srcvar, 'A', sizeof(srcvar) - 1);914srcvar[sizeof(srcvar) - 1] = '\0';915916sprintf(__stack.__buf, "%.*s", (int)__len - 1, srcvar);917#undef BUF918919}920921ATF_TC(sprintf_end);922ATF_TC_HEAD(sprintf_end, tc)923{924}925ATF_TC_BODY(sprintf_end, tc)926{927#define BUF &__stack.__buf928struct {929uint8_t padding_l;930unsigned char __buf[42];931uint8_t padding_r;932} __stack;933const size_t __bufsz __unused = sizeof(__stack.__buf);934const size_t __len = 42;935const size_t __idx __unused = __len - 1;936char srcvar[__len + 10];937938memset(srcvar, 'A', sizeof(srcvar) - 1);939srcvar[sizeof(srcvar) - 1] = '\0';940941sprintf(__stack.__buf, "%.*s", (int)__len - 1, srcvar);942#undef BUF943944}945946ATF_TC(sprintf_heap_before_end);947ATF_TC_HEAD(sprintf_heap_before_end, tc)948{949}950ATF_TC_BODY(sprintf_heap_before_end, tc)951{952#define BUF __stack.__buf953struct {954uint8_t padding_l;955unsigned char * __buf;956uint8_t padding_r;957} __stack;958const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);959const size_t __len = 42 - 1;960const size_t __idx __unused = __len - 1;961char srcvar[__len + 10];962963__stack.__buf = malloc(__bufsz);964memset(srcvar, 'A', sizeof(srcvar) - 1);965srcvar[sizeof(srcvar) - 1] = '\0';966967sprintf(__stack.__buf, "%.*s", (int)__len - 1, srcvar);968#undef BUF969970}971972ATF_TC(sprintf_heap_end);973ATF_TC_HEAD(sprintf_heap_end, tc)974{975}976ATF_TC_BODY(sprintf_heap_end, tc)977{978#define BUF __stack.__buf979struct {980uint8_t padding_l;981unsigned char * __buf;982uint8_t padding_r;983} __stack;984const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);985const size_t __len = 42;986const size_t __idx __unused = __len - 1;987char srcvar[__len + 10];988989__stack.__buf = malloc(__bufsz);990memset(srcvar, 'A', sizeof(srcvar) - 1);991srcvar[sizeof(srcvar) - 1] = '\0';992993sprintf(__stack.__buf, "%.*s", (int)__len - 1, srcvar);994#undef BUF995996}997998ATF_TC(sprintf_heap_after_end);999ATF_TC_HEAD(sprintf_heap_after_end, tc)1000{1001}1002ATF_TC_BODY(sprintf_heap_after_end, tc)1003{1004#define BUF __stack.__buf1005struct {1006uint8_t padding_l;1007unsigned char * __buf;1008uint8_t padding_r;1009} __stack;1010const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1011const size_t __len = 42 + 1;1012const size_t __idx __unused = __len - 1;1013pid_t __child;1014int __status;1015char srcvar[__len + 10];10161017__child = fork();1018ATF_REQUIRE(__child >= 0);1019if (__child > 0)1020goto monitor;10211022/* Child */1023disable_coredumps();1024__stack.__buf = malloc(__bufsz);1025memset(srcvar, 'A', sizeof(srcvar) - 1);1026srcvar[sizeof(srcvar) - 1] = '\0';10271028sprintf(__stack.__buf, "%.*s", (int)__len - 1, srcvar);1029_exit(EX_SOFTWARE); /* Should have aborted. */10301031monitor:1032while (waitpid(__child, &__status, 0) != __child) {1033ATF_REQUIRE_EQ(EINTR, errno);1034}10351036if (!WIFSIGNALED(__status)) {1037switch (WEXITSTATUS(__status)) {1038case EX_SOFTWARE:1039atf_tc_fail("FORTIFY_SOURCE failed to abort");1040break;1041case EX_OSERR:1042atf_tc_fail("setrlimit(2) failed");1043break;1044default:1045atf_tc_fail("child exited with status %d",1046WEXITSTATUS(__status));1047}1048} else {1049ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));1050}1051#undef BUF10521053}10541055ATF_TC(snprintf_before_end);1056ATF_TC_HEAD(snprintf_before_end, tc)1057{1058}1059ATF_TC_BODY(snprintf_before_end, tc)1060{1061#define BUF &__stack.__buf1062struct {1063uint8_t padding_l;1064unsigned char __buf[42];1065uint8_t padding_r;1066} __stack;1067const size_t __bufsz __unused = sizeof(__stack.__buf);1068const size_t __len = 42 - 1;1069const size_t __idx __unused = __len - 1;1070char srcvar[__len + 10];10711072memset(srcvar, 'A', sizeof(srcvar) - 1);1073srcvar[sizeof(srcvar) - 1] = '\0';10741075snprintf(__stack.__buf, __len, "%.*s", (int)__len - 1, srcvar);1076#undef BUF10771078}10791080ATF_TC(snprintf_end);1081ATF_TC_HEAD(snprintf_end, tc)1082{1083}1084ATF_TC_BODY(snprintf_end, tc)1085{1086#define BUF &__stack.__buf1087struct {1088uint8_t padding_l;1089unsigned char __buf[42];1090uint8_t padding_r;1091} __stack;1092const size_t __bufsz __unused = sizeof(__stack.__buf);1093const size_t __len = 42;1094const size_t __idx __unused = __len - 1;1095char srcvar[__len + 10];10961097memset(srcvar, 'A', sizeof(srcvar) - 1);1098srcvar[sizeof(srcvar) - 1] = '\0';10991100snprintf(__stack.__buf, __len, "%.*s", (int)__len - 1, srcvar);1101#undef BUF11021103}11041105ATF_TC(snprintf_heap_before_end);1106ATF_TC_HEAD(snprintf_heap_before_end, tc)1107{1108}1109ATF_TC_BODY(snprintf_heap_before_end, tc)1110{1111#define BUF __stack.__buf1112struct {1113uint8_t padding_l;1114unsigned char * __buf;1115uint8_t padding_r;1116} __stack;1117const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1118const size_t __len = 42 - 1;1119const size_t __idx __unused = __len - 1;1120char srcvar[__len + 10];11211122__stack.__buf = malloc(__bufsz);1123memset(srcvar, 'A', sizeof(srcvar) - 1);1124srcvar[sizeof(srcvar) - 1] = '\0';11251126snprintf(__stack.__buf, __len, "%.*s", (int)__len - 1, srcvar);1127#undef BUF11281129}11301131ATF_TC(snprintf_heap_end);1132ATF_TC_HEAD(snprintf_heap_end, tc)1133{1134}1135ATF_TC_BODY(snprintf_heap_end, tc)1136{1137#define BUF __stack.__buf1138struct {1139uint8_t padding_l;1140unsigned char * __buf;1141uint8_t padding_r;1142} __stack;1143const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1144const size_t __len = 42;1145const size_t __idx __unused = __len - 1;1146char srcvar[__len + 10];11471148__stack.__buf = malloc(__bufsz);1149memset(srcvar, 'A', sizeof(srcvar) - 1);1150srcvar[sizeof(srcvar) - 1] = '\0';11511152snprintf(__stack.__buf, __len, "%.*s", (int)__len - 1, srcvar);1153#undef BUF11541155}11561157ATF_TC(snprintf_heap_after_end);1158ATF_TC_HEAD(snprintf_heap_after_end, tc)1159{1160}1161ATF_TC_BODY(snprintf_heap_after_end, tc)1162{1163#define BUF __stack.__buf1164struct {1165uint8_t padding_l;1166unsigned char * __buf;1167uint8_t padding_r;1168} __stack;1169const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1170const size_t __len = 42 + 1;1171const size_t __idx __unused = __len - 1;1172pid_t __child;1173int __status;1174char srcvar[__len + 10];11751176__child = fork();1177ATF_REQUIRE(__child >= 0);1178if (__child > 0)1179goto monitor;11801181/* Child */1182disable_coredumps();1183__stack.__buf = malloc(__bufsz);1184memset(srcvar, 'A', sizeof(srcvar) - 1);1185srcvar[sizeof(srcvar) - 1] = '\0';11861187snprintf(__stack.__buf, __len, "%.*s", (int)__len - 1, srcvar);1188_exit(EX_SOFTWARE); /* Should have aborted. */11891190monitor:1191while (waitpid(__child, &__status, 0) != __child) {1192ATF_REQUIRE_EQ(EINTR, errno);1193}11941195if (!WIFSIGNALED(__status)) {1196switch (WEXITSTATUS(__status)) {1197case EX_SOFTWARE:1198atf_tc_fail("FORTIFY_SOURCE failed to abort");1199break;1200case EX_OSERR:1201atf_tc_fail("setrlimit(2) failed");1202break;1203default:1204atf_tc_fail("child exited with status %d",1205WEXITSTATUS(__status));1206}1207} else {1208ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));1209}1210#undef BUF12111212}12131214ATF_TC(tmpnam_before_end);1215ATF_TC_HEAD(tmpnam_before_end, tc)1216{1217}1218ATF_TC_BODY(tmpnam_before_end, tc)1219{1220#define BUF &__stack.__buf1221struct {1222uint8_t padding_l;1223unsigned char __buf[L_tmpnam + 1];1224uint8_t padding_r;1225} __stack;1226const size_t __bufsz __unused = sizeof(__stack.__buf);1227const size_t __len = L_tmpnam + 1;1228const size_t __idx __unused = __len - 1;12291230tmpnam(__stack.__buf);1231#undef BUF12321233}12341235ATF_TC(tmpnam_end);1236ATF_TC_HEAD(tmpnam_end, tc)1237{1238}1239ATF_TC_BODY(tmpnam_end, tc)1240{1241#define BUF &__stack.__buf1242struct {1243uint8_t padding_l;1244unsigned char __buf[L_tmpnam];1245uint8_t padding_r;1246} __stack;1247const size_t __bufsz __unused = sizeof(__stack.__buf);1248const size_t __len = L_tmpnam;1249const size_t __idx __unused = __len - 1;12501251tmpnam(__stack.__buf);1252#undef BUF12531254}12551256ATF_TC(tmpnam_heap_before_end);1257ATF_TC_HEAD(tmpnam_heap_before_end, tc)1258{1259}1260ATF_TC_BODY(tmpnam_heap_before_end, tc)1261{1262#define BUF __stack.__buf1263struct {1264uint8_t padding_l;1265unsigned char * __buf;1266uint8_t padding_r;1267} __stack;1268const size_t __bufsz __unused = sizeof(*__stack.__buf) * (L_tmpnam + 1);1269const size_t __len = L_tmpnam + 1;1270const size_t __idx __unused = __len - 1;12711272__stack.__buf = malloc(__bufsz);12731274tmpnam(__stack.__buf);1275#undef BUF12761277}12781279ATF_TC(tmpnam_heap_end);1280ATF_TC_HEAD(tmpnam_heap_end, tc)1281{1282}1283ATF_TC_BODY(tmpnam_heap_end, tc)1284{1285#define BUF __stack.__buf1286struct {1287uint8_t padding_l;1288unsigned char * __buf;1289uint8_t padding_r;1290} __stack;1291const size_t __bufsz __unused = sizeof(*__stack.__buf) * (L_tmpnam);1292const size_t __len = L_tmpnam;1293const size_t __idx __unused = __len - 1;12941295__stack.__buf = malloc(__bufsz);12961297tmpnam(__stack.__buf);1298#undef BUF12991300}13011302ATF_TC(tmpnam_heap_after_end);1303ATF_TC_HEAD(tmpnam_heap_after_end, tc)1304{1305}1306ATF_TC_BODY(tmpnam_heap_after_end, tc)1307{1308#define BUF __stack.__buf1309struct {1310uint8_t padding_l;1311unsigned char * __buf;1312uint8_t padding_r;1313} __stack;1314const size_t __bufsz __unused = sizeof(*__stack.__buf) * (L_tmpnam - 1);1315const size_t __len = L_tmpnam - 1;1316const size_t __idx __unused = __len - 1;1317pid_t __child;1318int __status;13191320__child = fork();1321ATF_REQUIRE(__child >= 0);1322if (__child > 0)1323goto monitor;13241325/* Child */1326disable_coredumps();1327__stack.__buf = malloc(__bufsz);13281329tmpnam(__stack.__buf);1330_exit(EX_SOFTWARE); /* Should have aborted. */13311332monitor:1333while (waitpid(__child, &__status, 0) != __child) {1334ATF_REQUIRE_EQ(EINTR, errno);1335}13361337if (!WIFSIGNALED(__status)) {1338switch (WEXITSTATUS(__status)) {1339case EX_SOFTWARE:1340atf_tc_fail("FORTIFY_SOURCE failed to abort");1341break;1342case EX_OSERR:1343atf_tc_fail("setrlimit(2) failed");1344break;1345default:1346atf_tc_fail("child exited with status %d",1347WEXITSTATUS(__status));1348}1349} else {1350ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));1351}1352#undef BUF13531354}13551356ATF_TC(fgets_before_end);1357ATF_TC_HEAD(fgets_before_end, tc)1358{1359}1360ATF_TC_BODY(fgets_before_end, tc)1361{1362#define BUF &__stack.__buf1363struct {1364uint8_t padding_l;1365unsigned char __buf[42];1366uint8_t padding_r;1367} __stack;1368const size_t __bufsz __unused = sizeof(__stack.__buf);1369const size_t __len = 42 - 1;1370const size_t __idx __unused = __len - 1;1371FILE *fp;13721373fp = new_fp(__len);13741375fgets(__stack.__buf, __len, fp);1376#undef BUF13771378}13791380ATF_TC(fgets_end);1381ATF_TC_HEAD(fgets_end, tc)1382{1383}1384ATF_TC_BODY(fgets_end, tc)1385{1386#define BUF &__stack.__buf1387struct {1388uint8_t padding_l;1389unsigned char __buf[42];1390uint8_t padding_r;1391} __stack;1392const size_t __bufsz __unused = sizeof(__stack.__buf);1393const size_t __len = 42;1394const size_t __idx __unused = __len - 1;1395FILE *fp;13961397fp = new_fp(__len);13981399fgets(__stack.__buf, __len, fp);1400#undef BUF14011402}14031404ATF_TC(fgets_heap_before_end);1405ATF_TC_HEAD(fgets_heap_before_end, tc)1406{1407}1408ATF_TC_BODY(fgets_heap_before_end, tc)1409{1410#define BUF __stack.__buf1411struct {1412uint8_t padding_l;1413unsigned char * __buf;1414uint8_t padding_r;1415} __stack;1416const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1417const size_t __len = 42 - 1;1418const size_t __idx __unused = __len - 1;1419FILE *fp;14201421__stack.__buf = malloc(__bufsz);1422fp = new_fp(__len);14231424fgets(__stack.__buf, __len, fp);1425#undef BUF14261427}14281429ATF_TC(fgets_heap_end);1430ATF_TC_HEAD(fgets_heap_end, tc)1431{1432}1433ATF_TC_BODY(fgets_heap_end, tc)1434{1435#define BUF __stack.__buf1436struct {1437uint8_t padding_l;1438unsigned char * __buf;1439uint8_t padding_r;1440} __stack;1441const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1442const size_t __len = 42;1443const size_t __idx __unused = __len - 1;1444FILE *fp;14451446__stack.__buf = malloc(__bufsz);1447fp = new_fp(__len);14481449fgets(__stack.__buf, __len, fp);1450#undef BUF14511452}14531454ATF_TC(fgets_heap_after_end);1455ATF_TC_HEAD(fgets_heap_after_end, tc)1456{1457}1458ATF_TC_BODY(fgets_heap_after_end, tc)1459{1460#define BUF __stack.__buf1461struct {1462uint8_t padding_l;1463unsigned char * __buf;1464uint8_t padding_r;1465} __stack;1466const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1467const size_t __len = 42 + 1;1468const size_t __idx __unused = __len - 1;1469pid_t __child;1470int __status;1471FILE *fp;14721473__child = fork();1474ATF_REQUIRE(__child >= 0);1475if (__child > 0)1476goto monitor;14771478/* Child */1479disable_coredumps();1480__stack.__buf = malloc(__bufsz);1481fp = new_fp(__len);14821483fgets(__stack.__buf, __len, fp);1484_exit(EX_SOFTWARE); /* Should have aborted. */14851486monitor:1487while (waitpid(__child, &__status, 0) != __child) {1488ATF_REQUIRE_EQ(EINTR, errno);1489}14901491if (!WIFSIGNALED(__status)) {1492switch (WEXITSTATUS(__status)) {1493case EX_SOFTWARE:1494atf_tc_fail("FORTIFY_SOURCE failed to abort");1495break;1496case EX_OSERR:1497atf_tc_fail("setrlimit(2) failed");1498break;1499default:1500atf_tc_fail("child exited with status %d",1501WEXITSTATUS(__status));1502}1503} else {1504ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));1505}1506#undef BUF15071508}15091510ATF_TP_ADD_TCS(tp)1511{1512ATF_TP_ADD_TC(tp, ctermid_before_end);1513ATF_TP_ADD_TC(tp, ctermid_end);1514ATF_TP_ADD_TC(tp, ctermid_heap_before_end);1515ATF_TP_ADD_TC(tp, ctermid_heap_end);1516ATF_TP_ADD_TC(tp, ctermid_heap_after_end);1517ATF_TP_ADD_TC(tp, ctermid_r_before_end);1518ATF_TP_ADD_TC(tp, ctermid_r_end);1519ATF_TP_ADD_TC(tp, ctermid_r_heap_before_end);1520ATF_TP_ADD_TC(tp, ctermid_r_heap_end);1521ATF_TP_ADD_TC(tp, ctermid_r_heap_after_end);1522ATF_TP_ADD_TC(tp, fread_before_end);1523ATF_TP_ADD_TC(tp, fread_end);1524ATF_TP_ADD_TC(tp, fread_heap_before_end);1525ATF_TP_ADD_TC(tp, fread_heap_end);1526ATF_TP_ADD_TC(tp, fread_heap_after_end);1527ATF_TP_ADD_TC(tp, fread_unlocked_before_end);1528ATF_TP_ADD_TC(tp, fread_unlocked_end);1529ATF_TP_ADD_TC(tp, fread_unlocked_heap_before_end);1530ATF_TP_ADD_TC(tp, fread_unlocked_heap_end);1531ATF_TP_ADD_TC(tp, fread_unlocked_heap_after_end);1532ATF_TP_ADD_TC(tp, gets_s_before_end);1533ATF_TP_ADD_TC(tp, gets_s_end);1534ATF_TP_ADD_TC(tp, gets_s_heap_before_end);1535ATF_TP_ADD_TC(tp, gets_s_heap_end);1536ATF_TP_ADD_TC(tp, gets_s_heap_after_end);1537ATF_TP_ADD_TC(tp, sprintf_before_end);1538ATF_TP_ADD_TC(tp, sprintf_end);1539ATF_TP_ADD_TC(tp, sprintf_heap_before_end);1540ATF_TP_ADD_TC(tp, sprintf_heap_end);1541ATF_TP_ADD_TC(tp, sprintf_heap_after_end);1542ATF_TP_ADD_TC(tp, snprintf_before_end);1543ATF_TP_ADD_TC(tp, snprintf_end);1544ATF_TP_ADD_TC(tp, snprintf_heap_before_end);1545ATF_TP_ADD_TC(tp, snprintf_heap_end);1546ATF_TP_ADD_TC(tp, snprintf_heap_after_end);1547ATF_TP_ADD_TC(tp, tmpnam_before_end);1548ATF_TP_ADD_TC(tp, tmpnam_end);1549ATF_TP_ADD_TC(tp, tmpnam_heap_before_end);1550ATF_TP_ADD_TC(tp, tmpnam_heap_end);1551ATF_TP_ADD_TC(tp, tmpnam_heap_after_end);1552ATF_TP_ADD_TC(tp, fgets_before_end);1553ATF_TP_ADD_TC(tp, fgets_end);1554ATF_TP_ADD_TC(tp, fgets_heap_before_end);1555ATF_TP_ADD_TC(tp, fgets_heap_end);1556ATF_TP_ADD_TC(tp, fgets_heap_after_end);1557return (atf_no_error());1558}155915601561