xref: /netbsd-src/tests/lib/libexecinfo/t_backtrace_sandbox.c (revision d3693fddf3dee2a57f5278dc05ed4c0e3429354a)
1*d3693fddSriastradh /*	$NetBSD: t_backtrace_sandbox.c,v 1.2 2025/01/27 17:02:50 riastradh Exp $	*/
23532823eSchristos 
33532823eSchristos /*-
43532823eSchristos  * Copyright (c) 2025 Kyle Evans <kevans@FreeBSD.org>
53532823eSchristos  *
63532823eSchristos  * SPDX-License-Identifier: BSD-2-Clause
73532823eSchristos  */
83532823eSchristos #include <sys/cdefs.h>
9*d3693fddSriastradh __RCSID("$NetBSD: t_backtrace_sandbox.c,v 1.2 2025/01/27 17:02:50 riastradh Exp $");
103532823eSchristos 
113532823eSchristos #include <sys/param.h>
123532823eSchristos #ifdef __FreeBSD__
133532823eSchristos #include <sys/capsicum.h>
143532823eSchristos #define __arraycount(a) nitems(a)
153532823eSchristos #endif
163532823eSchristos 
173532823eSchristos #include <execinfo.h>
183532823eSchristos #include <signal.h>
193532823eSchristos #include <stdio.h>
203532823eSchristos #include <string.h>
213532823eSchristos #include <unistd.h>
223532823eSchristos 
233532823eSchristos #include <atf-c.h>
243532823eSchristos 
253532823eSchristos #define	BT_FUNCTIONS		10
263532823eSchristos 
273532823eSchristos ATF_TC(backtrace_sandbox);
283532823eSchristos ATF_TC_HEAD(backtrace_sandbox, tc)
293532823eSchristos {
303532823eSchristos         atf_tc_set_md_var(tc, "descr",
313532823eSchristos 	    "Test backtrace_sandbox_init(3) in sandbox");
323532823eSchristos #ifndef __FreeBSD__
333532823eSchristos 	atf_tc_set_md_var(tc, "require.user", "root");
343532823eSchristos #endif
353532823eSchristos }
363532823eSchristos 
373532823eSchristos ATF_TC_BODY(backtrace_sandbox, tc)
383532823eSchristos {
393532823eSchristos 	void *addr[BT_FUNCTIONS];
403532823eSchristos 	char **syms;
413532823eSchristos 	size_t frames;
423532823eSchristos 
433532823eSchristos 	frames = backtrace(addr, __arraycount(addr));
443532823eSchristos 	ATF_REQUIRE(frames > 0);
453532823eSchristos 
463532823eSchristos 	syms = backtrace_symbols_fmt(addr, frames, "%n");
473532823eSchristos 	ATF_REQUIRE(strcmp(syms[0], "atfu_backtrace_sandbox_body") == 0);
483532823eSchristos 
493532823eSchristos 	backtrace_sandbox_init();
503532823eSchristos #ifdef __FreeBSD__
513532823eSchristos 	cap_enter();
523532823eSchristos #else
533532823eSchristos 	ATF_REQUIRE(chroot("/tmp") == 0);
543532823eSchristos #endif
553532823eSchristos 
563532823eSchristos 	syms = backtrace_symbols_fmt(addr, frames, "%n");
573532823eSchristos 	ATF_REQUIRE(strcmp(syms[0], "atfu_backtrace_sandbox_body") == 0);
583532823eSchristos }
593532823eSchristos 
603532823eSchristos ATF_TP_ADD_TCS(tp)
613532823eSchristos {
623532823eSchristos 
633532823eSchristos 	ATF_TP_ADD_TC(tp, backtrace_sandbox);
643532823eSchristos 
653532823eSchristos 	return atf_no_error();
663532823eSchristos }
67