xref: /src/tests/sys/vm/stack/stack_dlopen_exec_test.c (revision 8920c5f2a1175c22631780bd236026d15e2d3d72)
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 Chagin checkstack(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 Chagin jumpstack0(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 Chagin jumpstack1(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 Chagin ATF_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 Chagin ATF_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