1*8920c5f2SDmitry Chagin /*- 2*8920c5f2SDmitry Chagin * Copyright (c) 2023 Dmitry Chagin <dchagin@FreeBSD.org> 3*8920c5f2SDmitry Chagin * 4*8920c5f2SDmitry Chagin * SPDX-License-Identifier: BSD-2-Clause 5*8920c5f2SDmitry Chagin */ 6*8920c5f2SDmitry Chagin 7*8920c5f2SDmitry Chagin #include <sys/systm.h> 8*8920c5f2SDmitry Chagin #include <vm/vm_param.h> 9*8920c5f2SDmitry Chagin 10*8920c5f2SDmitry Chagin #include <atf-c.h> 11*8920c5f2SDmitry Chagin #include <dlfcn.h> 12*8920c5f2SDmitry Chagin 13*8920c5f2SDmitry Chagin static int jumpstack0(void) __noinline; 14*8920c5f2SDmitry Chagin static int jumpstack1(void) __noinline; 15*8920c5f2SDmitry Chagin 16*8920c5f2SDmitry Chagin static int (*socheckstack)(void) = NULL; 17*8920c5f2SDmitry Chagin 18*8920c5f2SDmitry Chagin static int checkstack(void)19*8920c5f2SDmitry Chagincheckstack(void) 20*8920c5f2SDmitry Chagin { 21*8920c5f2SDmitry Chagin void *fh; 22*8920c5f2SDmitry Chagin 23*8920c5f2SDmitry Chagin if (socheckstack == NULL) { 24*8920c5f2SDmitry Chagin fh = dlopen("libsoxstack.so", RTLD_LAZY); 25*8920c5f2SDmitry Chagin ATF_REQUIRE(fh != NULL); 26*8920c5f2SDmitry Chagin socheckstack = dlsym(fh, "checkstack"); 27*8920c5f2SDmitry Chagin ATF_REQUIRE(socheckstack != NULL); 28*8920c5f2SDmitry Chagin } 29*8920c5f2SDmitry Chagin return (socheckstack()); 30*8920c5f2SDmitry Chagin } 31*8920c5f2SDmitry Chagin 32*8920c5f2SDmitry Chagin static int jumpstack0(void)33*8920c5f2SDmitry Chaginjumpstack0(void) 34*8920c5f2SDmitry Chagin { 35*8920c5f2SDmitry Chagin char stack[SGROWSIZ]; 36*8920c5f2SDmitry Chagin 37*8920c5f2SDmitry Chagin explicit_bzero(stack, sizeof(stack)); 38*8920c5f2SDmitry Chagin return (checkstack()); 39*8920c5f2SDmitry Chagin } 40*8920c5f2SDmitry Chagin 41*8920c5f2SDmitry Chagin static int jumpstack1(void)42*8920c5f2SDmitry Chaginjumpstack1(void) 43*8920c5f2SDmitry Chagin { 44*8920c5f2SDmitry Chagin char stack[SGROWSIZ * 2]; 45*8920c5f2SDmitry Chagin 46*8920c5f2SDmitry Chagin explicit_bzero(stack, sizeof(stack)); 47*8920c5f2SDmitry Chagin return (checkstack()); 48*8920c5f2SDmitry Chagin } 49*8920c5f2SDmitry Chagin 50*8920c5f2SDmitry Chagin ATF_TC_WITHOUT_HEAD(dlopen_test); ATF_TC_BODY(dlopen_test,tc)51*8920c5f2SDmitry ChaginATF_TC_BODY(dlopen_test, tc) 52*8920c5f2SDmitry Chagin { 53*8920c5f2SDmitry Chagin 54*8920c5f2SDmitry Chagin ATF_REQUIRE(jumpstack0() == 0); 55*8920c5f2SDmitry Chagin ATF_REQUIRE(jumpstack1() == 0); 56*8920c5f2SDmitry Chagin } 57*8920c5f2SDmitry Chagin ATF_TP_ADD_TCS(tp)58*8920c5f2SDmitry ChaginATF_TP_ADD_TCS(tp) 59*8920c5f2SDmitry Chagin { 60*8920c5f2SDmitry Chagin 61*8920c5f2SDmitry Chagin ATF_TP_ADD_TC(tp, dlopen_test); 62*8920c5f2SDmitry Chagin 63*8920c5f2SDmitry Chagin return (atf_no_error()); 64*8920c5f2SDmitry Chagin } 65