Path: blob/main/lib/libc/tests/secure/fortify_poll_test.c
39553 views
/* @generated by `generate-fortify-tests.lua "poll"` */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(poll_before_end);166ATF_TC_HEAD(poll_before_end, tc)167{168}169ATF_TC_BODY(poll_before_end, tc)170{171#define BUF &__stack.__buf172struct {173uint8_t padding_l;174struct pollfd __buf[4];175uint8_t padding_r;176} __stack;177const size_t __bufsz __unused = sizeof(__stack.__buf);178const size_t __len = 4 - 1;179const size_t __idx __unused = __len - 1;180181for (size_t i = 0; i < howmany(__bufsz, sizeof(struct pollfd)); i++) {182__stack.__buf[i].fd = -1;183}184185poll(__stack.__buf, __len, 0);186#undef BUF187188}189190ATF_TC(poll_end);191ATF_TC_HEAD(poll_end, tc)192{193}194ATF_TC_BODY(poll_end, tc)195{196#define BUF &__stack.__buf197struct {198uint8_t padding_l;199struct pollfd __buf[4];200uint8_t padding_r;201} __stack;202const size_t __bufsz __unused = sizeof(__stack.__buf);203const size_t __len = 4;204const size_t __idx __unused = __len - 1;205206for (size_t i = 0; i < howmany(__bufsz, sizeof(struct pollfd)); i++) {207__stack.__buf[i].fd = -1;208}209210poll(__stack.__buf, __len, 0);211#undef BUF212213}214215ATF_TC(poll_after_end);216ATF_TC_HEAD(poll_after_end, tc)217{218}219ATF_TC_BODY(poll_after_end, tc)220{221#define BUF &__stack.__buf222struct {223uint8_t padding_l;224struct pollfd __buf[4];225uint8_t padding_r;226} __stack;227const size_t __bufsz __unused = sizeof(__stack.__buf);228const size_t __len = 4 + 1;229const size_t __idx __unused = __len - 1;230pid_t __child;231int __status;232233__child = fork();234ATF_REQUIRE(__child >= 0);235if (__child > 0)236goto monitor;237238/* Child */239disable_coredumps();240for (size_t i = 0; i < howmany(__bufsz, sizeof(struct pollfd)); i++) {241__stack.__buf[i].fd = -1;242}243244poll(__stack.__buf, __len, 0);245_exit(EX_SOFTWARE); /* Should have aborted. */246247monitor:248while (waitpid(__child, &__status, 0) != __child) {249ATF_REQUIRE_EQ(EINTR, errno);250}251252if (!WIFSIGNALED(__status)) {253switch (WEXITSTATUS(__status)) {254case EX_SOFTWARE:255atf_tc_fail("FORTIFY_SOURCE failed to abort");256break;257case EX_OSERR:258atf_tc_fail("setrlimit(2) failed");259break;260default:261atf_tc_fail("child exited with status %d",262WEXITSTATUS(__status));263}264} else {265ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));266}267#undef BUF268269}270271ATF_TC(poll_heap_before_end);272ATF_TC_HEAD(poll_heap_before_end, tc)273{274}275ATF_TC_BODY(poll_heap_before_end, tc)276{277#define BUF __stack.__buf278struct {279uint8_t padding_l;280struct pollfd * __buf;281uint8_t padding_r;282} __stack;283const size_t __bufsz __unused = sizeof(*__stack.__buf) * (4);284const size_t __len = 4 - 1;285const size_t __idx __unused = __len - 1;286287__stack.__buf = malloc(__bufsz);288for (size_t i = 0; i < howmany(__bufsz, sizeof(struct pollfd)); i++) {289__stack.__buf[i].fd = -1;290}291292poll(__stack.__buf, __len, 0);293#undef BUF294295}296297ATF_TC(poll_heap_end);298ATF_TC_HEAD(poll_heap_end, tc)299{300}301ATF_TC_BODY(poll_heap_end, tc)302{303#define BUF __stack.__buf304struct {305uint8_t padding_l;306struct pollfd * __buf;307uint8_t padding_r;308} __stack;309const size_t __bufsz __unused = sizeof(*__stack.__buf) * (4);310const size_t __len = 4;311const size_t __idx __unused = __len - 1;312313__stack.__buf = malloc(__bufsz);314for (size_t i = 0; i < howmany(__bufsz, sizeof(struct pollfd)); i++) {315__stack.__buf[i].fd = -1;316}317318poll(__stack.__buf, __len, 0);319#undef BUF320321}322323ATF_TC(poll_heap_after_end);324ATF_TC_HEAD(poll_heap_after_end, tc)325{326}327ATF_TC_BODY(poll_heap_after_end, tc)328{329#define BUF __stack.__buf330struct {331uint8_t padding_l;332struct pollfd * __buf;333uint8_t padding_r;334} __stack;335const size_t __bufsz __unused = sizeof(*__stack.__buf) * (4);336const size_t __len = 4 + 1;337const size_t __idx __unused = __len - 1;338pid_t __child;339int __status;340341__child = fork();342ATF_REQUIRE(__child >= 0);343if (__child > 0)344goto monitor;345346/* Child */347disable_coredumps();348__stack.__buf = malloc(__bufsz);349for (size_t i = 0; i < howmany(__bufsz, sizeof(struct pollfd)); i++) {350__stack.__buf[i].fd = -1;351}352353poll(__stack.__buf, __len, 0);354_exit(EX_SOFTWARE); /* Should have aborted. */355356monitor:357while (waitpid(__child, &__status, 0) != __child) {358ATF_REQUIRE_EQ(EINTR, errno);359}360361if (!WIFSIGNALED(__status)) {362switch (WEXITSTATUS(__status)) {363case EX_SOFTWARE:364atf_tc_fail("FORTIFY_SOURCE failed to abort");365break;366case EX_OSERR:367atf_tc_fail("setrlimit(2) failed");368break;369default:370atf_tc_fail("child exited with status %d",371WEXITSTATUS(__status));372}373} else {374ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));375}376#undef BUF377378}379380ATF_TC(ppoll_before_end);381ATF_TC_HEAD(ppoll_before_end, tc)382{383}384ATF_TC_BODY(ppoll_before_end, tc)385{386#define BUF &__stack.__buf387struct {388uint8_t padding_l;389struct pollfd __buf[4];390uint8_t padding_r;391} __stack;392const size_t __bufsz __unused = sizeof(__stack.__buf);393const size_t __len = 4 - 1;394const size_t __idx __unused = __len - 1;395struct timespec tv = { 0 };396397for (size_t i = 0; i < howmany(__bufsz, sizeof(struct pollfd)); i++) {398__stack.__buf[i].fd = -1;399}400401ppoll(__stack.__buf, __len, &tv, NULL);402#undef BUF403404}405406ATF_TC(ppoll_end);407ATF_TC_HEAD(ppoll_end, tc)408{409}410ATF_TC_BODY(ppoll_end, tc)411{412#define BUF &__stack.__buf413struct {414uint8_t padding_l;415struct pollfd __buf[4];416uint8_t padding_r;417} __stack;418const size_t __bufsz __unused = sizeof(__stack.__buf);419const size_t __len = 4;420const size_t __idx __unused = __len - 1;421struct timespec tv = { 0 };422423for (size_t i = 0; i < howmany(__bufsz, sizeof(struct pollfd)); i++) {424__stack.__buf[i].fd = -1;425}426427ppoll(__stack.__buf, __len, &tv, NULL);428#undef BUF429430}431432ATF_TC(ppoll_after_end);433ATF_TC_HEAD(ppoll_after_end, tc)434{435}436ATF_TC_BODY(ppoll_after_end, tc)437{438#define BUF &__stack.__buf439struct {440uint8_t padding_l;441struct pollfd __buf[4];442uint8_t padding_r;443} __stack;444const size_t __bufsz __unused = sizeof(__stack.__buf);445const size_t __len = 4 + 1;446const size_t __idx __unused = __len - 1;447pid_t __child;448int __status;449struct timespec tv = { 0 };450451__child = fork();452ATF_REQUIRE(__child >= 0);453if (__child > 0)454goto monitor;455456/* Child */457disable_coredumps();458for (size_t i = 0; i < howmany(__bufsz, sizeof(struct pollfd)); i++) {459__stack.__buf[i].fd = -1;460}461462ppoll(__stack.__buf, __len, &tv, NULL);463_exit(EX_SOFTWARE); /* Should have aborted. */464465monitor:466while (waitpid(__child, &__status, 0) != __child) {467ATF_REQUIRE_EQ(EINTR, errno);468}469470if (!WIFSIGNALED(__status)) {471switch (WEXITSTATUS(__status)) {472case EX_SOFTWARE:473atf_tc_fail("FORTIFY_SOURCE failed to abort");474break;475case EX_OSERR:476atf_tc_fail("setrlimit(2) failed");477break;478default:479atf_tc_fail("child exited with status %d",480WEXITSTATUS(__status));481}482} else {483ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));484}485#undef BUF486487}488489ATF_TC(ppoll_heap_before_end);490ATF_TC_HEAD(ppoll_heap_before_end, tc)491{492}493ATF_TC_BODY(ppoll_heap_before_end, tc)494{495#define BUF __stack.__buf496struct {497uint8_t padding_l;498struct pollfd * __buf;499uint8_t padding_r;500} __stack;501const size_t __bufsz __unused = sizeof(*__stack.__buf) * (4);502const size_t __len = 4 - 1;503const size_t __idx __unused = __len - 1;504struct timespec tv = { 0 };505506__stack.__buf = malloc(__bufsz);507for (size_t i = 0; i < howmany(__bufsz, sizeof(struct pollfd)); i++) {508__stack.__buf[i].fd = -1;509}510511ppoll(__stack.__buf, __len, &tv, NULL);512#undef BUF513514}515516ATF_TC(ppoll_heap_end);517ATF_TC_HEAD(ppoll_heap_end, tc)518{519}520ATF_TC_BODY(ppoll_heap_end, tc)521{522#define BUF __stack.__buf523struct {524uint8_t padding_l;525struct pollfd * __buf;526uint8_t padding_r;527} __stack;528const size_t __bufsz __unused = sizeof(*__stack.__buf) * (4);529const size_t __len = 4;530const size_t __idx __unused = __len - 1;531struct timespec tv = { 0 };532533__stack.__buf = malloc(__bufsz);534for (size_t i = 0; i < howmany(__bufsz, sizeof(struct pollfd)); i++) {535__stack.__buf[i].fd = -1;536}537538ppoll(__stack.__buf, __len, &tv, NULL);539#undef BUF540541}542543ATF_TC(ppoll_heap_after_end);544ATF_TC_HEAD(ppoll_heap_after_end, tc)545{546}547ATF_TC_BODY(ppoll_heap_after_end, tc)548{549#define BUF __stack.__buf550struct {551uint8_t padding_l;552struct pollfd * __buf;553uint8_t padding_r;554} __stack;555const size_t __bufsz __unused = sizeof(*__stack.__buf) * (4);556const size_t __len = 4 + 1;557const size_t __idx __unused = __len - 1;558pid_t __child;559int __status;560struct timespec tv = { 0 };561562__child = fork();563ATF_REQUIRE(__child >= 0);564if (__child > 0)565goto monitor;566567/* Child */568disable_coredumps();569__stack.__buf = malloc(__bufsz);570for (size_t i = 0; i < howmany(__bufsz, sizeof(struct pollfd)); i++) {571__stack.__buf[i].fd = -1;572}573574ppoll(__stack.__buf, __len, &tv, NULL);575_exit(EX_SOFTWARE); /* Should have aborted. */576577monitor:578while (waitpid(__child, &__status, 0) != __child) {579ATF_REQUIRE_EQ(EINTR, errno);580}581582if (!WIFSIGNALED(__status)) {583switch (WEXITSTATUS(__status)) {584case EX_SOFTWARE:585atf_tc_fail("FORTIFY_SOURCE failed to abort");586break;587case EX_OSERR:588atf_tc_fail("setrlimit(2) failed");589break;590default:591atf_tc_fail("child exited with status %d",592WEXITSTATUS(__status));593}594} else {595ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));596}597#undef BUF598599}600601ATF_TP_ADD_TCS(tp)602{603ATF_TP_ADD_TC(tp, poll_before_end);604ATF_TP_ADD_TC(tp, poll_end);605ATF_TP_ADD_TC(tp, poll_after_end);606ATF_TP_ADD_TC(tp, poll_heap_before_end);607ATF_TP_ADD_TC(tp, poll_heap_end);608ATF_TP_ADD_TC(tp, poll_heap_after_end);609ATF_TP_ADD_TC(tp, ppoll_before_end);610ATF_TP_ADD_TC(tp, ppoll_end);611ATF_TP_ADD_TC(tp, ppoll_after_end);612ATF_TP_ADD_TC(tp, ppoll_heap_before_end);613ATF_TP_ADD_TC(tp, ppoll_heap_end);614ATF_TP_ADD_TC(tp, ppoll_heap_after_end);615return (atf_no_error());616}617618619