Path: blob/main/lib/libc/tests/secure/fortify_select_test.c
39553 views
/* @generated by `generate-fortify-tests.lua "select"` */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(FD_SET_before_end);166ATF_TC_HEAD(FD_SET_before_end, tc)167{168}169ATF_TC_BODY(FD_SET_before_end, tc)170{171#define BUF &__stack.__buf172struct {173uint8_t padding_l;174fd_set __buf;175uint8_t padding_r;176} __stack;177const size_t __bufsz __unused = sizeof(__stack.__buf);178const size_t __len = FD_SETSIZE - 1;179const size_t __idx __unused = __len - 1;180181FD_SET(__idx, &__stack.__buf);182#undef BUF183184}185186ATF_TC(FD_SET_end);187ATF_TC_HEAD(FD_SET_end, tc)188{189}190ATF_TC_BODY(FD_SET_end, tc)191{192#define BUF &__stack.__buf193struct {194uint8_t padding_l;195fd_set __buf;196uint8_t padding_r;197} __stack;198const size_t __bufsz __unused = sizeof(__stack.__buf);199const size_t __len = FD_SETSIZE;200const size_t __idx __unused = __len - 1;201202FD_SET(__idx, &__stack.__buf);203#undef BUF204205}206207ATF_TC(FD_SET_after_end);208ATF_TC_HEAD(FD_SET_after_end, tc)209{210}211ATF_TC_BODY(FD_SET_after_end, tc)212{213#define BUF &__stack.__buf214struct {215uint8_t padding_l;216fd_set __buf;217uint8_t padding_r;218} __stack;219const size_t __bufsz __unused = sizeof(__stack.__buf);220const size_t __len = FD_SETSIZE + 1;221const size_t __idx __unused = __len - 1;222pid_t __child;223int __status;224225__child = fork();226ATF_REQUIRE(__child >= 0);227if (__child > 0)228goto monitor;229230/* Child */231disable_coredumps();232FD_SET(__idx, &__stack.__buf);233_exit(EX_SOFTWARE); /* Should have aborted. */234235monitor:236while (waitpid(__child, &__status, 0) != __child) {237ATF_REQUIRE_EQ(EINTR, errno);238}239240if (!WIFSIGNALED(__status)) {241switch (WEXITSTATUS(__status)) {242case EX_SOFTWARE:243atf_tc_fail("FORTIFY_SOURCE failed to abort");244break;245case EX_OSERR:246atf_tc_fail("setrlimit(2) failed");247break;248default:249atf_tc_fail("child exited with status %d",250WEXITSTATUS(__status));251}252} else {253ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));254}255#undef BUF256257}258259ATF_TC(FD_SET_heap_before_end);260ATF_TC_HEAD(FD_SET_heap_before_end, tc)261{262}263ATF_TC_BODY(FD_SET_heap_before_end, tc)264{265#define BUF __stack.__buf266struct {267uint8_t padding_l;268fd_set * __buf;269uint8_t padding_r;270} __stack;271const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);272const size_t __len = FD_SETSIZE - 1;273const size_t __idx __unused = __len - 1;274275__stack.__buf = malloc(__bufsz);276277FD_SET(__idx, __stack.__buf);278#undef BUF279280}281282ATF_TC(FD_SET_heap_end);283ATF_TC_HEAD(FD_SET_heap_end, tc)284{285}286ATF_TC_BODY(FD_SET_heap_end, tc)287{288#define BUF __stack.__buf289struct {290uint8_t padding_l;291fd_set * __buf;292uint8_t padding_r;293} __stack;294const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);295const size_t __len = FD_SETSIZE;296const size_t __idx __unused = __len - 1;297298__stack.__buf = malloc(__bufsz);299300FD_SET(__idx, __stack.__buf);301#undef BUF302303}304305ATF_TC(FD_SET_heap_after_end);306ATF_TC_HEAD(FD_SET_heap_after_end, tc)307{308}309ATF_TC_BODY(FD_SET_heap_after_end, tc)310{311#define BUF __stack.__buf312struct {313uint8_t padding_l;314fd_set * __buf;315uint8_t padding_r;316} __stack;317const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);318const size_t __len = FD_SETSIZE + 1;319const size_t __idx __unused = __len - 1;320pid_t __child;321int __status;322323__child = fork();324ATF_REQUIRE(__child >= 0);325if (__child > 0)326goto monitor;327328/* Child */329disable_coredumps();330__stack.__buf = malloc(__bufsz);331332FD_SET(__idx, __stack.__buf);333_exit(EX_SOFTWARE); /* Should have aborted. */334335monitor:336while (waitpid(__child, &__status, 0) != __child) {337ATF_REQUIRE_EQ(EINTR, errno);338}339340if (!WIFSIGNALED(__status)) {341switch (WEXITSTATUS(__status)) {342case EX_SOFTWARE:343atf_tc_fail("FORTIFY_SOURCE failed to abort");344break;345case EX_OSERR:346atf_tc_fail("setrlimit(2) failed");347break;348default:349atf_tc_fail("child exited with status %d",350WEXITSTATUS(__status));351}352} else {353ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));354}355#undef BUF356357}358359ATF_TC(FD_CLR_before_end);360ATF_TC_HEAD(FD_CLR_before_end, tc)361{362}363ATF_TC_BODY(FD_CLR_before_end, tc)364{365#define BUF &__stack.__buf366struct {367uint8_t padding_l;368fd_set __buf;369uint8_t padding_r;370} __stack;371const size_t __bufsz __unused = sizeof(__stack.__buf);372const size_t __len = FD_SETSIZE - 1;373const size_t __idx __unused = __len - 1;374375FD_CLR(__idx, &__stack.__buf);376#undef BUF377378}379380ATF_TC(FD_CLR_end);381ATF_TC_HEAD(FD_CLR_end, tc)382{383}384ATF_TC_BODY(FD_CLR_end, tc)385{386#define BUF &__stack.__buf387struct {388uint8_t padding_l;389fd_set __buf;390uint8_t padding_r;391} __stack;392const size_t __bufsz __unused = sizeof(__stack.__buf);393const size_t __len = FD_SETSIZE;394const size_t __idx __unused = __len - 1;395396FD_CLR(__idx, &__stack.__buf);397#undef BUF398399}400401ATF_TC(FD_CLR_after_end);402ATF_TC_HEAD(FD_CLR_after_end, tc)403{404}405ATF_TC_BODY(FD_CLR_after_end, tc)406{407#define BUF &__stack.__buf408struct {409uint8_t padding_l;410fd_set __buf;411uint8_t padding_r;412} __stack;413const size_t __bufsz __unused = sizeof(__stack.__buf);414const size_t __len = FD_SETSIZE + 1;415const size_t __idx __unused = __len - 1;416pid_t __child;417int __status;418419__child = fork();420ATF_REQUIRE(__child >= 0);421if (__child > 0)422goto monitor;423424/* Child */425disable_coredumps();426FD_CLR(__idx, &__stack.__buf);427_exit(EX_SOFTWARE); /* Should have aborted. */428429monitor:430while (waitpid(__child, &__status, 0) != __child) {431ATF_REQUIRE_EQ(EINTR, errno);432}433434if (!WIFSIGNALED(__status)) {435switch (WEXITSTATUS(__status)) {436case EX_SOFTWARE:437atf_tc_fail("FORTIFY_SOURCE failed to abort");438break;439case EX_OSERR:440atf_tc_fail("setrlimit(2) failed");441break;442default:443atf_tc_fail("child exited with status %d",444WEXITSTATUS(__status));445}446} else {447ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));448}449#undef BUF450451}452453ATF_TC(FD_CLR_heap_before_end);454ATF_TC_HEAD(FD_CLR_heap_before_end, tc)455{456}457ATF_TC_BODY(FD_CLR_heap_before_end, tc)458{459#define BUF __stack.__buf460struct {461uint8_t padding_l;462fd_set * __buf;463uint8_t padding_r;464} __stack;465const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);466const size_t __len = FD_SETSIZE - 1;467const size_t __idx __unused = __len - 1;468469__stack.__buf = malloc(__bufsz);470471FD_CLR(__idx, __stack.__buf);472#undef BUF473474}475476ATF_TC(FD_CLR_heap_end);477ATF_TC_HEAD(FD_CLR_heap_end, tc)478{479}480ATF_TC_BODY(FD_CLR_heap_end, tc)481{482#define BUF __stack.__buf483struct {484uint8_t padding_l;485fd_set * __buf;486uint8_t padding_r;487} __stack;488const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);489const size_t __len = FD_SETSIZE;490const size_t __idx __unused = __len - 1;491492__stack.__buf = malloc(__bufsz);493494FD_CLR(__idx, __stack.__buf);495#undef BUF496497}498499ATF_TC(FD_CLR_heap_after_end);500ATF_TC_HEAD(FD_CLR_heap_after_end, tc)501{502}503ATF_TC_BODY(FD_CLR_heap_after_end, tc)504{505#define BUF __stack.__buf506struct {507uint8_t padding_l;508fd_set * __buf;509uint8_t padding_r;510} __stack;511const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);512const size_t __len = FD_SETSIZE + 1;513const size_t __idx __unused = __len - 1;514pid_t __child;515int __status;516517__child = fork();518ATF_REQUIRE(__child >= 0);519if (__child > 0)520goto monitor;521522/* Child */523disable_coredumps();524__stack.__buf = malloc(__bufsz);525526FD_CLR(__idx, __stack.__buf);527_exit(EX_SOFTWARE); /* Should have aborted. */528529monitor:530while (waitpid(__child, &__status, 0) != __child) {531ATF_REQUIRE_EQ(EINTR, errno);532}533534if (!WIFSIGNALED(__status)) {535switch (WEXITSTATUS(__status)) {536case EX_SOFTWARE:537atf_tc_fail("FORTIFY_SOURCE failed to abort");538break;539case EX_OSERR:540atf_tc_fail("setrlimit(2) failed");541break;542default:543atf_tc_fail("child exited with status %d",544WEXITSTATUS(__status));545}546} else {547ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));548}549#undef BUF550551}552553ATF_TC(FD_ISSET_before_end);554ATF_TC_HEAD(FD_ISSET_before_end, tc)555{556}557ATF_TC_BODY(FD_ISSET_before_end, tc)558{559#define BUF &__stack.__buf560struct {561uint8_t padding_l;562fd_set __buf;563uint8_t padding_r;564} __stack;565const size_t __bufsz __unused = sizeof(__stack.__buf);566const size_t __len = FD_SETSIZE - 1;567const size_t __idx __unused = __len - 1;568569FD_ISSET(__idx, &__stack.__buf);570#undef BUF571572}573574ATF_TC(FD_ISSET_end);575ATF_TC_HEAD(FD_ISSET_end, tc)576{577}578ATF_TC_BODY(FD_ISSET_end, tc)579{580#define BUF &__stack.__buf581struct {582uint8_t padding_l;583fd_set __buf;584uint8_t padding_r;585} __stack;586const size_t __bufsz __unused = sizeof(__stack.__buf);587const size_t __len = FD_SETSIZE;588const size_t __idx __unused = __len - 1;589590FD_ISSET(__idx, &__stack.__buf);591#undef BUF592593}594595ATF_TC(FD_ISSET_after_end);596ATF_TC_HEAD(FD_ISSET_after_end, tc)597{598}599ATF_TC_BODY(FD_ISSET_after_end, tc)600{601#define BUF &__stack.__buf602struct {603uint8_t padding_l;604fd_set __buf;605uint8_t padding_r;606} __stack;607const size_t __bufsz __unused = sizeof(__stack.__buf);608const size_t __len = FD_SETSIZE + 1;609const size_t __idx __unused = __len - 1;610pid_t __child;611int __status;612613__child = fork();614ATF_REQUIRE(__child >= 0);615if (__child > 0)616goto monitor;617618/* Child */619disable_coredumps();620FD_ISSET(__idx, &__stack.__buf);621_exit(EX_SOFTWARE); /* Should have aborted. */622623monitor:624while (waitpid(__child, &__status, 0) != __child) {625ATF_REQUIRE_EQ(EINTR, errno);626}627628if (!WIFSIGNALED(__status)) {629switch (WEXITSTATUS(__status)) {630case EX_SOFTWARE:631atf_tc_fail("FORTIFY_SOURCE failed to abort");632break;633case EX_OSERR:634atf_tc_fail("setrlimit(2) failed");635break;636default:637atf_tc_fail("child exited with status %d",638WEXITSTATUS(__status));639}640} else {641ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));642}643#undef BUF644645}646647ATF_TC(FD_ISSET_heap_before_end);648ATF_TC_HEAD(FD_ISSET_heap_before_end, tc)649{650}651ATF_TC_BODY(FD_ISSET_heap_before_end, tc)652{653#define BUF __stack.__buf654struct {655uint8_t padding_l;656fd_set * __buf;657uint8_t padding_r;658} __stack;659const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);660const size_t __len = FD_SETSIZE - 1;661const size_t __idx __unused = __len - 1;662663__stack.__buf = malloc(__bufsz);664665FD_ISSET(__idx, __stack.__buf);666#undef BUF667668}669670ATF_TC(FD_ISSET_heap_end);671ATF_TC_HEAD(FD_ISSET_heap_end, tc)672{673}674ATF_TC_BODY(FD_ISSET_heap_end, tc)675{676#define BUF __stack.__buf677struct {678uint8_t padding_l;679fd_set * __buf;680uint8_t padding_r;681} __stack;682const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);683const size_t __len = FD_SETSIZE;684const size_t __idx __unused = __len - 1;685686__stack.__buf = malloc(__bufsz);687688FD_ISSET(__idx, __stack.__buf);689#undef BUF690691}692693ATF_TC(FD_ISSET_heap_after_end);694ATF_TC_HEAD(FD_ISSET_heap_after_end, tc)695{696}697ATF_TC_BODY(FD_ISSET_heap_after_end, tc)698{699#define BUF __stack.__buf700struct {701uint8_t padding_l;702fd_set * __buf;703uint8_t padding_r;704} __stack;705const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);706const size_t __len = FD_SETSIZE + 1;707const size_t __idx __unused = __len - 1;708pid_t __child;709int __status;710711__child = fork();712ATF_REQUIRE(__child >= 0);713if (__child > 0)714goto monitor;715716/* Child */717disable_coredumps();718__stack.__buf = malloc(__bufsz);719720FD_ISSET(__idx, __stack.__buf);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_TP_ADD_TCS(tp)748{749ATF_TP_ADD_TC(tp, FD_SET_before_end);750ATF_TP_ADD_TC(tp, FD_SET_end);751ATF_TP_ADD_TC(tp, FD_SET_after_end);752ATF_TP_ADD_TC(tp, FD_SET_heap_before_end);753ATF_TP_ADD_TC(tp, FD_SET_heap_end);754ATF_TP_ADD_TC(tp, FD_SET_heap_after_end);755ATF_TP_ADD_TC(tp, FD_CLR_before_end);756ATF_TP_ADD_TC(tp, FD_CLR_end);757ATF_TP_ADD_TC(tp, FD_CLR_after_end);758ATF_TP_ADD_TC(tp, FD_CLR_heap_before_end);759ATF_TP_ADD_TC(tp, FD_CLR_heap_end);760ATF_TP_ADD_TC(tp, FD_CLR_heap_after_end);761ATF_TP_ADD_TC(tp, FD_ISSET_before_end);762ATF_TP_ADD_TC(tp, FD_ISSET_end);763ATF_TP_ADD_TC(tp, FD_ISSET_after_end);764ATF_TP_ADD_TC(tp, FD_ISSET_heap_before_end);765ATF_TP_ADD_TC(tp, FD_ISSET_heap_end);766ATF_TP_ADD_TC(tp, FD_ISSET_heap_after_end);767return (atf_no_error());768}769770771