Path: blob/main/lib/libc/tests/secure/fortify_wchar_test.c
39553 views
/* @generated by `generate-fortify-tests.lua "wchar"` */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(wmemcpy_before_end);166ATF_TC_HEAD(wmemcpy_before_end, tc)167{168}169ATF_TC_BODY(wmemcpy_before_end, tc)170{171#define BUF &__stack.__buf172struct {173uint8_t padding_l;174wchar_t __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;180wchar_t src[__len + 10];181182wmemcpy(__stack.__buf, src, __len);183#undef BUF184185}186187ATF_TC(wmemcpy_end);188ATF_TC_HEAD(wmemcpy_end, tc)189{190}191ATF_TC_BODY(wmemcpy_end, tc)192{193#define BUF &__stack.__buf194struct {195uint8_t padding_l;196wchar_t __buf[42];197uint8_t padding_r;198} __stack;199const size_t __bufsz __unused = sizeof(__stack.__buf);200const size_t __len = 42;201const size_t __idx __unused = __len - 1;202wchar_t src[__len + 10];203204wmemcpy(__stack.__buf, src, __len);205#undef BUF206207}208209ATF_TC(wmemcpy_heap_before_end);210ATF_TC_HEAD(wmemcpy_heap_before_end, tc)211{212}213ATF_TC_BODY(wmemcpy_heap_before_end, tc)214{215#define BUF __stack.__buf216struct {217uint8_t padding_l;218wchar_t * __buf;219uint8_t padding_r;220} __stack;221const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);222const size_t __len = 42 - 1;223const size_t __idx __unused = __len - 1;224wchar_t src[__len + 10];225226__stack.__buf = malloc(__bufsz);227228wmemcpy(__stack.__buf, src, __len);229#undef BUF230231}232233ATF_TC(wmemcpy_heap_end);234ATF_TC_HEAD(wmemcpy_heap_end, tc)235{236}237ATF_TC_BODY(wmemcpy_heap_end, tc)238{239#define BUF __stack.__buf240struct {241uint8_t padding_l;242wchar_t * __buf;243uint8_t padding_r;244} __stack;245const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);246const size_t __len = 42;247const size_t __idx __unused = __len - 1;248wchar_t src[__len + 10];249250__stack.__buf = malloc(__bufsz);251252wmemcpy(__stack.__buf, src, __len);253#undef BUF254255}256257ATF_TC(wmemcpy_heap_after_end);258ATF_TC_HEAD(wmemcpy_heap_after_end, tc)259{260}261ATF_TC_BODY(wmemcpy_heap_after_end, tc)262{263#define BUF __stack.__buf264struct {265uint8_t padding_l;266wchar_t * __buf;267uint8_t padding_r;268} __stack;269const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);270const size_t __len = 42 + 1;271const size_t __idx __unused = __len - 1;272pid_t __child;273int __status;274wchar_t src[__len + 10];275276__child = fork();277ATF_REQUIRE(__child >= 0);278if (__child > 0)279goto monitor;280281/* Child */282disable_coredumps();283__stack.__buf = malloc(__bufsz);284285wmemcpy(__stack.__buf, src, __len);286_exit(EX_SOFTWARE); /* Should have aborted. */287288monitor:289while (waitpid(__child, &__status, 0) != __child) {290ATF_REQUIRE_EQ(EINTR, errno);291}292293if (!WIFSIGNALED(__status)) {294switch (WEXITSTATUS(__status)) {295case EX_SOFTWARE:296atf_tc_fail("FORTIFY_SOURCE failed to abort");297break;298case EX_OSERR:299atf_tc_fail("setrlimit(2) failed");300break;301default:302atf_tc_fail("child exited with status %d",303WEXITSTATUS(__status));304}305} else {306ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));307}308#undef BUF309310}311312ATF_TC(wmempcpy_before_end);313ATF_TC_HEAD(wmempcpy_before_end, tc)314{315}316ATF_TC_BODY(wmempcpy_before_end, tc)317{318#define BUF &__stack.__buf319struct {320uint8_t padding_l;321wchar_t __buf[42];322uint8_t padding_r;323} __stack;324const size_t __bufsz __unused = sizeof(__stack.__buf);325const size_t __len = 42 - 1;326const size_t __idx __unused = __len - 1;327wchar_t src[__len + 10];328329wmempcpy(__stack.__buf, src, __len);330#undef BUF331332}333334ATF_TC(wmempcpy_end);335ATF_TC_HEAD(wmempcpy_end, tc)336{337}338ATF_TC_BODY(wmempcpy_end, tc)339{340#define BUF &__stack.__buf341struct {342uint8_t padding_l;343wchar_t __buf[42];344uint8_t padding_r;345} __stack;346const size_t __bufsz __unused = sizeof(__stack.__buf);347const size_t __len = 42;348const size_t __idx __unused = __len - 1;349wchar_t src[__len + 10];350351wmempcpy(__stack.__buf, src, __len);352#undef BUF353354}355356ATF_TC(wmempcpy_heap_before_end);357ATF_TC_HEAD(wmempcpy_heap_before_end, tc)358{359}360ATF_TC_BODY(wmempcpy_heap_before_end, tc)361{362#define BUF __stack.__buf363struct {364uint8_t padding_l;365wchar_t * __buf;366uint8_t padding_r;367} __stack;368const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);369const size_t __len = 42 - 1;370const size_t __idx __unused = __len - 1;371wchar_t src[__len + 10];372373__stack.__buf = malloc(__bufsz);374375wmempcpy(__stack.__buf, src, __len);376#undef BUF377378}379380ATF_TC(wmempcpy_heap_end);381ATF_TC_HEAD(wmempcpy_heap_end, tc)382{383}384ATF_TC_BODY(wmempcpy_heap_end, tc)385{386#define BUF __stack.__buf387struct {388uint8_t padding_l;389wchar_t * __buf;390uint8_t padding_r;391} __stack;392const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);393const size_t __len = 42;394const size_t __idx __unused = __len - 1;395wchar_t src[__len + 10];396397__stack.__buf = malloc(__bufsz);398399wmempcpy(__stack.__buf, src, __len);400#undef BUF401402}403404ATF_TC(wmempcpy_heap_after_end);405ATF_TC_HEAD(wmempcpy_heap_after_end, tc)406{407}408ATF_TC_BODY(wmempcpy_heap_after_end, tc)409{410#define BUF __stack.__buf411struct {412uint8_t padding_l;413wchar_t * __buf;414uint8_t padding_r;415} __stack;416const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);417const size_t __len = 42 + 1;418const size_t __idx __unused = __len - 1;419pid_t __child;420int __status;421wchar_t src[__len + 10];422423__child = fork();424ATF_REQUIRE(__child >= 0);425if (__child > 0)426goto monitor;427428/* Child */429disable_coredumps();430__stack.__buf = malloc(__bufsz);431432wmempcpy(__stack.__buf, src, __len);433_exit(EX_SOFTWARE); /* Should have aborted. */434435monitor:436while (waitpid(__child, &__status, 0) != __child) {437ATF_REQUIRE_EQ(EINTR, errno);438}439440if (!WIFSIGNALED(__status)) {441switch (WEXITSTATUS(__status)) {442case EX_SOFTWARE:443atf_tc_fail("FORTIFY_SOURCE failed to abort");444break;445case EX_OSERR:446atf_tc_fail("setrlimit(2) failed");447break;448default:449atf_tc_fail("child exited with status %d",450WEXITSTATUS(__status));451}452} else {453ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));454}455#undef BUF456457}458459ATF_TC(wmemmove_before_end);460ATF_TC_HEAD(wmemmove_before_end, tc)461{462}463ATF_TC_BODY(wmemmove_before_end, tc)464{465#define BUF &__stack.__buf466struct {467uint8_t padding_l;468wchar_t __buf[42];469uint8_t padding_r;470} __stack;471const size_t __bufsz __unused = sizeof(__stack.__buf);472const size_t __len = 42 - 1;473const size_t __idx __unused = __len - 1;474wchar_t src[__len + 10];475476wmemmove(__stack.__buf, src, __len);477#undef BUF478479}480481ATF_TC(wmemmove_end);482ATF_TC_HEAD(wmemmove_end, tc)483{484}485ATF_TC_BODY(wmemmove_end, tc)486{487#define BUF &__stack.__buf488struct {489uint8_t padding_l;490wchar_t __buf[42];491uint8_t padding_r;492} __stack;493const size_t __bufsz __unused = sizeof(__stack.__buf);494const size_t __len = 42;495const size_t __idx __unused = __len - 1;496wchar_t src[__len + 10];497498wmemmove(__stack.__buf, src, __len);499#undef BUF500501}502503ATF_TC(wmemmove_heap_before_end);504ATF_TC_HEAD(wmemmove_heap_before_end, tc)505{506}507ATF_TC_BODY(wmemmove_heap_before_end, tc)508{509#define BUF __stack.__buf510struct {511uint8_t padding_l;512wchar_t * __buf;513uint8_t padding_r;514} __stack;515const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);516const size_t __len = 42 - 1;517const size_t __idx __unused = __len - 1;518wchar_t src[__len + 10];519520__stack.__buf = malloc(__bufsz);521522wmemmove(__stack.__buf, src, __len);523#undef BUF524525}526527ATF_TC(wmemmove_heap_end);528ATF_TC_HEAD(wmemmove_heap_end, tc)529{530}531ATF_TC_BODY(wmemmove_heap_end, tc)532{533#define BUF __stack.__buf534struct {535uint8_t padding_l;536wchar_t * __buf;537uint8_t padding_r;538} __stack;539const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);540const size_t __len = 42;541const size_t __idx __unused = __len - 1;542wchar_t src[__len + 10];543544__stack.__buf = malloc(__bufsz);545546wmemmove(__stack.__buf, src, __len);547#undef BUF548549}550551ATF_TC(wmemmove_heap_after_end);552ATF_TC_HEAD(wmemmove_heap_after_end, tc)553{554}555ATF_TC_BODY(wmemmove_heap_after_end, tc)556{557#define BUF __stack.__buf558struct {559uint8_t padding_l;560wchar_t * __buf;561uint8_t padding_r;562} __stack;563const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);564const size_t __len = 42 + 1;565const size_t __idx __unused = __len - 1;566pid_t __child;567int __status;568wchar_t src[__len + 10];569570__child = fork();571ATF_REQUIRE(__child >= 0);572if (__child > 0)573goto monitor;574575/* Child */576disable_coredumps();577__stack.__buf = malloc(__bufsz);578579wmemmove(__stack.__buf, src, __len);580_exit(EX_SOFTWARE); /* Should have aborted. */581582monitor:583while (waitpid(__child, &__status, 0) != __child) {584ATF_REQUIRE_EQ(EINTR, errno);585}586587if (!WIFSIGNALED(__status)) {588switch (WEXITSTATUS(__status)) {589case EX_SOFTWARE:590atf_tc_fail("FORTIFY_SOURCE failed to abort");591break;592case EX_OSERR:593atf_tc_fail("setrlimit(2) failed");594break;595default:596atf_tc_fail("child exited with status %d",597WEXITSTATUS(__status));598}599} else {600ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));601}602#undef BUF603604}605606ATF_TC(wmemset_before_end);607ATF_TC_HEAD(wmemset_before_end, tc)608{609}610ATF_TC_BODY(wmemset_before_end, tc)611{612#define BUF &__stack.__buf613struct {614uint8_t padding_l;615wchar_t __buf[42];616uint8_t padding_r;617} __stack;618const size_t __bufsz __unused = sizeof(__stack.__buf);619const size_t __len = 42 - 1;620const size_t __idx __unused = __len - 1;621622wmemset(__stack.__buf, L'0', __len);623#undef BUF624625}626627ATF_TC(wmemset_end);628ATF_TC_HEAD(wmemset_end, tc)629{630}631ATF_TC_BODY(wmemset_end, tc)632{633#define BUF &__stack.__buf634struct {635uint8_t padding_l;636wchar_t __buf[42];637uint8_t padding_r;638} __stack;639const size_t __bufsz __unused = sizeof(__stack.__buf);640const size_t __len = 42;641const size_t __idx __unused = __len - 1;642643wmemset(__stack.__buf, L'0', __len);644#undef BUF645646}647648ATF_TC(wmemset_heap_before_end);649ATF_TC_HEAD(wmemset_heap_before_end, tc)650{651}652ATF_TC_BODY(wmemset_heap_before_end, tc)653{654#define BUF __stack.__buf655struct {656uint8_t padding_l;657wchar_t * __buf;658uint8_t padding_r;659} __stack;660const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);661const size_t __len = 42 - 1;662const size_t __idx __unused = __len - 1;663664__stack.__buf = malloc(__bufsz);665666wmemset(__stack.__buf, L'0', __len);667#undef BUF668669}670671ATF_TC(wmemset_heap_end);672ATF_TC_HEAD(wmemset_heap_end, tc)673{674}675ATF_TC_BODY(wmemset_heap_end, tc)676{677#define BUF __stack.__buf678struct {679uint8_t padding_l;680wchar_t * __buf;681uint8_t padding_r;682} __stack;683const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);684const size_t __len = 42;685const size_t __idx __unused = __len - 1;686687__stack.__buf = malloc(__bufsz);688689wmemset(__stack.__buf, L'0', __len);690#undef BUF691692}693694ATF_TC(wmemset_heap_after_end);695ATF_TC_HEAD(wmemset_heap_after_end, tc)696{697}698ATF_TC_BODY(wmemset_heap_after_end, tc)699{700#define BUF __stack.__buf701struct {702uint8_t padding_l;703wchar_t * __buf;704uint8_t padding_r;705} __stack;706const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);707const size_t __len = 42 + 1;708const size_t __idx __unused = __len - 1;709pid_t __child;710int __status;711712__child = fork();713ATF_REQUIRE(__child >= 0);714if (__child > 0)715goto monitor;716717/* Child */718disable_coredumps();719__stack.__buf = malloc(__bufsz);720721wmemset(__stack.__buf, L'0', __len);722_exit(EX_SOFTWARE); /* Should have aborted. */723724monitor:725while (waitpid(__child, &__status, 0) != __child) {726ATF_REQUIRE_EQ(EINTR, errno);727}728729if (!WIFSIGNALED(__status)) {730switch (WEXITSTATUS(__status)) {731case EX_SOFTWARE:732atf_tc_fail("FORTIFY_SOURCE failed to abort");733break;734case EX_OSERR:735atf_tc_fail("setrlimit(2) failed");736break;737default:738atf_tc_fail("child exited with status %d",739WEXITSTATUS(__status));740}741} else {742ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));743}744#undef BUF745746}747748ATF_TC(wcpcpy_before_end);749ATF_TC_HEAD(wcpcpy_before_end, tc)750{751}752ATF_TC_BODY(wcpcpy_before_end, tc)753{754#define BUF &__stack.__buf755struct {756uint8_t padding_l;757wchar_t __buf[42];758uint8_t padding_r;759} __stack;760const size_t __bufsz __unused = sizeof(__stack.__buf);761const size_t __len = 42 - 1;762const size_t __idx __unused = __len - 1;763wchar_t src[__len];764765wmemset(__stack.__buf, 0, __len);766wmemset(src, 'A', __len - 1);767src[__len - 1] = '\0';768769wcpcpy(__stack.__buf, src);770#undef BUF771772}773774ATF_TC(wcpcpy_end);775ATF_TC_HEAD(wcpcpy_end, tc)776{777}778ATF_TC_BODY(wcpcpy_end, tc)779{780#define BUF &__stack.__buf781struct {782uint8_t padding_l;783wchar_t __buf[42];784uint8_t padding_r;785} __stack;786const size_t __bufsz __unused = sizeof(__stack.__buf);787const size_t __len = 42;788const size_t __idx __unused = __len - 1;789wchar_t src[__len];790791wmemset(__stack.__buf, 0, __len);792wmemset(src, 'A', __len - 1);793src[__len - 1] = '\0';794795wcpcpy(__stack.__buf, src);796#undef BUF797798}799800ATF_TC(wcpcpy_heap_before_end);801ATF_TC_HEAD(wcpcpy_heap_before_end, tc)802{803}804ATF_TC_BODY(wcpcpy_heap_before_end, tc)805{806#define BUF __stack.__buf807struct {808uint8_t padding_l;809wchar_t * __buf;810uint8_t padding_r;811} __stack;812const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);813const size_t __len = 42 - 1;814const size_t __idx __unused = __len - 1;815wchar_t src[__len];816817__stack.__buf = malloc(__bufsz);818wmemset(__stack.__buf, 0, __len);819wmemset(src, 'A', __len - 1);820src[__len - 1] = '\0';821822wcpcpy(__stack.__buf, src);823#undef BUF824825}826827ATF_TC(wcpcpy_heap_end);828ATF_TC_HEAD(wcpcpy_heap_end, tc)829{830}831ATF_TC_BODY(wcpcpy_heap_end, tc)832{833#define BUF __stack.__buf834struct {835uint8_t padding_l;836wchar_t * __buf;837uint8_t padding_r;838} __stack;839const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);840const size_t __len = 42;841const size_t __idx __unused = __len - 1;842wchar_t src[__len];843844__stack.__buf = malloc(__bufsz);845wmemset(__stack.__buf, 0, __len);846wmemset(src, 'A', __len - 1);847src[__len - 1] = '\0';848849wcpcpy(__stack.__buf, src);850#undef BUF851852}853854ATF_TC(wcpcpy_heap_after_end);855ATF_TC_HEAD(wcpcpy_heap_after_end, tc)856{857}858ATF_TC_BODY(wcpcpy_heap_after_end, tc)859{860#define BUF __stack.__buf861struct {862uint8_t padding_l;863wchar_t * __buf;864uint8_t padding_r;865} __stack;866const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);867const size_t __len = 42 + 1;868const size_t __idx __unused = __len - 1;869pid_t __child;870int __status;871wchar_t src[__len];872873__child = fork();874ATF_REQUIRE(__child >= 0);875if (__child > 0)876goto monitor;877878/* Child */879disable_coredumps();880__stack.__buf = malloc(__bufsz);881wmemset(__stack.__buf, 0, __len);882wmemset(src, 'A', __len - 1);883src[__len - 1] = '\0';884885wcpcpy(__stack.__buf, src);886_exit(EX_SOFTWARE); /* Should have aborted. */887888monitor:889while (waitpid(__child, &__status, 0) != __child) {890ATF_REQUIRE_EQ(EINTR, errno);891}892893if (!WIFSIGNALED(__status)) {894switch (WEXITSTATUS(__status)) {895case EX_SOFTWARE:896atf_tc_fail("FORTIFY_SOURCE failed to abort");897break;898case EX_OSERR:899atf_tc_fail("setrlimit(2) failed");900break;901default:902atf_tc_fail("child exited with status %d",903WEXITSTATUS(__status));904}905} else {906ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));907}908#undef BUF909910}911912ATF_TC(wcpncpy_before_end);913ATF_TC_HEAD(wcpncpy_before_end, tc)914{915}916ATF_TC_BODY(wcpncpy_before_end, tc)917{918#define BUF &__stack.__buf919struct {920uint8_t padding_l;921wchar_t __buf[42];922uint8_t padding_r;923} __stack;924const size_t __bufsz __unused = sizeof(__stack.__buf);925const size_t __len = 42 - 1;926const size_t __idx __unused = __len - 1;927wchar_t src[__len];928929wmemset(__stack.__buf, 0, __len);930wmemset(src, 'A', __len - 1);931src[__len - 1] = '\0';932933wcpncpy(__stack.__buf, src, __len);934#undef BUF935936}937938ATF_TC(wcpncpy_end);939ATF_TC_HEAD(wcpncpy_end, tc)940{941}942ATF_TC_BODY(wcpncpy_end, tc)943{944#define BUF &__stack.__buf945struct {946uint8_t padding_l;947wchar_t __buf[42];948uint8_t padding_r;949} __stack;950const size_t __bufsz __unused = sizeof(__stack.__buf);951const size_t __len = 42;952const size_t __idx __unused = __len - 1;953wchar_t src[__len];954955wmemset(__stack.__buf, 0, __len);956wmemset(src, 'A', __len - 1);957src[__len - 1] = '\0';958959wcpncpy(__stack.__buf, src, __len);960#undef BUF961962}963964ATF_TC(wcpncpy_heap_before_end);965ATF_TC_HEAD(wcpncpy_heap_before_end, tc)966{967}968ATF_TC_BODY(wcpncpy_heap_before_end, tc)969{970#define BUF __stack.__buf971struct {972uint8_t padding_l;973wchar_t * __buf;974uint8_t padding_r;975} __stack;976const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);977const size_t __len = 42 - 1;978const size_t __idx __unused = __len - 1;979wchar_t src[__len];980981__stack.__buf = malloc(__bufsz);982wmemset(__stack.__buf, 0, __len);983wmemset(src, 'A', __len - 1);984src[__len - 1] = '\0';985986wcpncpy(__stack.__buf, src, __len);987#undef BUF988989}990991ATF_TC(wcpncpy_heap_end);992ATF_TC_HEAD(wcpncpy_heap_end, tc)993{994}995ATF_TC_BODY(wcpncpy_heap_end, tc)996{997#define BUF __stack.__buf998struct {999uint8_t padding_l;1000wchar_t * __buf;1001uint8_t padding_r;1002} __stack;1003const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1004const size_t __len = 42;1005const size_t __idx __unused = __len - 1;1006wchar_t src[__len];10071008__stack.__buf = malloc(__bufsz);1009wmemset(__stack.__buf, 0, __len);1010wmemset(src, 'A', __len - 1);1011src[__len - 1] = '\0';10121013wcpncpy(__stack.__buf, src, __len);1014#undef BUF10151016}10171018ATF_TC(wcpncpy_heap_after_end);1019ATF_TC_HEAD(wcpncpy_heap_after_end, tc)1020{1021}1022ATF_TC_BODY(wcpncpy_heap_after_end, tc)1023{1024#define BUF __stack.__buf1025struct {1026uint8_t padding_l;1027wchar_t * __buf;1028uint8_t padding_r;1029} __stack;1030const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1031const size_t __len = 42 + 1;1032const size_t __idx __unused = __len - 1;1033pid_t __child;1034int __status;1035wchar_t src[__len];10361037__child = fork();1038ATF_REQUIRE(__child >= 0);1039if (__child > 0)1040goto monitor;10411042/* Child */1043disable_coredumps();1044__stack.__buf = malloc(__bufsz);1045wmemset(__stack.__buf, 0, __len);1046wmemset(src, 'A', __len - 1);1047src[__len - 1] = '\0';10481049wcpncpy(__stack.__buf, src, __len);1050_exit(EX_SOFTWARE); /* Should have aborted. */10511052monitor:1053while (waitpid(__child, &__status, 0) != __child) {1054ATF_REQUIRE_EQ(EINTR, errno);1055}10561057if (!WIFSIGNALED(__status)) {1058switch (WEXITSTATUS(__status)) {1059case EX_SOFTWARE:1060atf_tc_fail("FORTIFY_SOURCE failed to abort");1061break;1062case EX_OSERR:1063atf_tc_fail("setrlimit(2) failed");1064break;1065default:1066atf_tc_fail("child exited with status %d",1067WEXITSTATUS(__status));1068}1069} else {1070ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));1071}1072#undef BUF10731074}10751076ATF_TC(wcscat_before_end);1077ATF_TC_HEAD(wcscat_before_end, tc)1078{1079}1080ATF_TC_BODY(wcscat_before_end, tc)1081{1082#define BUF &__stack.__buf1083struct {1084uint8_t padding_l;1085wchar_t __buf[42];1086uint8_t padding_r;1087} __stack;1088const size_t __bufsz __unused = sizeof(__stack.__buf);1089const size_t __len = 42 - 1;1090const size_t __idx __unused = __len - 1;1091wchar_t src[__len];10921093wmemset(__stack.__buf, 0, __len);1094wmemset(src, 'A', __len - 1);1095src[__len - 1] = '\0';10961097wcscat(__stack.__buf, src);1098#undef BUF10991100}11011102ATF_TC(wcscat_end);1103ATF_TC_HEAD(wcscat_end, tc)1104{1105}1106ATF_TC_BODY(wcscat_end, tc)1107{1108#define BUF &__stack.__buf1109struct {1110uint8_t padding_l;1111wchar_t __buf[42];1112uint8_t padding_r;1113} __stack;1114const size_t __bufsz __unused = sizeof(__stack.__buf);1115const size_t __len = 42;1116const size_t __idx __unused = __len - 1;1117wchar_t src[__len];11181119wmemset(__stack.__buf, 0, __len);1120wmemset(src, 'A', __len - 1);1121src[__len - 1] = '\0';11221123wcscat(__stack.__buf, src);1124#undef BUF11251126}11271128ATF_TC(wcscat_heap_before_end);1129ATF_TC_HEAD(wcscat_heap_before_end, tc)1130{1131}1132ATF_TC_BODY(wcscat_heap_before_end, tc)1133{1134#define BUF __stack.__buf1135struct {1136uint8_t padding_l;1137wchar_t * __buf;1138uint8_t padding_r;1139} __stack;1140const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1141const size_t __len = 42 - 1;1142const size_t __idx __unused = __len - 1;1143wchar_t src[__len];11441145__stack.__buf = malloc(__bufsz);1146wmemset(__stack.__buf, 0, __len);1147wmemset(src, 'A', __len - 1);1148src[__len - 1] = '\0';11491150wcscat(__stack.__buf, src);1151#undef BUF11521153}11541155ATF_TC(wcscat_heap_end);1156ATF_TC_HEAD(wcscat_heap_end, tc)1157{1158}1159ATF_TC_BODY(wcscat_heap_end, tc)1160{1161#define BUF __stack.__buf1162struct {1163uint8_t padding_l;1164wchar_t * __buf;1165uint8_t padding_r;1166} __stack;1167const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1168const size_t __len = 42;1169const size_t __idx __unused = __len - 1;1170wchar_t src[__len];11711172__stack.__buf = malloc(__bufsz);1173wmemset(__stack.__buf, 0, __len);1174wmemset(src, 'A', __len - 1);1175src[__len - 1] = '\0';11761177wcscat(__stack.__buf, src);1178#undef BUF11791180}11811182ATF_TC(wcscat_heap_after_end);1183ATF_TC_HEAD(wcscat_heap_after_end, tc)1184{1185}1186ATF_TC_BODY(wcscat_heap_after_end, tc)1187{1188#define BUF __stack.__buf1189struct {1190uint8_t padding_l;1191wchar_t * __buf;1192uint8_t padding_r;1193} __stack;1194const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1195const size_t __len = 42 + 1;1196const size_t __idx __unused = __len - 1;1197pid_t __child;1198int __status;1199wchar_t src[__len];12001201__child = fork();1202ATF_REQUIRE(__child >= 0);1203if (__child > 0)1204goto monitor;12051206/* Child */1207disable_coredumps();1208__stack.__buf = malloc(__bufsz);1209wmemset(__stack.__buf, 0, __len);1210wmemset(src, 'A', __len - 1);1211src[__len - 1] = '\0';12121213wcscat(__stack.__buf, src);1214_exit(EX_SOFTWARE); /* Should have aborted. */12151216monitor:1217while (waitpid(__child, &__status, 0) != __child) {1218ATF_REQUIRE_EQ(EINTR, errno);1219}12201221if (!WIFSIGNALED(__status)) {1222switch (WEXITSTATUS(__status)) {1223case EX_SOFTWARE:1224atf_tc_fail("FORTIFY_SOURCE failed to abort");1225break;1226case EX_OSERR:1227atf_tc_fail("setrlimit(2) failed");1228break;1229default:1230atf_tc_fail("child exited with status %d",1231WEXITSTATUS(__status));1232}1233} else {1234ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));1235}1236#undef BUF12371238}12391240ATF_TC(wcslcat_before_end);1241ATF_TC_HEAD(wcslcat_before_end, tc)1242{1243}1244ATF_TC_BODY(wcslcat_before_end, tc)1245{1246#define BUF &__stack.__buf1247struct {1248uint8_t padding_l;1249wchar_t __buf[42];1250uint8_t padding_r;1251} __stack;1252const size_t __bufsz __unused = sizeof(__stack.__buf);1253const size_t __len = 42 - 1;1254const size_t __idx __unused = __len - 1;1255wchar_t src[__len];12561257wmemset(__stack.__buf, 0, __len);1258wmemset(src, 'A', __len - 1);1259src[__len - 1] = '\0';12601261wcslcat(__stack.__buf, src, __len);1262#undef BUF12631264}12651266ATF_TC(wcslcat_end);1267ATF_TC_HEAD(wcslcat_end, tc)1268{1269}1270ATF_TC_BODY(wcslcat_end, tc)1271{1272#define BUF &__stack.__buf1273struct {1274uint8_t padding_l;1275wchar_t __buf[42];1276uint8_t padding_r;1277} __stack;1278const size_t __bufsz __unused = sizeof(__stack.__buf);1279const size_t __len = 42;1280const size_t __idx __unused = __len - 1;1281wchar_t src[__len];12821283wmemset(__stack.__buf, 0, __len);1284wmemset(src, 'A', __len - 1);1285src[__len - 1] = '\0';12861287wcslcat(__stack.__buf, src, __len);1288#undef BUF12891290}12911292ATF_TC(wcslcat_heap_before_end);1293ATF_TC_HEAD(wcslcat_heap_before_end, tc)1294{1295}1296ATF_TC_BODY(wcslcat_heap_before_end, tc)1297{1298#define BUF __stack.__buf1299struct {1300uint8_t padding_l;1301wchar_t * __buf;1302uint8_t padding_r;1303} __stack;1304const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1305const size_t __len = 42 - 1;1306const size_t __idx __unused = __len - 1;1307wchar_t src[__len];13081309__stack.__buf = malloc(__bufsz);1310wmemset(__stack.__buf, 0, __len);1311wmemset(src, 'A', __len - 1);1312src[__len - 1] = '\0';13131314wcslcat(__stack.__buf, src, __len);1315#undef BUF13161317}13181319ATF_TC(wcslcat_heap_end);1320ATF_TC_HEAD(wcslcat_heap_end, tc)1321{1322}1323ATF_TC_BODY(wcslcat_heap_end, tc)1324{1325#define BUF __stack.__buf1326struct {1327uint8_t padding_l;1328wchar_t * __buf;1329uint8_t padding_r;1330} __stack;1331const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1332const size_t __len = 42;1333const size_t __idx __unused = __len - 1;1334wchar_t src[__len];13351336__stack.__buf = malloc(__bufsz);1337wmemset(__stack.__buf, 0, __len);1338wmemset(src, 'A', __len - 1);1339src[__len - 1] = '\0';13401341wcslcat(__stack.__buf, src, __len);1342#undef BUF13431344}13451346ATF_TC(wcslcat_heap_after_end);1347ATF_TC_HEAD(wcslcat_heap_after_end, tc)1348{1349}1350ATF_TC_BODY(wcslcat_heap_after_end, tc)1351{1352#define BUF __stack.__buf1353struct {1354uint8_t padding_l;1355wchar_t * __buf;1356uint8_t padding_r;1357} __stack;1358const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1359const size_t __len = 42 + 1;1360const size_t __idx __unused = __len - 1;1361pid_t __child;1362int __status;1363wchar_t src[__len];13641365__child = fork();1366ATF_REQUIRE(__child >= 0);1367if (__child > 0)1368goto monitor;13691370/* Child */1371disable_coredumps();1372__stack.__buf = malloc(__bufsz);1373wmemset(__stack.__buf, 0, __len);1374wmemset(src, 'A', __len - 1);1375src[__len - 1] = '\0';13761377wcslcat(__stack.__buf, src, __len);1378_exit(EX_SOFTWARE); /* Should have aborted. */13791380monitor:1381while (waitpid(__child, &__status, 0) != __child) {1382ATF_REQUIRE_EQ(EINTR, errno);1383}13841385if (!WIFSIGNALED(__status)) {1386switch (WEXITSTATUS(__status)) {1387case EX_SOFTWARE:1388atf_tc_fail("FORTIFY_SOURCE failed to abort");1389break;1390case EX_OSERR:1391atf_tc_fail("setrlimit(2) failed");1392break;1393default:1394atf_tc_fail("child exited with status %d",1395WEXITSTATUS(__status));1396}1397} else {1398ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));1399}1400#undef BUF14011402}14031404ATF_TC(wcsncat_before_end);1405ATF_TC_HEAD(wcsncat_before_end, tc)1406{1407}1408ATF_TC_BODY(wcsncat_before_end, tc)1409{1410#define BUF &__stack.__buf1411struct {1412uint8_t padding_l;1413wchar_t __buf[42];1414uint8_t padding_r;1415} __stack;1416const size_t __bufsz __unused = sizeof(__stack.__buf);1417const size_t __len = 42 - 1;1418const size_t __idx __unused = __len - 1;1419wchar_t src[__len];14201421wmemset(__stack.__buf, 0, __len);1422wmemset(src, 'A', __len - 1);1423src[__len - 1] = '\0';14241425wcsncat(__stack.__buf, src, __len);1426#undef BUF14271428}14291430ATF_TC(wcsncat_end);1431ATF_TC_HEAD(wcsncat_end, tc)1432{1433}1434ATF_TC_BODY(wcsncat_end, tc)1435{1436#define BUF &__stack.__buf1437struct {1438uint8_t padding_l;1439wchar_t __buf[42];1440uint8_t padding_r;1441} __stack;1442const size_t __bufsz __unused = sizeof(__stack.__buf);1443const size_t __len = 42;1444const size_t __idx __unused = __len - 1;1445wchar_t src[__len];14461447wmemset(__stack.__buf, 0, __len);1448wmemset(src, 'A', __len - 1);1449src[__len - 1] = '\0';14501451wcsncat(__stack.__buf, src, __len);1452#undef BUF14531454}14551456ATF_TC(wcsncat_heap_before_end);1457ATF_TC_HEAD(wcsncat_heap_before_end, tc)1458{1459}1460ATF_TC_BODY(wcsncat_heap_before_end, tc)1461{1462#define BUF __stack.__buf1463struct {1464uint8_t padding_l;1465wchar_t * __buf;1466uint8_t padding_r;1467} __stack;1468const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1469const size_t __len = 42 - 1;1470const size_t __idx __unused = __len - 1;1471wchar_t src[__len];14721473__stack.__buf = malloc(__bufsz);1474wmemset(__stack.__buf, 0, __len);1475wmemset(src, 'A', __len - 1);1476src[__len - 1] = '\0';14771478wcsncat(__stack.__buf, src, __len);1479#undef BUF14801481}14821483ATF_TC(wcsncat_heap_end);1484ATF_TC_HEAD(wcsncat_heap_end, tc)1485{1486}1487ATF_TC_BODY(wcsncat_heap_end, tc)1488{1489#define BUF __stack.__buf1490struct {1491uint8_t padding_l;1492wchar_t * __buf;1493uint8_t padding_r;1494} __stack;1495const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1496const size_t __len = 42;1497const size_t __idx __unused = __len - 1;1498wchar_t src[__len];14991500__stack.__buf = malloc(__bufsz);1501wmemset(__stack.__buf, 0, __len);1502wmemset(src, 'A', __len - 1);1503src[__len - 1] = '\0';15041505wcsncat(__stack.__buf, src, __len);1506#undef BUF15071508}15091510ATF_TC(wcsncat_heap_after_end);1511ATF_TC_HEAD(wcsncat_heap_after_end, tc)1512{1513}1514ATF_TC_BODY(wcsncat_heap_after_end, tc)1515{1516#define BUF __stack.__buf1517struct {1518uint8_t padding_l;1519wchar_t * __buf;1520uint8_t padding_r;1521} __stack;1522const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1523const size_t __len = 42 + 1;1524const size_t __idx __unused = __len - 1;1525pid_t __child;1526int __status;1527wchar_t src[__len];15281529__child = fork();1530ATF_REQUIRE(__child >= 0);1531if (__child > 0)1532goto monitor;15331534/* Child */1535disable_coredumps();1536__stack.__buf = malloc(__bufsz);1537wmemset(__stack.__buf, 0, __len);1538wmemset(src, 'A', __len - 1);1539src[__len - 1] = '\0';15401541wcsncat(__stack.__buf, src, __len);1542_exit(EX_SOFTWARE); /* Should have aborted. */15431544monitor:1545while (waitpid(__child, &__status, 0) != __child) {1546ATF_REQUIRE_EQ(EINTR, errno);1547}15481549if (!WIFSIGNALED(__status)) {1550switch (WEXITSTATUS(__status)) {1551case EX_SOFTWARE:1552atf_tc_fail("FORTIFY_SOURCE failed to abort");1553break;1554case EX_OSERR:1555atf_tc_fail("setrlimit(2) failed");1556break;1557default:1558atf_tc_fail("child exited with status %d",1559WEXITSTATUS(__status));1560}1561} else {1562ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));1563}1564#undef BUF15651566}15671568ATF_TC(wcscpy_before_end);1569ATF_TC_HEAD(wcscpy_before_end, tc)1570{1571}1572ATF_TC_BODY(wcscpy_before_end, tc)1573{1574#define BUF &__stack.__buf1575struct {1576uint8_t padding_l;1577wchar_t __buf[42];1578uint8_t padding_r;1579} __stack;1580const size_t __bufsz __unused = sizeof(__stack.__buf);1581const size_t __len = 42 - 1;1582const size_t __idx __unused = __len - 1;1583wchar_t src[__len];15841585wmemset(__stack.__buf, 0, __len);1586wmemset(src, 'A', __len - 1);1587src[__len - 1] = '\0';15881589wcscpy(__stack.__buf, src);1590#undef BUF15911592}15931594ATF_TC(wcscpy_end);1595ATF_TC_HEAD(wcscpy_end, tc)1596{1597}1598ATF_TC_BODY(wcscpy_end, tc)1599{1600#define BUF &__stack.__buf1601struct {1602uint8_t padding_l;1603wchar_t __buf[42];1604uint8_t padding_r;1605} __stack;1606const size_t __bufsz __unused = sizeof(__stack.__buf);1607const size_t __len = 42;1608const size_t __idx __unused = __len - 1;1609wchar_t src[__len];16101611wmemset(__stack.__buf, 0, __len);1612wmemset(src, 'A', __len - 1);1613src[__len - 1] = '\0';16141615wcscpy(__stack.__buf, src);1616#undef BUF16171618}16191620ATF_TC(wcscpy_heap_before_end);1621ATF_TC_HEAD(wcscpy_heap_before_end, tc)1622{1623}1624ATF_TC_BODY(wcscpy_heap_before_end, tc)1625{1626#define BUF __stack.__buf1627struct {1628uint8_t padding_l;1629wchar_t * __buf;1630uint8_t padding_r;1631} __stack;1632const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1633const size_t __len = 42 - 1;1634const size_t __idx __unused = __len - 1;1635wchar_t src[__len];16361637__stack.__buf = malloc(__bufsz);1638wmemset(__stack.__buf, 0, __len);1639wmemset(src, 'A', __len - 1);1640src[__len - 1] = '\0';16411642wcscpy(__stack.__buf, src);1643#undef BUF16441645}16461647ATF_TC(wcscpy_heap_end);1648ATF_TC_HEAD(wcscpy_heap_end, tc)1649{1650}1651ATF_TC_BODY(wcscpy_heap_end, tc)1652{1653#define BUF __stack.__buf1654struct {1655uint8_t padding_l;1656wchar_t * __buf;1657uint8_t padding_r;1658} __stack;1659const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1660const size_t __len = 42;1661const size_t __idx __unused = __len - 1;1662wchar_t src[__len];16631664__stack.__buf = malloc(__bufsz);1665wmemset(__stack.__buf, 0, __len);1666wmemset(src, 'A', __len - 1);1667src[__len - 1] = '\0';16681669wcscpy(__stack.__buf, src);1670#undef BUF16711672}16731674ATF_TC(wcscpy_heap_after_end);1675ATF_TC_HEAD(wcscpy_heap_after_end, tc)1676{1677}1678ATF_TC_BODY(wcscpy_heap_after_end, tc)1679{1680#define BUF __stack.__buf1681struct {1682uint8_t padding_l;1683wchar_t * __buf;1684uint8_t padding_r;1685} __stack;1686const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1687const size_t __len = 42 + 1;1688const size_t __idx __unused = __len - 1;1689pid_t __child;1690int __status;1691wchar_t src[__len];16921693__child = fork();1694ATF_REQUIRE(__child >= 0);1695if (__child > 0)1696goto monitor;16971698/* Child */1699disable_coredumps();1700__stack.__buf = malloc(__bufsz);1701wmemset(__stack.__buf, 0, __len);1702wmemset(src, 'A', __len - 1);1703src[__len - 1] = '\0';17041705wcscpy(__stack.__buf, src);1706_exit(EX_SOFTWARE); /* Should have aborted. */17071708monitor:1709while (waitpid(__child, &__status, 0) != __child) {1710ATF_REQUIRE_EQ(EINTR, errno);1711}17121713if (!WIFSIGNALED(__status)) {1714switch (WEXITSTATUS(__status)) {1715case EX_SOFTWARE:1716atf_tc_fail("FORTIFY_SOURCE failed to abort");1717break;1718case EX_OSERR:1719atf_tc_fail("setrlimit(2) failed");1720break;1721default:1722atf_tc_fail("child exited with status %d",1723WEXITSTATUS(__status));1724}1725} else {1726ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));1727}1728#undef BUF17291730}17311732ATF_TC(wcslcpy_before_end);1733ATF_TC_HEAD(wcslcpy_before_end, tc)1734{1735}1736ATF_TC_BODY(wcslcpy_before_end, tc)1737{1738#define BUF &__stack.__buf1739struct {1740uint8_t padding_l;1741wchar_t __buf[42];1742uint8_t padding_r;1743} __stack;1744const size_t __bufsz __unused = sizeof(__stack.__buf);1745const size_t __len = 42 - 1;1746const size_t __idx __unused = __len - 1;1747wchar_t src[__len];17481749wmemset(__stack.__buf, 0, __len);1750wmemset(src, 'A', __len - 1);1751src[__len - 1] = '\0';17521753wcslcpy(__stack.__buf, src, __len);1754#undef BUF17551756}17571758ATF_TC(wcslcpy_end);1759ATF_TC_HEAD(wcslcpy_end, tc)1760{1761}1762ATF_TC_BODY(wcslcpy_end, tc)1763{1764#define BUF &__stack.__buf1765struct {1766uint8_t padding_l;1767wchar_t __buf[42];1768uint8_t padding_r;1769} __stack;1770const size_t __bufsz __unused = sizeof(__stack.__buf);1771const size_t __len = 42;1772const size_t __idx __unused = __len - 1;1773wchar_t src[__len];17741775wmemset(__stack.__buf, 0, __len);1776wmemset(src, 'A', __len - 1);1777src[__len - 1] = '\0';17781779wcslcpy(__stack.__buf, src, __len);1780#undef BUF17811782}17831784ATF_TC(wcslcpy_heap_before_end);1785ATF_TC_HEAD(wcslcpy_heap_before_end, tc)1786{1787}1788ATF_TC_BODY(wcslcpy_heap_before_end, tc)1789{1790#define BUF __stack.__buf1791struct {1792uint8_t padding_l;1793wchar_t * __buf;1794uint8_t padding_r;1795} __stack;1796const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1797const size_t __len = 42 - 1;1798const size_t __idx __unused = __len - 1;1799wchar_t src[__len];18001801__stack.__buf = malloc(__bufsz);1802wmemset(__stack.__buf, 0, __len);1803wmemset(src, 'A', __len - 1);1804src[__len - 1] = '\0';18051806wcslcpy(__stack.__buf, src, __len);1807#undef BUF18081809}18101811ATF_TC(wcslcpy_heap_end);1812ATF_TC_HEAD(wcslcpy_heap_end, tc)1813{1814}1815ATF_TC_BODY(wcslcpy_heap_end, tc)1816{1817#define BUF __stack.__buf1818struct {1819uint8_t padding_l;1820wchar_t * __buf;1821uint8_t padding_r;1822} __stack;1823const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1824const size_t __len = 42;1825const size_t __idx __unused = __len - 1;1826wchar_t src[__len];18271828__stack.__buf = malloc(__bufsz);1829wmemset(__stack.__buf, 0, __len);1830wmemset(src, 'A', __len - 1);1831src[__len - 1] = '\0';18321833wcslcpy(__stack.__buf, src, __len);1834#undef BUF18351836}18371838ATF_TC(wcslcpy_heap_after_end);1839ATF_TC_HEAD(wcslcpy_heap_after_end, tc)1840{1841}1842ATF_TC_BODY(wcslcpy_heap_after_end, tc)1843{1844#define BUF __stack.__buf1845struct {1846uint8_t padding_l;1847wchar_t * __buf;1848uint8_t padding_r;1849} __stack;1850const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1851const size_t __len = 42 + 1;1852const size_t __idx __unused = __len - 1;1853pid_t __child;1854int __status;1855wchar_t src[__len];18561857__child = fork();1858ATF_REQUIRE(__child >= 0);1859if (__child > 0)1860goto monitor;18611862/* Child */1863disable_coredumps();1864__stack.__buf = malloc(__bufsz);1865wmemset(__stack.__buf, 0, __len);1866wmemset(src, 'A', __len - 1);1867src[__len - 1] = '\0';18681869wcslcpy(__stack.__buf, src, __len);1870_exit(EX_SOFTWARE); /* Should have aborted. */18711872monitor:1873while (waitpid(__child, &__status, 0) != __child) {1874ATF_REQUIRE_EQ(EINTR, errno);1875}18761877if (!WIFSIGNALED(__status)) {1878switch (WEXITSTATUS(__status)) {1879case EX_SOFTWARE:1880atf_tc_fail("FORTIFY_SOURCE failed to abort");1881break;1882case EX_OSERR:1883atf_tc_fail("setrlimit(2) failed");1884break;1885default:1886atf_tc_fail("child exited with status %d",1887WEXITSTATUS(__status));1888}1889} else {1890ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));1891}1892#undef BUF18931894}18951896ATF_TC(wcsncpy_before_end);1897ATF_TC_HEAD(wcsncpy_before_end, tc)1898{1899}1900ATF_TC_BODY(wcsncpy_before_end, tc)1901{1902#define BUF &__stack.__buf1903struct {1904uint8_t padding_l;1905wchar_t __buf[42];1906uint8_t padding_r;1907} __stack;1908const size_t __bufsz __unused = sizeof(__stack.__buf);1909const size_t __len = 42 - 1;1910const size_t __idx __unused = __len - 1;1911wchar_t src[__len];19121913wmemset(__stack.__buf, 0, __len);1914wmemset(src, 'A', __len - 1);1915src[__len - 1] = '\0';19161917wcsncpy(__stack.__buf, src, __len);1918#undef BUF19191920}19211922ATF_TC(wcsncpy_end);1923ATF_TC_HEAD(wcsncpy_end, tc)1924{1925}1926ATF_TC_BODY(wcsncpy_end, tc)1927{1928#define BUF &__stack.__buf1929struct {1930uint8_t padding_l;1931wchar_t __buf[42];1932uint8_t padding_r;1933} __stack;1934const size_t __bufsz __unused = sizeof(__stack.__buf);1935const size_t __len = 42;1936const size_t __idx __unused = __len - 1;1937wchar_t src[__len];19381939wmemset(__stack.__buf, 0, __len);1940wmemset(src, 'A', __len - 1);1941src[__len - 1] = '\0';19421943wcsncpy(__stack.__buf, src, __len);1944#undef BUF19451946}19471948ATF_TC(wcsncpy_heap_before_end);1949ATF_TC_HEAD(wcsncpy_heap_before_end, tc)1950{1951}1952ATF_TC_BODY(wcsncpy_heap_before_end, tc)1953{1954#define BUF __stack.__buf1955struct {1956uint8_t padding_l;1957wchar_t * __buf;1958uint8_t padding_r;1959} __stack;1960const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1961const size_t __len = 42 - 1;1962const size_t __idx __unused = __len - 1;1963wchar_t src[__len];19641965__stack.__buf = malloc(__bufsz);1966wmemset(__stack.__buf, 0, __len);1967wmemset(src, 'A', __len - 1);1968src[__len - 1] = '\0';19691970wcsncpy(__stack.__buf, src, __len);1971#undef BUF19721973}19741975ATF_TC(wcsncpy_heap_end);1976ATF_TC_HEAD(wcsncpy_heap_end, tc)1977{1978}1979ATF_TC_BODY(wcsncpy_heap_end, tc)1980{1981#define BUF __stack.__buf1982struct {1983uint8_t padding_l;1984wchar_t * __buf;1985uint8_t padding_r;1986} __stack;1987const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);1988const size_t __len = 42;1989const size_t __idx __unused = __len - 1;1990wchar_t src[__len];19911992__stack.__buf = malloc(__bufsz);1993wmemset(__stack.__buf, 0, __len);1994wmemset(src, 'A', __len - 1);1995src[__len - 1] = '\0';19961997wcsncpy(__stack.__buf, src, __len);1998#undef BUF19992000}20012002ATF_TC(wcsncpy_heap_after_end);2003ATF_TC_HEAD(wcsncpy_heap_after_end, tc)2004{2005}2006ATF_TC_BODY(wcsncpy_heap_after_end, tc)2007{2008#define BUF __stack.__buf2009struct {2010uint8_t padding_l;2011wchar_t * __buf;2012uint8_t padding_r;2013} __stack;2014const size_t __bufsz __unused = sizeof(*__stack.__buf) * (42);2015const size_t __len = 42 + 1;2016const size_t __idx __unused = __len - 1;2017pid_t __child;2018int __status;2019wchar_t src[__len];20202021__child = fork();2022ATF_REQUIRE(__child >= 0);2023if (__child > 0)2024goto monitor;20252026/* Child */2027disable_coredumps();2028__stack.__buf = malloc(__bufsz);2029wmemset(__stack.__buf, 0, __len);2030wmemset(src, 'A', __len - 1);2031src[__len - 1] = '\0';20322033wcsncpy(__stack.__buf, src, __len);2034_exit(EX_SOFTWARE); /* Should have aborted. */20352036monitor:2037while (waitpid(__child, &__status, 0) != __child) {2038ATF_REQUIRE_EQ(EINTR, errno);2039}20402041if (!WIFSIGNALED(__status)) {2042switch (WEXITSTATUS(__status)) {2043case EX_SOFTWARE:2044atf_tc_fail("FORTIFY_SOURCE failed to abort");2045break;2046case EX_OSERR:2047atf_tc_fail("setrlimit(2) failed");2048break;2049default:2050atf_tc_fail("child exited with status %d",2051WEXITSTATUS(__status));2052}2053} else {2054ATF_REQUIRE_EQ(SIGABRT, WTERMSIG(__status));2055}2056#undef BUF20572058}20592060ATF_TP_ADD_TCS(tp)2061{2062ATF_TP_ADD_TC(tp, wmemcpy_before_end);2063ATF_TP_ADD_TC(tp, wmemcpy_end);2064ATF_TP_ADD_TC(tp, wmemcpy_heap_before_end);2065ATF_TP_ADD_TC(tp, wmemcpy_heap_end);2066ATF_TP_ADD_TC(tp, wmemcpy_heap_after_end);2067ATF_TP_ADD_TC(tp, wmempcpy_before_end);2068ATF_TP_ADD_TC(tp, wmempcpy_end);2069ATF_TP_ADD_TC(tp, wmempcpy_heap_before_end);2070ATF_TP_ADD_TC(tp, wmempcpy_heap_end);2071ATF_TP_ADD_TC(tp, wmempcpy_heap_after_end);2072ATF_TP_ADD_TC(tp, wmemmove_before_end);2073ATF_TP_ADD_TC(tp, wmemmove_end);2074ATF_TP_ADD_TC(tp, wmemmove_heap_before_end);2075ATF_TP_ADD_TC(tp, wmemmove_heap_end);2076ATF_TP_ADD_TC(tp, wmemmove_heap_after_end);2077ATF_TP_ADD_TC(tp, wmemset_before_end);2078ATF_TP_ADD_TC(tp, wmemset_end);2079ATF_TP_ADD_TC(tp, wmemset_heap_before_end);2080ATF_TP_ADD_TC(tp, wmemset_heap_end);2081ATF_TP_ADD_TC(tp, wmemset_heap_after_end);2082ATF_TP_ADD_TC(tp, wcpcpy_before_end);2083ATF_TP_ADD_TC(tp, wcpcpy_end);2084ATF_TP_ADD_TC(tp, wcpcpy_heap_before_end);2085ATF_TP_ADD_TC(tp, wcpcpy_heap_end);2086ATF_TP_ADD_TC(tp, wcpcpy_heap_after_end);2087ATF_TP_ADD_TC(tp, wcpncpy_before_end);2088ATF_TP_ADD_TC(tp, wcpncpy_end);2089ATF_TP_ADD_TC(tp, wcpncpy_heap_before_end);2090ATF_TP_ADD_TC(tp, wcpncpy_heap_end);2091ATF_TP_ADD_TC(tp, wcpncpy_heap_after_end);2092ATF_TP_ADD_TC(tp, wcscat_before_end);2093ATF_TP_ADD_TC(tp, wcscat_end);2094ATF_TP_ADD_TC(tp, wcscat_heap_before_end);2095ATF_TP_ADD_TC(tp, wcscat_heap_end);2096ATF_TP_ADD_TC(tp, wcscat_heap_after_end);2097ATF_TP_ADD_TC(tp, wcslcat_before_end);2098ATF_TP_ADD_TC(tp, wcslcat_end);2099ATF_TP_ADD_TC(tp, wcslcat_heap_before_end);2100ATF_TP_ADD_TC(tp, wcslcat_heap_end);2101ATF_TP_ADD_TC(tp, wcslcat_heap_after_end);2102ATF_TP_ADD_TC(tp, wcsncat_before_end);2103ATF_TP_ADD_TC(tp, wcsncat_end);2104ATF_TP_ADD_TC(tp, wcsncat_heap_before_end);2105ATF_TP_ADD_TC(tp, wcsncat_heap_end);2106ATF_TP_ADD_TC(tp, wcsncat_heap_after_end);2107ATF_TP_ADD_TC(tp, wcscpy_before_end);2108ATF_TP_ADD_TC(tp, wcscpy_end);2109ATF_TP_ADD_TC(tp, wcscpy_heap_before_end);2110ATF_TP_ADD_TC(tp, wcscpy_heap_end);2111ATF_TP_ADD_TC(tp, wcscpy_heap_after_end);2112ATF_TP_ADD_TC(tp, wcslcpy_before_end);2113ATF_TP_ADD_TC(tp, wcslcpy_end);2114ATF_TP_ADD_TC(tp, wcslcpy_heap_before_end);2115ATF_TP_ADD_TC(tp, wcslcpy_heap_end);2116ATF_TP_ADD_TC(tp, wcslcpy_heap_after_end);2117ATF_TP_ADD_TC(tp, wcsncpy_before_end);2118ATF_TP_ADD_TC(tp, wcsncpy_end);2119ATF_TP_ADD_TC(tp, wcsncpy_heap_before_end);2120ATF_TP_ADD_TC(tp, wcsncpy_heap_end);2121ATF_TP_ADD_TC(tp, wcsncpy_heap_after_end);2122return (atf_no_error());2123}212421252126