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