Path: blob/main/lib/libc/tests/secure/fortify_random_test.c
39553 views
/* @generated by `generate-fortify-tests.lua "random"` */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(getrandom_before_end);166ATF_TC_HEAD(getrandom_before_end, tc)167{168}169ATF_TC_BODY(getrandom_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;180181getrandom(__stack.__buf, __len, 0);182#undef BUF183184}185186ATF_TC(getrandom_end);187ATF_TC_HEAD(getrandom_end, tc)188{189}190ATF_TC_BODY(getrandom_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;201202getrandom(__stack.__buf, __len, 0);203#undef BUF204205}206207ATF_TC(getrandom_heap_before_end);208ATF_TC_HEAD(getrandom_heap_before_end, tc)209{210}211ATF_TC_BODY(getrandom_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);224225getrandom(__stack.__buf, __len, 0);226#undef BUF227228}229230ATF_TC(getrandom_heap_end);231ATF_TC_HEAD(getrandom_heap_end, tc)232{233}234ATF_TC_BODY(getrandom_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);247248getrandom(__stack.__buf, __len, 0);249#undef BUF250251}252253ATF_TC(getrandom_heap_after_end);254ATF_TC_HEAD(getrandom_heap_after_end, tc)255{256}257ATF_TC_BODY(getrandom_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);279280getrandom(__stack.__buf, __len, 0);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_TP_ADD_TCS(tp)308{309ATF_TP_ADD_TC(tp, getrandom_before_end);310ATF_TP_ADD_TC(tp, getrandom_end);311ATF_TP_ADD_TC(tp, getrandom_heap_before_end);312ATF_TP_ADD_TC(tp, getrandom_heap_end);313ATF_TP_ADD_TC(tp, getrandom_heap_after_end);314return (atf_no_error());315}316317318