Path: blob/main/lib/libc/tests/secure/fortify_socket_test.c
39553 views
/* @generated by `generate-fortify-tests.lua "socket"` */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(getpeername_before_end);166ATF_TC_HEAD(getpeername_before_end, tc)167{168}169ATF_TC_BODY(getpeername_before_end, tc)170{171#define BUF &__stack.__buf172struct {173uint8_t padding_l;174struct sockaddr __buf;175uint8_t padding_r;176} __stack;177const size_t __bufsz __unused = sizeof(__stack.__buf);178const size_t __len = sizeof(struct sockaddr) - 1;179const size_t __idx __unused = __len - 1;180int sock[2] = { -1, -1 };181socklen_t socklen;182new_socket(sock);183socklen = __len;184185getpeername(sock[0], &__stack.__buf, &socklen);186#undef BUF187188}189190ATF_TC(getpeername_end);191ATF_TC_HEAD(getpeername_end, tc)192{193}194ATF_TC_BODY(getpeername_end, tc)195{196#define BUF &__stack.__buf197struct {198uint8_t padding_l;199struct sockaddr __buf;200uint8_t padding_r;201} __stack;202const size_t __bufsz __unused = sizeof(__stack.__buf);203const size_t __len = sizeof(struct sockaddr);204const size_t __idx __unused = __len - 1;205int sock[2] = { -1, -1 };206socklen_t socklen;207new_socket(sock);208socklen = __len;209210getpeername(sock[0], &__stack.__buf, &socklen);211#undef BUF212213}214215ATF_TC(getpeername_heap_before_end);216ATF_TC_HEAD(getpeername_heap_before_end, tc)217{218}219ATF_TC_BODY(getpeername_heap_before_end, tc)220{221#define BUF __stack.__buf222struct {223uint8_t padding_l;224struct sockaddr * __buf;225uint8_t padding_r;226} __stack;227const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);228const size_t __len = sizeof(struct sockaddr) - 1;229const size_t __idx __unused = __len - 1;230int sock[2] = { -1, -1 };231socklen_t socklen;232__stack.__buf = malloc(__bufsz);233new_socket(sock);234socklen = __len;235236getpeername(sock[0], __stack.__buf, &socklen);237#undef BUF238239}240241ATF_TC(getpeername_heap_end);242ATF_TC_HEAD(getpeername_heap_end, tc)243{244}245ATF_TC_BODY(getpeername_heap_end, tc)246{247#define BUF __stack.__buf248struct {249uint8_t padding_l;250struct sockaddr * __buf;251uint8_t padding_r;252} __stack;253const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);254const size_t __len = sizeof(struct sockaddr);255const size_t __idx __unused = __len - 1;256int sock[2] = { -1, -1 };257socklen_t socklen;258__stack.__buf = malloc(__bufsz);259new_socket(sock);260socklen = __len;261262getpeername(sock[0], __stack.__buf, &socklen);263#undef BUF264265}266267ATF_TC(getpeername_heap_after_end);268ATF_TC_HEAD(getpeername_heap_after_end, tc)269{270}271ATF_TC_BODY(getpeername_heap_after_end, tc)272{273#define BUF __stack.__buf274struct {275uint8_t padding_l;276struct sockaddr * __buf;277uint8_t padding_r;278} __stack;279const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);280const size_t __len = sizeof(struct sockaddr) + 1;281const size_t __idx __unused = __len - 1;282pid_t __child;283int __status;284int sock[2] = { -1, -1 };285socklen_t socklen;286__child = fork();287ATF_REQUIRE(__child >= 0);288if (__child > 0)289goto monitor;290291/* Child */292disable_coredumps();293__stack.__buf = malloc(__bufsz);294new_socket(sock);295socklen = __len;296297getpeername(sock[0], __stack.__buf, &socklen);298_exit(EX_SOFTWARE); /* Should have aborted. */299300monitor:301while (waitpid(__child, &__status, 0) != __child) {302ATF_REQUIRE_EQ(EINTR, errno);303}304305if (!WIFSIGNALED(__status)) {306switch (WEXITSTATUS(__status)) {307case EX_SOFTWARE:308atf_tc_fail("FORTIFY_SOURCE failed to abort");309break;310case EX_OSERR:311atf_tc_fail("setrlimit(2) failed");312break;313default:314atf_tc_fail("child exited with status %d",315WEXITSTATUS(__status));316}317} else {318ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));319}320#undef BUF321322}323324ATF_TC(getsockname_before_end);325ATF_TC_HEAD(getsockname_before_end, tc)326{327}328ATF_TC_BODY(getsockname_before_end, tc)329{330#define BUF &__stack.__buf331struct {332uint8_t padding_l;333struct sockaddr __buf;334uint8_t padding_r;335} __stack;336const size_t __bufsz __unused = sizeof(__stack.__buf);337const size_t __len = sizeof(struct sockaddr) - 1;338const size_t __idx __unused = __len - 1;339int sock[2] = { -1, -1 };340socklen_t socklen;341new_socket(sock);342socklen = __len;343344getsockname(sock[0], &__stack.__buf, &socklen);345#undef BUF346347}348349ATF_TC(getsockname_end);350ATF_TC_HEAD(getsockname_end, tc)351{352}353ATF_TC_BODY(getsockname_end, tc)354{355#define BUF &__stack.__buf356struct {357uint8_t padding_l;358struct sockaddr __buf;359uint8_t padding_r;360} __stack;361const size_t __bufsz __unused = sizeof(__stack.__buf);362const size_t __len = sizeof(struct sockaddr);363const size_t __idx __unused = __len - 1;364int sock[2] = { -1, -1 };365socklen_t socklen;366new_socket(sock);367socklen = __len;368369getsockname(sock[0], &__stack.__buf, &socklen);370#undef BUF371372}373374ATF_TC(getsockname_heap_before_end);375ATF_TC_HEAD(getsockname_heap_before_end, tc)376{377}378ATF_TC_BODY(getsockname_heap_before_end, tc)379{380#define BUF __stack.__buf381struct {382uint8_t padding_l;383struct sockaddr * __buf;384uint8_t padding_r;385} __stack;386const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);387const size_t __len = sizeof(struct sockaddr) - 1;388const size_t __idx __unused = __len - 1;389int sock[2] = { -1, -1 };390socklen_t socklen;391__stack.__buf = malloc(__bufsz);392new_socket(sock);393socklen = __len;394395getsockname(sock[0], __stack.__buf, &socklen);396#undef BUF397398}399400ATF_TC(getsockname_heap_end);401ATF_TC_HEAD(getsockname_heap_end, tc)402{403}404ATF_TC_BODY(getsockname_heap_end, tc)405{406#define BUF __stack.__buf407struct {408uint8_t padding_l;409struct sockaddr * __buf;410uint8_t padding_r;411} __stack;412const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);413const size_t __len = sizeof(struct sockaddr);414const size_t __idx __unused = __len - 1;415int sock[2] = { -1, -1 };416socklen_t socklen;417__stack.__buf = malloc(__bufsz);418new_socket(sock);419socklen = __len;420421getsockname(sock[0], __stack.__buf, &socklen);422#undef BUF423424}425426ATF_TC(getsockname_heap_after_end);427ATF_TC_HEAD(getsockname_heap_after_end, tc)428{429}430ATF_TC_BODY(getsockname_heap_after_end, tc)431{432#define BUF __stack.__buf433struct {434uint8_t padding_l;435struct sockaddr * __buf;436uint8_t padding_r;437} __stack;438const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);439const size_t __len = sizeof(struct sockaddr) + 1;440const size_t __idx __unused = __len - 1;441pid_t __child;442int __status;443int sock[2] = { -1, -1 };444socklen_t socklen;445__child = fork();446ATF_REQUIRE(__child >= 0);447if (__child > 0)448goto monitor;449450/* Child */451disable_coredumps();452__stack.__buf = malloc(__bufsz);453new_socket(sock);454socklen = __len;455456getsockname(sock[0], __stack.__buf, &socklen);457_exit(EX_SOFTWARE); /* Should have aborted. */458459monitor:460while (waitpid(__child, &__status, 0) != __child) {461ATF_REQUIRE_EQ(EINTR, errno);462}463464if (!WIFSIGNALED(__status)) {465switch (WEXITSTATUS(__status)) {466case EX_SOFTWARE:467atf_tc_fail("FORTIFY_SOURCE failed to abort");468break;469case EX_OSERR:470atf_tc_fail("setrlimit(2) failed");471break;472default:473atf_tc_fail("child exited with status %d",474WEXITSTATUS(__status));475}476} else {477ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));478}479#undef BUF480481}482483ATF_TC(recv_before_end);484ATF_TC_HEAD(recv_before_end, tc)485{486}487ATF_TC_BODY(recv_before_end, tc)488{489#define BUF &__stack.__buf490struct {491uint8_t padding_l;492unsigned char __buf[42];493uint8_t padding_r;494} __stack;495const size_t __bufsz __unused = sizeof(__stack.__buf);496const size_t __len = 42 - 1;497const size_t __idx __unused = __len - 1;498int sock[2] = { -1, -1 };499500new_socket(sock);501502recv(sock[0], __stack.__buf, __len, 0);503#undef BUF504505}506507ATF_TC(recv_end);508ATF_TC_HEAD(recv_end, tc)509{510}511ATF_TC_BODY(recv_end, tc)512{513#define BUF &__stack.__buf514struct {515uint8_t padding_l;516unsigned char __buf[42];517uint8_t padding_r;518} __stack;519const size_t __bufsz __unused = sizeof(__stack.__buf);520const size_t __len = 42;521const size_t __idx __unused = __len - 1;522int sock[2] = { -1, -1 };523524new_socket(sock);525526recv(sock[0], __stack.__buf, __len, 0);527#undef BUF528529}530531ATF_TC(recv_heap_before_end);532ATF_TC_HEAD(recv_heap_before_end, tc)533{534}535ATF_TC_BODY(recv_heap_before_end, tc)536{537#define BUF __stack.__buf538struct {539uint8_t padding_l;540unsigned char * __buf;541uint8_t padding_r;542} __stack;543const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);544const size_t __len = 42 - 1;545const size_t __idx __unused = __len - 1;546int sock[2] = { -1, -1 };547548__stack.__buf = malloc(__bufsz);549new_socket(sock);550551recv(sock[0], __stack.__buf, __len, 0);552#undef BUF553554}555556ATF_TC(recv_heap_end);557ATF_TC_HEAD(recv_heap_end, tc)558{559}560ATF_TC_BODY(recv_heap_end, tc)561{562#define BUF __stack.__buf563struct {564uint8_t padding_l;565unsigned char * __buf;566uint8_t padding_r;567} __stack;568const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);569const size_t __len = 42;570const size_t __idx __unused = __len - 1;571int sock[2] = { -1, -1 };572573__stack.__buf = malloc(__bufsz);574new_socket(sock);575576recv(sock[0], __stack.__buf, __len, 0);577#undef BUF578579}580581ATF_TC(recv_heap_after_end);582ATF_TC_HEAD(recv_heap_after_end, tc)583{584}585ATF_TC_BODY(recv_heap_after_end, tc)586{587#define BUF __stack.__buf588struct {589uint8_t padding_l;590unsigned char * __buf;591uint8_t padding_r;592} __stack;593const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);594const size_t __len = 42 + 1;595const size_t __idx __unused = __len - 1;596pid_t __child;597int __status;598int sock[2] = { -1, -1 };599600__child = fork();601ATF_REQUIRE(__child >= 0);602if (__child > 0)603goto monitor;604605/* Child */606disable_coredumps();607__stack.__buf = malloc(__bufsz);608new_socket(sock);609610recv(sock[0], __stack.__buf, __len, 0);611_exit(EX_SOFTWARE); /* Should have aborted. */612613monitor:614while (waitpid(__child, &__status, 0) != __child) {615ATF_REQUIRE_EQ(EINTR, errno);616}617618if (!WIFSIGNALED(__status)) {619switch (WEXITSTATUS(__status)) {620case EX_SOFTWARE:621atf_tc_fail("FORTIFY_SOURCE failed to abort");622break;623case EX_OSERR:624atf_tc_fail("setrlimit(2) failed");625break;626default:627atf_tc_fail("child exited with status %d",628WEXITSTATUS(__status));629}630} else {631ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));632}633#undef BUF634635}636637ATF_TC(recvfrom_before_end);638ATF_TC_HEAD(recvfrom_before_end, tc)639{640}641ATF_TC_BODY(recvfrom_before_end, tc)642{643#define BUF &__stack.__buf644struct {645uint8_t padding_l;646unsigned char __buf[42];647uint8_t padding_r;648} __stack;649const size_t __bufsz __unused = sizeof(__stack.__buf);650const size_t __len = 42 - 1;651const size_t __idx __unused = __len - 1;652int sock[2] = { -1, -1 };653654new_socket(sock);655656recvfrom(sock[0], __stack.__buf, __len, 0, NULL, NULL);657#undef BUF658659}660661ATF_TC(recvfrom_end);662ATF_TC_HEAD(recvfrom_end, tc)663{664}665ATF_TC_BODY(recvfrom_end, tc)666{667#define BUF &__stack.__buf668struct {669uint8_t padding_l;670unsigned char __buf[42];671uint8_t padding_r;672} __stack;673const size_t __bufsz __unused = sizeof(__stack.__buf);674const size_t __len = 42;675const size_t __idx __unused = __len - 1;676int sock[2] = { -1, -1 };677678new_socket(sock);679680recvfrom(sock[0], __stack.__buf, __len, 0, NULL, NULL);681#undef BUF682683}684685ATF_TC(recvfrom_heap_before_end);686ATF_TC_HEAD(recvfrom_heap_before_end, tc)687{688}689ATF_TC_BODY(recvfrom_heap_before_end, tc)690{691#define BUF __stack.__buf692struct {693uint8_t padding_l;694unsigned char * __buf;695uint8_t padding_r;696} __stack;697const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);698const size_t __len = 42 - 1;699const size_t __idx __unused = __len - 1;700int sock[2] = { -1, -1 };701702__stack.__buf = malloc(__bufsz);703new_socket(sock);704705recvfrom(sock[0], __stack.__buf, __len, 0, NULL, NULL);706#undef BUF707708}709710ATF_TC(recvfrom_heap_end);711ATF_TC_HEAD(recvfrom_heap_end, tc)712{713}714ATF_TC_BODY(recvfrom_heap_end, tc)715{716#define BUF __stack.__buf717struct {718uint8_t padding_l;719unsigned char * __buf;720uint8_t padding_r;721} __stack;722const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);723const size_t __len = 42;724const size_t __idx __unused = __len - 1;725int sock[2] = { -1, -1 };726727__stack.__buf = malloc(__bufsz);728new_socket(sock);729730recvfrom(sock[0], __stack.__buf, __len, 0, NULL, NULL);731#undef BUF732733}734735ATF_TC(recvfrom_heap_after_end);736ATF_TC_HEAD(recvfrom_heap_after_end, tc)737{738}739ATF_TC_BODY(recvfrom_heap_after_end, tc)740{741#define BUF __stack.__buf742struct {743uint8_t padding_l;744unsigned char * __buf;745uint8_t padding_r;746} __stack;747const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);748const size_t __len = 42 + 1;749const size_t __idx __unused = __len - 1;750pid_t __child;751int __status;752int sock[2] = { -1, -1 };753754__child = fork();755ATF_REQUIRE(__child >= 0);756if (__child > 0)757goto monitor;758759/* Child */760disable_coredumps();761__stack.__buf = malloc(__bufsz);762new_socket(sock);763764recvfrom(sock[0], __stack.__buf, __len, 0, NULL, NULL);765_exit(EX_SOFTWARE); /* Should have aborted. */766767monitor:768while (waitpid(__child, &__status, 0) != __child) {769ATF_REQUIRE_EQ(EINTR, errno);770}771772if (!WIFSIGNALED(__status)) {773switch (WEXITSTATUS(__status)) {774case EX_SOFTWARE:775atf_tc_fail("FORTIFY_SOURCE failed to abort");776break;777case EX_OSERR:778atf_tc_fail("setrlimit(2) failed");779break;780default:781atf_tc_fail("child exited with status %d",782WEXITSTATUS(__status));783}784} else {785ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));786}787#undef BUF788789}790791ATF_TC(recvfrom_sockaddr_before_end);792ATF_TC_HEAD(recvfrom_sockaddr_before_end, tc)793{794}795ATF_TC_BODY(recvfrom_sockaddr_before_end, tc)796{797#define BUF &__stack.__buf798struct {799uint8_t padding_l;800struct sockaddr __buf;801uint8_t padding_r;802} __stack;803const size_t __bufsz __unused = sizeof(__stack.__buf);804const size_t __len = sizeof(struct sockaddr) - 1;805const size_t __idx __unused = __len - 1;806int sock[2] = { -1, -1 };807char data[16];808socklen_t socklen;809810new_socket(sock);811socklen = __len;812813recvfrom(sock[0], data, sizeof(data), 0, &__stack.__buf, &socklen);814#undef BUF815816}817818ATF_TC(recvfrom_sockaddr_end);819ATF_TC_HEAD(recvfrom_sockaddr_end, tc)820{821}822ATF_TC_BODY(recvfrom_sockaddr_end, tc)823{824#define BUF &__stack.__buf825struct {826uint8_t padding_l;827struct sockaddr __buf;828uint8_t padding_r;829} __stack;830const size_t __bufsz __unused = sizeof(__stack.__buf);831const size_t __len = sizeof(struct sockaddr);832const size_t __idx __unused = __len - 1;833int sock[2] = { -1, -1 };834char data[16];835socklen_t socklen;836837new_socket(sock);838socklen = __len;839840recvfrom(sock[0], data, sizeof(data), 0, &__stack.__buf, &socklen);841#undef BUF842843}844845ATF_TC(recvfrom_sockaddr_heap_before_end);846ATF_TC_HEAD(recvfrom_sockaddr_heap_before_end, tc)847{848}849ATF_TC_BODY(recvfrom_sockaddr_heap_before_end, tc)850{851#define BUF __stack.__buf852struct {853uint8_t padding_l;854struct sockaddr * __buf;855uint8_t padding_r;856} __stack;857const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);858const size_t __len = sizeof(struct sockaddr) - 1;859const size_t __idx __unused = __len - 1;860int sock[2] = { -1, -1 };861char data[16];862socklen_t socklen;863864__stack.__buf = malloc(__bufsz);865new_socket(sock);866socklen = __len;867868recvfrom(sock[0], data, sizeof(data), 0, __stack.__buf, &socklen);869#undef BUF870871}872873ATF_TC(recvfrom_sockaddr_heap_end);874ATF_TC_HEAD(recvfrom_sockaddr_heap_end, tc)875{876}877ATF_TC_BODY(recvfrom_sockaddr_heap_end, tc)878{879#define BUF __stack.__buf880struct {881uint8_t padding_l;882struct sockaddr * __buf;883uint8_t padding_r;884} __stack;885const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);886const size_t __len = sizeof(struct sockaddr);887const size_t __idx __unused = __len - 1;888int sock[2] = { -1, -1 };889char data[16];890socklen_t socklen;891892__stack.__buf = malloc(__bufsz);893new_socket(sock);894socklen = __len;895896recvfrom(sock[0], data, sizeof(data), 0, __stack.__buf, &socklen);897#undef BUF898899}900901ATF_TC(recvfrom_sockaddr_heap_after_end);902ATF_TC_HEAD(recvfrom_sockaddr_heap_after_end, tc)903{904}905ATF_TC_BODY(recvfrom_sockaddr_heap_after_end, tc)906{907#define BUF __stack.__buf908struct {909uint8_t padding_l;910struct sockaddr * __buf;911uint8_t padding_r;912} __stack;913const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);914const size_t __len = sizeof(struct sockaddr) + 1;915const size_t __idx __unused = __len - 1;916pid_t __child;917int __status;918int sock[2] = { -1, -1 };919char data[16];920socklen_t socklen;921922__child = fork();923ATF_REQUIRE(__child >= 0);924if (__child > 0)925goto monitor;926927/* Child */928disable_coredumps();929__stack.__buf = malloc(__bufsz);930new_socket(sock);931socklen = __len;932933recvfrom(sock[0], data, sizeof(data), 0, __stack.__buf, &socklen);934_exit(EX_SOFTWARE); /* Should have aborted. */935936monitor:937while (waitpid(__child, &__status, 0) != __child) {938ATF_REQUIRE_EQ(EINTR, errno);939}940941if (!WIFSIGNALED(__status)) {942switch (WEXITSTATUS(__status)) {943case EX_SOFTWARE:944atf_tc_fail("FORTIFY_SOURCE failed to abort");945break;946case EX_OSERR:947atf_tc_fail("setrlimit(2) failed");948break;949default:950atf_tc_fail("child exited with status %d",951WEXITSTATUS(__status));952}953} else {954ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));955}956#undef BUF957958}959960ATF_TC(recvmsg_msg_name_before_end);961ATF_TC_HEAD(recvmsg_msg_name_before_end, tc)962{963}964ATF_TC_BODY(recvmsg_msg_name_before_end, tc)965{966#define BUF &__stack.__buf967struct {968uint8_t padding_l;969struct sockaddr __buf;970uint8_t padding_r;971} __stack;972const size_t __bufsz __unused = sizeof(__stack.__buf);973const size_t __len = sizeof(struct sockaddr) - 1;974const size_t __idx __unused = __len - 1;975int sock[2] = { -1, -1 };976struct msghdr msg;977978memset(&msg, 0, sizeof(msg));979msg.msg_name = BUF;980msg.msg_namelen = __len;981982recvmsg(sock[0], &msg, 0);983#undef BUF984985}986987ATF_TC(recvmsg_msg_name_end);988ATF_TC_HEAD(recvmsg_msg_name_end, tc)989{990}991ATF_TC_BODY(recvmsg_msg_name_end, tc)992{993#define BUF &__stack.__buf994struct {995uint8_t padding_l;996struct sockaddr __buf;997uint8_t padding_r;998} __stack;999const size_t __bufsz __unused = sizeof(__stack.__buf);1000const size_t __len = sizeof(struct sockaddr);1001const size_t __idx __unused = __len - 1;1002int sock[2] = { -1, -1 };1003struct msghdr msg;10041005memset(&msg, 0, sizeof(msg));1006msg.msg_name = BUF;1007msg.msg_namelen = __len;10081009recvmsg(sock[0], &msg, 0);1010#undef BUF10111012}10131014ATF_TC(recvmsg_msg_name_heap_before_end);1015ATF_TC_HEAD(recvmsg_msg_name_heap_before_end, tc)1016{1017}1018ATF_TC_BODY(recvmsg_msg_name_heap_before_end, tc)1019{1020#define BUF __stack.__buf1021struct {1022uint8_t padding_l;1023struct sockaddr * __buf;1024uint8_t padding_r;1025} __stack;1026const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);1027const size_t __len = sizeof(struct sockaddr) - 1;1028const size_t __idx __unused = __len - 1;1029int sock[2] = { -1, -1 };1030struct msghdr msg;10311032__stack.__buf = malloc(__bufsz);1033memset(&msg, 0, sizeof(msg));1034msg.msg_name = BUF;1035msg.msg_namelen = __len;10361037recvmsg(sock[0], &msg, 0);1038#undef BUF10391040}10411042ATF_TC(recvmsg_msg_name_heap_end);1043ATF_TC_HEAD(recvmsg_msg_name_heap_end, tc)1044{1045}1046ATF_TC_BODY(recvmsg_msg_name_heap_end, tc)1047{1048#define BUF __stack.__buf1049struct {1050uint8_t padding_l;1051struct sockaddr * __buf;1052uint8_t padding_r;1053} __stack;1054const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);1055const size_t __len = sizeof(struct sockaddr);1056const size_t __idx __unused = __len - 1;1057int sock[2] = { -1, -1 };1058struct msghdr msg;10591060__stack.__buf = malloc(__bufsz);1061memset(&msg, 0, sizeof(msg));1062msg.msg_name = BUF;1063msg.msg_namelen = __len;10641065recvmsg(sock[0], &msg, 0);1066#undef BUF10671068}10691070ATF_TC(recvmsg_msg_name_heap_after_end);1071ATF_TC_HEAD(recvmsg_msg_name_heap_after_end, tc)1072{1073}1074ATF_TC_BODY(recvmsg_msg_name_heap_after_end, tc)1075{1076#define BUF __stack.__buf1077struct {1078uint8_t padding_l;1079struct sockaddr * __buf;1080uint8_t padding_r;1081} __stack;1082const size_t __bufsz __unused = sizeof(*__stack.__buf) * (1);1083const size_t __len = sizeof(struct sockaddr) + 1;1084const size_t __idx __unused = __len - 1;1085pid_t __child;1086int __status;1087int sock[2] = { -1, -1 };1088struct msghdr msg;10891090__child = fork();1091ATF_REQUIRE(__child >= 0);1092if (__child > 0)1093goto monitor;10941095/* Child */1096disable_coredumps();1097__stack.__buf = malloc(__bufsz);1098memset(&msg, 0, sizeof(msg));1099msg.msg_name = BUF;1100msg.msg_namelen = __len;11011102recvmsg(sock[0], &msg, 0);1103_exit(EX_SOFTWARE); /* Should have aborted. */11041105monitor:1106while (waitpid(__child, &__status, 0) != __child) {1107ATF_REQUIRE_EQ(EINTR, errno);1108}11091110if (!WIFSIGNALED(__status)) {1111switch (WEXITSTATUS(__status)) {1112case EX_SOFTWARE:1113atf_tc_fail("FORTIFY_SOURCE failed to abort");1114break;1115case EX_OSERR:1116atf_tc_fail("setrlimit(2) failed");1117break;1118default:1119atf_tc_fail("child exited with status %d",1120WEXITSTATUS(__status));1121}1122} else {1123ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));1124}1125#undef BUF11261127}11281129ATF_TC(recvmsg_msg_iov_before_end);1130ATF_TC_HEAD(recvmsg_msg_iov_before_end, tc)1131{1132}1133ATF_TC_BODY(recvmsg_msg_iov_before_end, tc)1134{1135#define BUF &__stack.__buf1136struct {1137uint8_t padding_l;1138unsigned char __buf[42];1139uint8_t padding_r;1140} __stack;1141const size_t __bufsz __unused = sizeof(__stack.__buf);1142const size_t __len = 42 - 1;1143const size_t __idx __unused = __len - 1;1144int sock[2] = { -1, -1 };1145struct msghdr msg;1146struct iovec iov[2];11471148memset(&msg, 0, sizeof(msg));1149memset(&iov[0], 0, sizeof(iov));11501151/*1152* We position the buffer second just so that we can confirm that the1153* fortification bits are traversing the iovec correctly.1154*/1155iov[1].iov_base = BUF;1156iov[1].iov_len = __len;11571158msg.msg_iov = &iov[0];1159msg.msg_iovlen = nitems(iov);11601161recvmsg(sock[0], &msg, 0);1162#undef BUF11631164}11651166ATF_TC(recvmsg_msg_iov_end);1167ATF_TC_HEAD(recvmsg_msg_iov_end, tc)1168{1169}1170ATF_TC_BODY(recvmsg_msg_iov_end, tc)1171{1172#define BUF &__stack.__buf1173struct {1174uint8_t padding_l;1175unsigned char __buf[42];1176uint8_t padding_r;1177} __stack;1178const size_t __bufsz __unused = sizeof(__stack.__buf);1179const size_t __len = 42;1180const size_t __idx __unused = __len - 1;1181int sock[2] = { -1, -1 };1182struct msghdr msg;1183struct iovec iov[2];11841185memset(&msg, 0, sizeof(msg));1186memset(&iov[0], 0, sizeof(iov));11871188/*1189* We position the buffer second just so that we can confirm that the1190* fortification bits are traversing the iovec correctly.1191*/1192iov[1].iov_base = BUF;1193iov[1].iov_len = __len;11941195msg.msg_iov = &iov[0];1196msg.msg_iovlen = nitems(iov);11971198recvmsg(sock[0], &msg, 0);1199#undef BUF12001201}12021203ATF_TC(recvmsg_msg_iov_heap_before_end);1204ATF_TC_HEAD(recvmsg_msg_iov_heap_before_end, tc)1205{1206}1207ATF_TC_BODY(recvmsg_msg_iov_heap_before_end, tc)1208{1209#define BUF __stack.__buf1210struct {1211uint8_t padding_l;1212unsigned char * __buf;1213uint8_t padding_r;1214} __stack;1215const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1216const size_t __len = 42 - 1;1217const size_t __idx __unused = __len - 1;1218int sock[2] = { -1, -1 };1219struct msghdr msg;1220struct iovec iov[2];12211222__stack.__buf = malloc(__bufsz);1223memset(&msg, 0, sizeof(msg));1224memset(&iov[0], 0, sizeof(iov));12251226/*1227* We position the buffer second just so that we can confirm that the1228* fortification bits are traversing the iovec correctly.1229*/1230iov[1].iov_base = BUF;1231iov[1].iov_len = __len;12321233msg.msg_iov = &iov[0];1234msg.msg_iovlen = nitems(iov);12351236recvmsg(sock[0], &msg, 0);1237#undef BUF12381239}12401241ATF_TC(recvmsg_msg_iov_heap_end);1242ATF_TC_HEAD(recvmsg_msg_iov_heap_end, tc)1243{1244}1245ATF_TC_BODY(recvmsg_msg_iov_heap_end, tc)1246{1247#define BUF __stack.__buf1248struct {1249uint8_t padding_l;1250unsigned char * __buf;1251uint8_t padding_r;1252} __stack;1253const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1254const size_t __len = 42;1255const size_t __idx __unused = __len - 1;1256int sock[2] = { -1, -1 };1257struct msghdr msg;1258struct iovec iov[2];12591260__stack.__buf = malloc(__bufsz);1261memset(&msg, 0, sizeof(msg));1262memset(&iov[0], 0, sizeof(iov));12631264/*1265* We position the buffer second just so that we can confirm that the1266* fortification bits are traversing the iovec correctly.1267*/1268iov[1].iov_base = BUF;1269iov[1].iov_len = __len;12701271msg.msg_iov = &iov[0];1272msg.msg_iovlen = nitems(iov);12731274recvmsg(sock[0], &msg, 0);1275#undef BUF12761277}12781279ATF_TC(recvmsg_msg_iov_heap_after_end);1280ATF_TC_HEAD(recvmsg_msg_iov_heap_after_end, tc)1281{1282}1283ATF_TC_BODY(recvmsg_msg_iov_heap_after_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) * (42);1292const size_t __len = 42 + 1;1293const size_t __idx __unused = __len - 1;1294pid_t __child;1295int __status;1296int sock[2] = { -1, -1 };1297struct msghdr msg;1298struct iovec iov[2];12991300__child = fork();1301ATF_REQUIRE(__child >= 0);1302if (__child > 0)1303goto monitor;13041305/* Child */1306disable_coredumps();1307__stack.__buf = malloc(__bufsz);1308memset(&msg, 0, sizeof(msg));1309memset(&iov[0], 0, sizeof(iov));13101311/*1312* We position the buffer second just so that we can confirm that the1313* fortification bits are traversing the iovec correctly.1314*/1315iov[1].iov_base = BUF;1316iov[1].iov_len = __len;13171318msg.msg_iov = &iov[0];1319msg.msg_iovlen = nitems(iov);13201321recvmsg(sock[0], &msg, 0);1322_exit(EX_SOFTWARE); /* Should have aborted. */13231324monitor:1325while (waitpid(__child, &__status, 0) != __child) {1326ATF_REQUIRE_EQ(EINTR, errno);1327}13281329if (!WIFSIGNALED(__status)) {1330switch (WEXITSTATUS(__status)) {1331case EX_SOFTWARE:1332atf_tc_fail("FORTIFY_SOURCE failed to abort");1333break;1334case EX_OSERR:1335atf_tc_fail("setrlimit(2) failed");1336break;1337default:1338atf_tc_fail("child exited with status %d",1339WEXITSTATUS(__status));1340}1341} else {1342ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));1343}1344#undef BUF13451346}13471348ATF_TC(recvmsg_msg_control_before_end);1349ATF_TC_HEAD(recvmsg_msg_control_before_end, tc)1350{1351}1352ATF_TC_BODY(recvmsg_msg_control_before_end, tc)1353{1354#define BUF &__stack.__buf1355struct {1356uint8_t padding_l;1357unsigned char __buf[CMSG_SPACE(sizeof(int))];1358uint8_t padding_r;1359} __stack;1360const size_t __bufsz __unused = sizeof(__stack.__buf);1361const size_t __len = CMSG_SPACE(sizeof(int)) - 1;1362const size_t __idx __unused = __len - 1;1363int sock[2] = { -1, -1 };1364struct msghdr msg;13651366memset(&msg, 0, sizeof(msg));13671368msg.msg_control = BUF;1369msg.msg_controllen = __len;13701371recvmsg(sock[0], &msg, 0);1372#undef BUF13731374}13751376ATF_TC(recvmsg_msg_control_end);1377ATF_TC_HEAD(recvmsg_msg_control_end, tc)1378{1379}1380ATF_TC_BODY(recvmsg_msg_control_end, tc)1381{1382#define BUF &__stack.__buf1383struct {1384uint8_t padding_l;1385unsigned char __buf[CMSG_SPACE(sizeof(int))];1386uint8_t padding_r;1387} __stack;1388const size_t __bufsz __unused = sizeof(__stack.__buf);1389const size_t __len = CMSG_SPACE(sizeof(int));1390const size_t __idx __unused = __len - 1;1391int sock[2] = { -1, -1 };1392struct msghdr msg;13931394memset(&msg, 0, sizeof(msg));13951396msg.msg_control = BUF;1397msg.msg_controllen = __len;13981399recvmsg(sock[0], &msg, 0);1400#undef BUF14011402}14031404ATF_TC(recvmsg_msg_control_heap_before_end);1405ATF_TC_HEAD(recvmsg_msg_control_heap_before_end, tc)1406{1407}1408ATF_TC_BODY(recvmsg_msg_control_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) * (CMSG_SPACE(sizeof(int)));1417const size_t __len = CMSG_SPACE(sizeof(int)) - 1;1418const size_t __idx __unused = __len - 1;1419int sock[2] = { -1, -1 };1420struct msghdr msg;14211422__stack.__buf = malloc(__bufsz);1423memset(&msg, 0, sizeof(msg));14241425msg.msg_control = BUF;1426msg.msg_controllen = __len;14271428recvmsg(sock[0], &msg, 0);1429#undef BUF14301431}14321433ATF_TC(recvmsg_msg_control_heap_end);1434ATF_TC_HEAD(recvmsg_msg_control_heap_end, tc)1435{1436}1437ATF_TC_BODY(recvmsg_msg_control_heap_end, tc)1438{1439#define BUF __stack.__buf1440struct {1441uint8_t padding_l;1442unsigned char * __buf;1443uint8_t padding_r;1444} __stack;1445const size_t __bufsz __unused = sizeof(*__stack.__buf) * (CMSG_SPACE(sizeof(int)));1446const size_t __len = CMSG_SPACE(sizeof(int));1447const size_t __idx __unused = __len - 1;1448int sock[2] = { -1, -1 };1449struct msghdr msg;14501451__stack.__buf = malloc(__bufsz);1452memset(&msg, 0, sizeof(msg));14531454msg.msg_control = BUF;1455msg.msg_controllen = __len;14561457recvmsg(sock[0], &msg, 0);1458#undef BUF14591460}14611462ATF_TC(recvmsg_msg_control_heap_after_end);1463ATF_TC_HEAD(recvmsg_msg_control_heap_after_end, tc)1464{1465}1466ATF_TC_BODY(recvmsg_msg_control_heap_after_end, tc)1467{1468#define BUF __stack.__buf1469struct {1470uint8_t padding_l;1471unsigned char * __buf;1472uint8_t padding_r;1473} __stack;1474const size_t __bufsz __unused = sizeof(*__stack.__buf) * (CMSG_SPACE(sizeof(int)));1475const size_t __len = CMSG_SPACE(sizeof(int)) + 1;1476const size_t __idx __unused = __len - 1;1477pid_t __child;1478int __status;1479int sock[2] = { -1, -1 };1480struct msghdr msg;14811482__child = fork();1483ATF_REQUIRE(__child >= 0);1484if (__child > 0)1485goto monitor;14861487/* Child */1488disable_coredumps();1489__stack.__buf = malloc(__bufsz);1490memset(&msg, 0, sizeof(msg));14911492msg.msg_control = BUF;1493msg.msg_controllen = __len;14941495recvmsg(sock[0], &msg, 0);1496_exit(EX_SOFTWARE); /* Should have aborted. */14971498monitor:1499while (waitpid(__child, &__status, 0) != __child) {1500ATF_REQUIRE_EQ(EINTR, errno);1501}15021503if (!WIFSIGNALED(__status)) {1504switch (WEXITSTATUS(__status)) {1505case EX_SOFTWARE:1506atf_tc_fail("FORTIFY_SOURCE failed to abort");1507break;1508case EX_OSERR:1509atf_tc_fail("setrlimit(2) failed");1510break;1511default:1512atf_tc_fail("child exited with status %d",1513WEXITSTATUS(__status));1514}1515} else {1516ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));1517}1518#undef BUF15191520}15211522ATF_TC(recvmmsg_msgvec_before_end);1523ATF_TC_HEAD(recvmmsg_msgvec_before_end, tc)1524{1525}1526ATF_TC_BODY(recvmmsg_msgvec_before_end, tc)1527{1528#define BUF &__stack.__buf1529struct {1530uint8_t padding_l;1531struct mmsghdr __buf[2];1532uint8_t padding_r;1533} __stack;1534const size_t __bufsz __unused = sizeof(__stack.__buf);1535const size_t __len = 2 - 1;1536const size_t __idx __unused = __len - 1;1537int sock[2] = { -1, -1 };15381539recvmmsg(sock[0], __stack.__buf, __len, 0, NULL);1540#undef BUF15411542}15431544ATF_TC(recvmmsg_msgvec_end);1545ATF_TC_HEAD(recvmmsg_msgvec_end, tc)1546{1547}1548ATF_TC_BODY(recvmmsg_msgvec_end, tc)1549{1550#define BUF &__stack.__buf1551struct {1552uint8_t padding_l;1553struct mmsghdr __buf[2];1554uint8_t padding_r;1555} __stack;1556const size_t __bufsz __unused = sizeof(__stack.__buf);1557const size_t __len = 2;1558const size_t __idx __unused = __len - 1;1559int sock[2] = { -1, -1 };15601561recvmmsg(sock[0], __stack.__buf, __len, 0, NULL);1562#undef BUF15631564}15651566ATF_TC(recvmmsg_msgvec_after_end);1567ATF_TC_HEAD(recvmmsg_msgvec_after_end, tc)1568{1569}1570ATF_TC_BODY(recvmmsg_msgvec_after_end, tc)1571{1572#define BUF &__stack.__buf1573struct {1574uint8_t padding_l;1575struct mmsghdr __buf[2];1576uint8_t padding_r;1577} __stack;1578const size_t __bufsz __unused = sizeof(__stack.__buf);1579const size_t __len = 2 + 1;1580const size_t __idx __unused = __len - 1;1581pid_t __child;1582int __status;1583int sock[2] = { -1, -1 };15841585__child = fork();1586ATF_REQUIRE(__child >= 0);1587if (__child > 0)1588goto monitor;15891590/* Child */1591disable_coredumps();1592recvmmsg(sock[0], __stack.__buf, __len, 0, NULL);1593_exit(EX_SOFTWARE); /* Should have aborted. */15941595monitor:1596while (waitpid(__child, &__status, 0) != __child) {1597ATF_REQUIRE_EQ(EINTR, errno);1598}15991600if (!WIFSIGNALED(__status)) {1601switch (WEXITSTATUS(__status)) {1602case EX_SOFTWARE:1603atf_tc_fail("FORTIFY_SOURCE failed to abort");1604break;1605case EX_OSERR:1606atf_tc_fail("setrlimit(2) failed");1607break;1608default:1609atf_tc_fail("child exited with status %d",1610WEXITSTATUS(__status));1611}1612} else {1613ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));1614}1615#undef BUF16161617}16181619ATF_TC(recvmmsg_msgvec_heap_before_end);1620ATF_TC_HEAD(recvmmsg_msgvec_heap_before_end, tc)1621{1622}1623ATF_TC_BODY(recvmmsg_msgvec_heap_before_end, tc)1624{1625#define BUF __stack.__buf1626struct {1627uint8_t padding_l;1628struct mmsghdr * __buf;1629uint8_t padding_r;1630} __stack;1631const size_t __bufsz __unused = sizeof(*__stack.__buf) * (2);1632const size_t __len = 2 - 1;1633const size_t __idx __unused = __len - 1;1634int sock[2] = { -1, -1 };16351636__stack.__buf = malloc(__bufsz);16371638recvmmsg(sock[0], __stack.__buf, __len, 0, NULL);1639#undef BUF16401641}16421643ATF_TC(recvmmsg_msgvec_heap_end);1644ATF_TC_HEAD(recvmmsg_msgvec_heap_end, tc)1645{1646}1647ATF_TC_BODY(recvmmsg_msgvec_heap_end, tc)1648{1649#define BUF __stack.__buf1650struct {1651uint8_t padding_l;1652struct mmsghdr * __buf;1653uint8_t padding_r;1654} __stack;1655const size_t __bufsz __unused = sizeof(*__stack.__buf) * (2);1656const size_t __len = 2;1657const size_t __idx __unused = __len - 1;1658int sock[2] = { -1, -1 };16591660__stack.__buf = malloc(__bufsz);16611662recvmmsg(sock[0], __stack.__buf, __len, 0, NULL);1663#undef BUF16641665}16661667ATF_TC(recvmmsg_msgvec_heap_after_end);1668ATF_TC_HEAD(recvmmsg_msgvec_heap_after_end, tc)1669{1670}1671ATF_TC_BODY(recvmmsg_msgvec_heap_after_end, tc)1672{1673#define BUF __stack.__buf1674struct {1675uint8_t padding_l;1676struct mmsghdr * __buf;1677uint8_t padding_r;1678} __stack;1679const size_t __bufsz __unused = sizeof(*__stack.__buf) * (2);1680const size_t __len = 2 + 1;1681const size_t __idx __unused = __len - 1;1682pid_t __child;1683int __status;1684int sock[2] = { -1, -1 };16851686__child = fork();1687ATF_REQUIRE(__child >= 0);1688if (__child > 0)1689goto monitor;16901691/* Child */1692disable_coredumps();1693__stack.__buf = malloc(__bufsz);16941695recvmmsg(sock[0], __stack.__buf, __len, 0, NULL);1696_exit(EX_SOFTWARE); /* Should have aborted. */16971698monitor:1699while (waitpid(__child, &__status, 0) != __child) {1700ATF_REQUIRE_EQ(EINTR, errno);1701}17021703if (!WIFSIGNALED(__status)) {1704switch (WEXITSTATUS(__status)) {1705case EX_SOFTWARE:1706atf_tc_fail("FORTIFY_SOURCE failed to abort");1707break;1708case EX_OSERR:1709atf_tc_fail("setrlimit(2) failed");1710break;1711default:1712atf_tc_fail("child exited with status %d",1713WEXITSTATUS(__status));1714}1715} else {1716ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));1717}1718#undef BUF17191720}17211722ATF_TC(recvmmsg_msghdr_before_end);1723ATF_TC_HEAD(recvmmsg_msghdr_before_end, tc)1724{1725}1726ATF_TC_BODY(recvmmsg_msghdr_before_end, tc)1727{1728#define BUF &__stack.__buf1729struct {1730uint8_t padding_l;1731unsigned char __buf[42];1732uint8_t padding_r;1733} __stack;1734const size_t __bufsz __unused = sizeof(__stack.__buf);1735const size_t __len = 42 - 1;1736const size_t __idx __unused = __len - 1;1737int sock[2] = { -1, -1 };1738struct mmsghdr msgvec[2];17391740memset(&msgvec[0], 0, sizeof(msgvec));17411742/*1743* Same as above, make sure fortification isn't ignoring n > 1 elements1744* of the msgvec.1745*/1746msgvec[1].msg_hdr.msg_control = BUF;1747msgvec[1].msg_hdr.msg_controllen = __len;17481749recvmmsg(sock[0], &msgvec[0], nitems(msgvec), 0, NULL);1750#undef BUF17511752}17531754ATF_TC(recvmmsg_msghdr_end);1755ATF_TC_HEAD(recvmmsg_msghdr_end, tc)1756{1757}1758ATF_TC_BODY(recvmmsg_msghdr_end, tc)1759{1760#define BUF &__stack.__buf1761struct {1762uint8_t padding_l;1763unsigned char __buf[42];1764uint8_t padding_r;1765} __stack;1766const size_t __bufsz __unused = sizeof(__stack.__buf);1767const size_t __len = 42;1768const size_t __idx __unused = __len - 1;1769int sock[2] = { -1, -1 };1770struct mmsghdr msgvec[2];17711772memset(&msgvec[0], 0, sizeof(msgvec));17731774/*1775* Same as above, make sure fortification isn't ignoring n > 1 elements1776* of the msgvec.1777*/1778msgvec[1].msg_hdr.msg_control = BUF;1779msgvec[1].msg_hdr.msg_controllen = __len;17801781recvmmsg(sock[0], &msgvec[0], nitems(msgvec), 0, NULL);1782#undef BUF17831784}17851786ATF_TC(recvmmsg_msghdr_heap_before_end);1787ATF_TC_HEAD(recvmmsg_msghdr_heap_before_end, tc)1788{1789}1790ATF_TC_BODY(recvmmsg_msghdr_heap_before_end, tc)1791{1792#define BUF __stack.__buf1793struct {1794uint8_t padding_l;1795unsigned char * __buf;1796uint8_t padding_r;1797} __stack;1798const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1799const size_t __len = 42 - 1;1800const size_t __idx __unused = __len - 1;1801int sock[2] = { -1, -1 };1802struct mmsghdr msgvec[2];18031804__stack.__buf = malloc(__bufsz);1805memset(&msgvec[0], 0, sizeof(msgvec));18061807/*1808* Same as above, make sure fortification isn't ignoring n > 1 elements1809* of the msgvec.1810*/1811msgvec[1].msg_hdr.msg_control = BUF;1812msgvec[1].msg_hdr.msg_controllen = __len;18131814recvmmsg(sock[0], &msgvec[0], nitems(msgvec), 0, NULL);1815#undef BUF18161817}18181819ATF_TC(recvmmsg_msghdr_heap_end);1820ATF_TC_HEAD(recvmmsg_msghdr_heap_end, tc)1821{1822}1823ATF_TC_BODY(recvmmsg_msghdr_heap_end, tc)1824{1825#define BUF __stack.__buf1826struct {1827uint8_t padding_l;1828unsigned char * __buf;1829uint8_t padding_r;1830} __stack;1831const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1832const size_t __len = 42;1833const size_t __idx __unused = __len - 1;1834int sock[2] = { -1, -1 };1835struct mmsghdr msgvec[2];18361837__stack.__buf = malloc(__bufsz);1838memset(&msgvec[0], 0, sizeof(msgvec));18391840/*1841* Same as above, make sure fortification isn't ignoring n > 1 elements1842* of the msgvec.1843*/1844msgvec[1].msg_hdr.msg_control = BUF;1845msgvec[1].msg_hdr.msg_controllen = __len;18461847recvmmsg(sock[0], &msgvec[0], nitems(msgvec), 0, NULL);1848#undef BUF18491850}18511852ATF_TC(recvmmsg_msghdr_heap_after_end);1853ATF_TC_HEAD(recvmmsg_msghdr_heap_after_end, tc)1854{1855}1856ATF_TC_BODY(recvmmsg_msghdr_heap_after_end, tc)1857{1858#define BUF __stack.__buf1859struct {1860uint8_t padding_l;1861unsigned char * __buf;1862uint8_t padding_r;1863} __stack;1864const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1865const size_t __len = 42 + 1;1866const size_t __idx __unused = __len - 1;1867pid_t __child;1868int __status;1869int sock[2] = { -1, -1 };1870struct mmsghdr msgvec[2];18711872__child = fork();1873ATF_REQUIRE(__child >= 0);1874if (__child > 0)1875goto monitor;18761877/* Child */1878disable_coredumps();1879__stack.__buf = malloc(__bufsz);1880memset(&msgvec[0], 0, sizeof(msgvec));18811882/*1883* Same as above, make sure fortification isn't ignoring n > 1 elements1884* of the msgvec.1885*/1886msgvec[1].msg_hdr.msg_control = BUF;1887msgvec[1].msg_hdr.msg_controllen = __len;18881889recvmmsg(sock[0], &msgvec[0], nitems(msgvec), 0, NULL);1890_exit(EX_SOFTWARE); /* Should have aborted. */18911892monitor:1893while (waitpid(__child, &__status, 0) != __child) {1894ATF_REQUIRE_EQ(EINTR, errno);1895}18961897if (!WIFSIGNALED(__status)) {1898switch (WEXITSTATUS(__status)) {1899case EX_SOFTWARE:1900atf_tc_fail("FORTIFY_SOURCE failed to abort");1901break;1902case EX_OSERR:1903atf_tc_fail("setrlimit(2) failed");1904break;1905default:1906atf_tc_fail("child exited with status %d",1907WEXITSTATUS(__status));1908}1909} else {1910ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));1911}1912#undef BUF19131914}19151916ATF_TP_ADD_TCS(tp)1917{1918ATF_TP_ADD_TC(tp, getpeername_before_end);1919ATF_TP_ADD_TC(tp, getpeername_end);1920ATF_TP_ADD_TC(tp, getpeername_heap_before_end);1921ATF_TP_ADD_TC(tp, getpeername_heap_end);1922ATF_TP_ADD_TC(tp, getpeername_heap_after_end);1923ATF_TP_ADD_TC(tp, getsockname_before_end);1924ATF_TP_ADD_TC(tp, getsockname_end);1925ATF_TP_ADD_TC(tp, getsockname_heap_before_end);1926ATF_TP_ADD_TC(tp, getsockname_heap_end);1927ATF_TP_ADD_TC(tp, getsockname_heap_after_end);1928ATF_TP_ADD_TC(tp, recv_before_end);1929ATF_TP_ADD_TC(tp, recv_end);1930ATF_TP_ADD_TC(tp, recv_heap_before_end);1931ATF_TP_ADD_TC(tp, recv_heap_end);1932ATF_TP_ADD_TC(tp, recv_heap_after_end);1933ATF_TP_ADD_TC(tp, recvfrom_before_end);1934ATF_TP_ADD_TC(tp, recvfrom_end);1935ATF_TP_ADD_TC(tp, recvfrom_heap_before_end);1936ATF_TP_ADD_TC(tp, recvfrom_heap_end);1937ATF_TP_ADD_TC(tp, recvfrom_heap_after_end);1938ATF_TP_ADD_TC(tp, recvfrom_sockaddr_before_end);1939ATF_TP_ADD_TC(tp, recvfrom_sockaddr_end);1940ATF_TP_ADD_TC(tp, recvfrom_sockaddr_heap_before_end);1941ATF_TP_ADD_TC(tp, recvfrom_sockaddr_heap_end);1942ATF_TP_ADD_TC(tp, recvfrom_sockaddr_heap_after_end);1943ATF_TP_ADD_TC(tp, recvmsg_msg_name_before_end);1944ATF_TP_ADD_TC(tp, recvmsg_msg_name_end);1945ATF_TP_ADD_TC(tp, recvmsg_msg_name_heap_before_end);1946ATF_TP_ADD_TC(tp, recvmsg_msg_name_heap_end);1947ATF_TP_ADD_TC(tp, recvmsg_msg_name_heap_after_end);1948ATF_TP_ADD_TC(tp, recvmsg_msg_iov_before_end);1949ATF_TP_ADD_TC(tp, recvmsg_msg_iov_end);1950ATF_TP_ADD_TC(tp, recvmsg_msg_iov_heap_before_end);1951ATF_TP_ADD_TC(tp, recvmsg_msg_iov_heap_end);1952ATF_TP_ADD_TC(tp, recvmsg_msg_iov_heap_after_end);1953ATF_TP_ADD_TC(tp, recvmsg_msg_control_before_end);1954ATF_TP_ADD_TC(tp, recvmsg_msg_control_end);1955ATF_TP_ADD_TC(tp, recvmsg_msg_control_heap_before_end);1956ATF_TP_ADD_TC(tp, recvmsg_msg_control_heap_end);1957ATF_TP_ADD_TC(tp, recvmsg_msg_control_heap_after_end);1958ATF_TP_ADD_TC(tp, recvmmsg_msgvec_before_end);1959ATF_TP_ADD_TC(tp, recvmmsg_msgvec_end);1960ATF_TP_ADD_TC(tp, recvmmsg_msgvec_after_end);1961ATF_TP_ADD_TC(tp, recvmmsg_msgvec_heap_before_end);1962ATF_TP_ADD_TC(tp, recvmmsg_msgvec_heap_end);1963ATF_TP_ADD_TC(tp, recvmmsg_msgvec_heap_after_end);1964ATF_TP_ADD_TC(tp, recvmmsg_msghdr_before_end);1965ATF_TP_ADD_TC(tp, recvmmsg_msghdr_end);1966ATF_TP_ADD_TC(tp, recvmmsg_msghdr_heap_before_end);1967ATF_TP_ADD_TC(tp, recvmmsg_msghdr_heap_end);1968ATF_TP_ADD_TC(tp, recvmmsg_msghdr_heap_after_end);1969return (atf_no_error());1970}197119721973