18920c5f2SDmitry Chagin /*- 28920c5f2SDmitry Chagin * Copyright (c) 2023 Dmitry Chagin <dchagin@FreeBSD.org> 38920c5f2SDmitry Chagin * 48920c5f2SDmitry Chagin * SPDX-License-Identifier: BSD-2-Clause 58920c5f2SDmitry Chagin */ 68920c5f2SDmitry Chagin 78920c5f2SDmitry Chagin #include <sys/systm.h> 88920c5f2SDmitry Chagin #include <vm/vm_param.h> 98920c5f2SDmitry Chagin 108920c5f2SDmitry Chagin #include <atf-c.h> 118920c5f2SDmitry Chagin #include <dlfcn.h> 128920c5f2SDmitry Chagin 138920c5f2SDmitry Chagin static int jumpstack0(void) __noinline; 148920c5f2SDmitry Chagin static int jumpstack1(void) __noinline; 158920c5f2SDmitry Chagin 168920c5f2SDmitry Chagin static int (*socheckstack)(void) = NULL; 178920c5f2SDmitry Chagin 188920c5f2SDmitry Chagin static int checkstack(void)198920c5f2SDmitry Chagincheckstack(void) 208920c5f2SDmitry Chagin { 218920c5f2SDmitry Chagin void *fh; 228920c5f2SDmitry Chagin 238920c5f2SDmitry Chagin if (socheckstack == NULL) { 248920c5f2SDmitry Chagin fh = dlopen("libsoxstack.so", RTLD_LAZY); 258920c5f2SDmitry Chagin ATF_REQUIRE(fh != NULL); 268920c5f2SDmitry Chagin socheckstack = dlsym(fh, "checkstack"); 278920c5f2SDmitry Chagin ATF_REQUIRE(socheckstack != NULL); 288920c5f2SDmitry Chagin } 298920c5f2SDmitry Chagin return (socheckstack()); 308920c5f2SDmitry Chagin } 318920c5f2SDmitry Chagin 328920c5f2SDmitry Chagin static int jumpstack0(void)338920c5f2SDmitry Chaginjumpstack0(void) 348920c5f2SDmitry Chagin { 358920c5f2SDmitry Chagin char stack[SGROWSIZ]; 368920c5f2SDmitry Chagin 378920c5f2SDmitry Chagin explicit_bzero(stack, sizeof(stack)); 388920c5f2SDmitry Chagin return (checkstack()); 398920c5f2SDmitry Chagin } 408920c5f2SDmitry Chagin 418920c5f2SDmitry Chagin static int jumpstack1(void)428920c5f2SDmitry Chaginjumpstack1(void) 438920c5f2SDmitry Chagin { 448920c5f2SDmitry Chagin char stack[SGROWSIZ * 2]; 458920c5f2SDmitry Chagin 468920c5f2SDmitry Chagin explicit_bzero(stack, sizeof(stack)); 478920c5f2SDmitry Chagin return (checkstack()); 488920c5f2SDmitry Chagin } 498920c5f2SDmitry Chagin 508920c5f2SDmitry Chagin ATF_TC_WITHOUT_HEAD(dlopen_test); ATF_TC_BODY(dlopen_test,tc)518920c5f2SDmitry ChaginATF_TC_BODY(dlopen_test, tc) 528920c5f2SDmitry Chagin { 538920c5f2SDmitry Chagin 548920c5f2SDmitry Chagin ATF_REQUIRE(jumpstack0() == 0); 558920c5f2SDmitry Chagin ATF_REQUIRE(jumpstack1() == 0); 568920c5f2SDmitry Chagin } 578920c5f2SDmitry Chagin ATF_TP_ADD_TCS(tp)588920c5f2SDmitry ChaginATF_TP_ADD_TCS(tp) 598920c5f2SDmitry Chagin { 608920c5f2SDmitry Chagin 618920c5f2SDmitry Chagin ATF_TP_ADD_TC(tp, dlopen_test); 628920c5f2SDmitry Chagin 638920c5f2SDmitry Chagin return (atf_no_error()); 648920c5f2SDmitry Chagin } 65