Path: blob/main/tests/sys/vm/stack/stack_mprotect_exec_test.c
39507 views
/*-1* Copyright (c) 2023 Dmitry Chagin <[email protected]>2*3* SPDX-License-Identifier: BSD-2-Clause4*5* PR: 2725856* Test provided by John F. Carr7*/89#include <sys/systm.h>10#include <sys/mman.h>11#include <vm/vm_param.h>1213#include <atf-c.h>14#include <signal.h>15#include <unistd.h>1617static void18sigsegv_handler(int sig __unused)19{2021atf_tc_fail("Invalid stack protection mode after grows");22}2324ATF_TC_WITHOUT_HEAD(mprotect_exec_test);25ATF_TC_BODY(mprotect_exec_test, tc)26{27long pagesize;28char *addr, *guard;29size_t alloc_size;3031signal(SIGSEGV, sigsegv_handler);3233pagesize = sysconf(_SC_PAGESIZE);34ATF_REQUIRE(pagesize > 0);3536alloc_size = SGROWSIZ * 2;37addr = mmap(NULL, alloc_size, PROT_READ | PROT_WRITE,38MAP_STACK | MAP_PRIVATE | MAP_ANON, -1, 0);39ATF_REQUIRE(addr != MAP_FAILED);4041/*42* Change prot of the last page in the mmaped stack area.43*/44guard = addr + alloc_size - SGROWSIZ;45ATF_REQUIRE(mprotect(guard, pagesize, PROT_NONE) == 0);4647((volatile char *)guard)[-1];48}4950ATF_TP_ADD_TCS(tp)51{5253ATF_TP_ADD_TC(tp, mprotect_exec_test);5455return (atf_no_error());56}575859