t_backtrace_sandbox.c revision 1.3.4.2 1 1.3.4.2 perseant /* $NetBSD: t_backtrace_sandbox.c,v 1.3.4.2 2025/08/02 05:58:08 perseant Exp $ */
2 1.3.4.2 perseant
3 1.3.4.2 perseant /*-
4 1.3.4.2 perseant * Copyright (c) 2025 Kyle Evans <kevans (at) FreeBSD.org>
5 1.3.4.2 perseant *
6 1.3.4.2 perseant * SPDX-License-Identifier: BSD-2-Clause
7 1.3.4.2 perseant */
8 1.3.4.2 perseant #include <sys/cdefs.h>
9 1.3.4.2 perseant __RCSID("$NetBSD: t_backtrace_sandbox.c,v 1.3.4.2 2025/08/02 05:58:08 perseant Exp $");
10 1.3.4.2 perseant
11 1.3.4.2 perseant #include <sys/param.h>
12 1.3.4.2 perseant #include <sys/wait.h>
13 1.3.4.2 perseant #ifdef __FreeBSD__
14 1.3.4.2 perseant #include <sys/capsicum.h>
15 1.3.4.2 perseant #define __arraycount(a) nitems(a)
16 1.3.4.2 perseant #endif
17 1.3.4.2 perseant
18 1.3.4.2 perseant #include <execinfo.h>
19 1.3.4.2 perseant #include <signal.h>
20 1.3.4.2 perseant #include <stdio.h>
21 1.3.4.2 perseant #include <string.h>
22 1.3.4.2 perseant #include <stdlib.h>
23 1.3.4.2 perseant #include <unistd.h>
24 1.3.4.2 perseant
25 1.3.4.2 perseant #include <atf-c.h>
26 1.3.4.2 perseant
27 1.3.4.2 perseant #define BT_FUNCTIONS 10
28 1.3.4.2 perseant
29 1.3.4.2 perseant ATF_TC(backtrace_sandbox);
30 1.3.4.2 perseant ATF_TC_HEAD(backtrace_sandbox, tc)
31 1.3.4.2 perseant {
32 1.3.4.2 perseant atf_tc_set_md_var(tc, "descr",
33 1.3.4.2 perseant "Test backtrace_sandbox_init(3) in sandbox");
34 1.3.4.2 perseant #ifndef __FreeBSD__
35 1.3.4.2 perseant atf_tc_set_md_var(tc, "require.user", "root");
36 1.3.4.2 perseant #endif
37 1.3.4.2 perseant }
38 1.3.4.2 perseant
39 1.3.4.2 perseant ATF_TC_BODY(backtrace_sandbox, tc)
40 1.3.4.2 perseant {
41 1.3.4.2 perseant void *addr[BT_FUNCTIONS];
42 1.3.4.2 perseant char **syms;
43 1.3.4.2 perseant size_t frames;
44 1.3.4.2 perseant pid_t pid;
45 1.3.4.2 perseant int status;
46 1.3.4.2 perseant
47 1.3.4.2 perseant frames = backtrace(addr, __arraycount(addr));
48 1.3.4.2 perseant ATF_REQUIRE(frames > 0);
49 1.3.4.2 perseant
50 1.3.4.2 perseant syms = backtrace_symbols_fmt(addr, frames, "%n");
51 1.3.4.2 perseant ATF_REQUIRE(strcmp(syms[0], "atfu_backtrace_sandbox_body") == 0);
52 1.3.4.2 perseant
53 1.3.4.2 perseant pid = fork();
54 1.3.4.2 perseant ATF_REQUIRE(pid >= 0);
55 1.3.4.2 perseant
56 1.3.4.2 perseant if (pid == 0) {
57 1.3.4.2 perseant
58 1.3.4.2 perseant backtrace_sandbox_init();
59 1.3.4.2 perseant #ifdef __FreeBSD__
60 1.3.4.2 perseant cap_enter();
61 1.3.4.2 perseant #else
62 1.3.4.2 perseant if (chroot("/tmp") != 0)
63 1.3.4.2 perseant _exit(EXIT_FAILURE);
64 1.3.4.2 perseant #endif
65 1.3.4.2 perseant
66 1.3.4.2 perseant syms = backtrace_symbols_fmt(addr, frames, "%n");
67 1.3.4.2 perseant if (strcmp(syms[0], "atfu_backtrace_sandbox_body") != 0)
68 1.3.4.2 perseant _exit(EXIT_FAILURE);
69 1.3.4.2 perseant
70 1.3.4.2 perseant backtrace_sandbox_fini();
71 1.3.4.2 perseant
72 1.3.4.2 perseant _exit(EXIT_SUCCESS);
73 1.3.4.2 perseant }
74 1.3.4.2 perseant
75 1.3.4.2 perseant (void)wait(&status);
76 1.3.4.2 perseant
77 1.3.4.2 perseant if (!WIFEXITED(status) || WEXITSTATUS(status) != EXIT_SUCCESS)
78 1.3.4.2 perseant atf_tc_fail("resolving symbols in chroot failed");
79 1.3.4.2 perseant
80 1.3.4.2 perseant }
81 1.3.4.2 perseant
82 1.3.4.2 perseant ATF_TP_ADD_TCS(tp)
83 1.3.4.2 perseant {
84 1.3.4.2 perseant
85 1.3.4.2 perseant ATF_TP_ADD_TC(tp, backtrace_sandbox);
86 1.3.4.2 perseant
87 1.3.4.2 perseant return atf_no_error();
88 1.3.4.2 perseant }
89