Path: blob/main/lib/libc/tests/secure/fortify_stdlib_test.c
39553 views
/* @generated by `generate-fortify-tests.lua "stdlib"` */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(arc4random_buf_before_end);166ATF_TC_HEAD(arc4random_buf_before_end, tc)167{168}169ATF_TC_BODY(arc4random_buf_before_end, tc)170{171#define BUF &__stack.__buf172struct {173uint8_t padding_l;174unsigned char __buf[42];175uint8_t padding_r;176} __stack;177const size_t __bufsz __unused = sizeof(__stack.__buf);178const size_t __len = 42 - 1;179const size_t __idx __unused = __len - 1;180181arc4random_buf(__stack.__buf, __len);182#undef BUF183184}185186ATF_TC(arc4random_buf_end);187ATF_TC_HEAD(arc4random_buf_end, tc)188{189}190ATF_TC_BODY(arc4random_buf_end, tc)191{192#define BUF &__stack.__buf193struct {194uint8_t padding_l;195unsigned char __buf[42];196uint8_t padding_r;197} __stack;198const size_t __bufsz __unused = sizeof(__stack.__buf);199const size_t __len = 42;200const size_t __idx __unused = __len - 1;201202arc4random_buf(__stack.__buf, __len);203#undef BUF204205}206207ATF_TC(arc4random_buf_heap_before_end);208ATF_TC_HEAD(arc4random_buf_heap_before_end, tc)209{210}211ATF_TC_BODY(arc4random_buf_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) * (42);220const size_t __len = 42 - 1;221const size_t __idx __unused = __len - 1;222223__stack.__buf = malloc(__bufsz);224225arc4random_buf(__stack.__buf, __len);226#undef BUF227228}229230ATF_TC(arc4random_buf_heap_end);231ATF_TC_HEAD(arc4random_buf_heap_end, tc)232{233}234ATF_TC_BODY(arc4random_buf_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) * (42);243const size_t __len = 42;244const size_t __idx __unused = __len - 1;245246__stack.__buf = malloc(__bufsz);247248arc4random_buf(__stack.__buf, __len);249#undef BUF250251}252253ATF_TC(arc4random_buf_heap_after_end);254ATF_TC_HEAD(arc4random_buf_heap_after_end, tc)255{256}257ATF_TC_BODY(arc4random_buf_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) * (42);266const size_t __len = 42 + 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);279280arc4random_buf(__stack.__buf, __len);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(getenv_r_before_end);308ATF_TC_HEAD(getenv_r_before_end, tc)309{310}311ATF_TC_BODY(getenv_r_before_end, tc)312{313#define BUF &__stack.__buf314struct {315uint8_t padding_l;316unsigned char __buf[42];317uint8_t padding_r;318} __stack;319const size_t __bufsz __unused = sizeof(__stack.__buf);320const size_t __len = 42 - 1;321const size_t __idx __unused = __len - 1;322323getenv_r("PATH", __stack.__buf, __len);324#undef BUF325326}327328ATF_TC(getenv_r_end);329ATF_TC_HEAD(getenv_r_end, tc)330{331}332ATF_TC_BODY(getenv_r_end, tc)333{334#define BUF &__stack.__buf335struct {336uint8_t padding_l;337unsigned char __buf[42];338uint8_t padding_r;339} __stack;340const size_t __bufsz __unused = sizeof(__stack.__buf);341const size_t __len = 42;342const size_t __idx __unused = __len - 1;343344getenv_r("PATH", __stack.__buf, __len);345#undef BUF346347}348349ATF_TC(getenv_r_heap_before_end);350ATF_TC_HEAD(getenv_r_heap_before_end, tc)351{352}353ATF_TC_BODY(getenv_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) * (42);362const size_t __len = 42 - 1;363const size_t __idx __unused = __len - 1;364365__stack.__buf = malloc(__bufsz);366367getenv_r("PATH", __stack.__buf, __len);368#undef BUF369370}371372ATF_TC(getenv_r_heap_end);373ATF_TC_HEAD(getenv_r_heap_end, tc)374{375}376ATF_TC_BODY(getenv_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) * (42);385const size_t __len = 42;386const size_t __idx __unused = __len - 1;387388__stack.__buf = malloc(__bufsz);389390getenv_r("PATH", __stack.__buf, __len);391#undef BUF392393}394395ATF_TC(getenv_r_heap_after_end);396ATF_TC_HEAD(getenv_r_heap_after_end, tc)397{398}399ATF_TC_BODY(getenv_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) * (42);408const size_t __len = 42 + 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);421422getenv_r("PATH", __stack.__buf, __len);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(realpath_before_end);450ATF_TC_HEAD(realpath_before_end, tc)451{452}453ATF_TC_BODY(realpath_before_end, tc)454{455#define BUF &__stack.__buf456struct {457uint8_t padding_l;458unsigned char __buf[PATH_MAX + 1];459uint8_t padding_r;460} __stack;461const size_t __bufsz __unused = sizeof(__stack.__buf);462const size_t __len = PATH_MAX + 1;463const size_t __idx __unused = __len - 1;464465realpath(".", __stack.__buf);466#undef BUF467468}469470ATF_TC(realpath_end);471ATF_TC_HEAD(realpath_end, tc)472{473}474ATF_TC_BODY(realpath_end, tc)475{476#define BUF &__stack.__buf477struct {478uint8_t padding_l;479unsigned char __buf[PATH_MAX];480uint8_t padding_r;481} __stack;482const size_t __bufsz __unused = sizeof(__stack.__buf);483const size_t __len = PATH_MAX;484const size_t __idx __unused = __len - 1;485486realpath(".", __stack.__buf);487#undef BUF488489}490491ATF_TC(realpath_heap_before_end);492ATF_TC_HEAD(realpath_heap_before_end, tc)493{494}495ATF_TC_BODY(realpath_heap_before_end, tc)496{497#define BUF __stack.__buf498struct {499uint8_t padding_l;500unsigned char * __buf;501uint8_t padding_r;502} __stack;503const size_t __bufsz __unused = sizeof(*__stack.__buf) * (PATH_MAX + 1);504const size_t __len = PATH_MAX + 1;505const size_t __idx __unused = __len - 1;506507__stack.__buf = malloc(__bufsz);508509realpath(".", __stack.__buf);510#undef BUF511512}513514ATF_TC(realpath_heap_end);515ATF_TC_HEAD(realpath_heap_end, tc)516{517}518ATF_TC_BODY(realpath_heap_end, tc)519{520#define BUF __stack.__buf521struct {522uint8_t padding_l;523unsigned char * __buf;524uint8_t padding_r;525} __stack;526const size_t __bufsz __unused = sizeof(*__stack.__buf) * (PATH_MAX);527const size_t __len = PATH_MAX;528const size_t __idx __unused = __len - 1;529530__stack.__buf = malloc(__bufsz);531532realpath(".", __stack.__buf);533#undef BUF534535}536537ATF_TC(realpath_heap_after_end);538ATF_TC_HEAD(realpath_heap_after_end, tc)539{540}541ATF_TC_BODY(realpath_heap_after_end, tc)542{543#define BUF __stack.__buf544struct {545uint8_t padding_l;546unsigned char * __buf;547uint8_t padding_r;548} __stack;549const size_t __bufsz __unused = sizeof(*__stack.__buf) * (PATH_MAX - 1);550const size_t __len = PATH_MAX - 1;551const size_t __idx __unused = __len - 1;552pid_t __child;553int __status;554555__child = fork();556ATF_REQUIRE(__child >= 0);557if (__child > 0)558goto monitor;559560/* Child */561disable_coredumps();562__stack.__buf = malloc(__bufsz);563564realpath(".", __stack.__buf);565_exit(EX_SOFTWARE); /* Should have aborted. */566567monitor:568while (waitpid(__child, &__status, 0) != __child) {569ATF_REQUIRE_EQ(EINTR, errno);570}571572if (!WIFSIGNALED(__status)) {573switch (WEXITSTATUS(__status)) {574case EX_SOFTWARE:575atf_tc_fail("FORTIFY_SOURCE failed to abort");576break;577case EX_OSERR:578atf_tc_fail("setrlimit(2) failed");579break;580default:581atf_tc_fail("child exited with status %d",582WEXITSTATUS(__status));583}584} else {585ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));586}587#undef BUF588589}590591ATF_TP_ADD_TCS(tp)592{593ATF_TP_ADD_TC(tp, arc4random_buf_before_end);594ATF_TP_ADD_TC(tp, arc4random_buf_end);595ATF_TP_ADD_TC(tp, arc4random_buf_heap_before_end);596ATF_TP_ADD_TC(tp, arc4random_buf_heap_end);597ATF_TP_ADD_TC(tp, arc4random_buf_heap_after_end);598ATF_TP_ADD_TC(tp, getenv_r_before_end);599ATF_TP_ADD_TC(tp, getenv_r_end);600ATF_TP_ADD_TC(tp, getenv_r_heap_before_end);601ATF_TP_ADD_TC(tp, getenv_r_heap_end);602ATF_TP_ADD_TC(tp, getenv_r_heap_after_end);603ATF_TP_ADD_TC(tp, realpath_before_end);604ATF_TP_ADD_TC(tp, realpath_end);605ATF_TP_ADD_TC(tp, realpath_heap_before_end);606ATF_TP_ADD_TC(tp, realpath_heap_end);607ATF_TP_ADD_TC(tp, realpath_heap_after_end);608return (atf_no_error());609}610611612