Module Name: src
Committed By: riastradh
Date: Mon Jul 25 10:38:17 UTC 2022
Modified Files:
src/tests/lib/libexecinfo: t_sig_backtrace.c
Log Message:
execinfo: Test stack traces through null pointer jump too.
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/tests/lib/libexecinfo/t_sig_backtrace.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/tests/lib/libexecinfo/t_sig_backtrace.c
diff -u src/tests/lib/libexecinfo/t_sig_backtrace.c:1.2 src/tests/lib/libexecinfo/t_sig_backtrace.c:1.3
--- src/tests/lib/libexecinfo/t_sig_backtrace.c:1.2 Tue Nov 23 23:29:55 2021
+++ src/tests/lib/libexecinfo/t_sig_backtrace.c Mon Jul 25 10:38:17 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: t_sig_backtrace.c,v 1.2 2021/11/23 23:29:55 thorpej Exp $ */
+/* $NetBSD: t_sig_backtrace.c,v 1.3 2022/07/25 10:38:17 riastradh Exp $ */
/*-
* Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_sig_backtrace.c,v 1.2 2021/11/23 23:29:55 thorpej Exp $");
+__RCSID("$NetBSD: t_sig_backtrace.c,v 1.3 2022/07/25 10:38:17 riastradh Exp $");
#include <sys/mman.h>
#include <execinfo.h>
@@ -48,8 +48,10 @@ __RCSID("$NetBSD: t_sig_backtrace.c,v 1.
stack_t sig_stack;
char *foo;
+char *(*bar)(void);
-static int the_loop(int);
+static int the_loop_deref(int);
+static int the_loop_jump(int);
#ifdef NOINLINE_HACK
volatile int noinline;
@@ -59,7 +61,7 @@ static int __noinline
func1(int i)
{
if (i > 100) {
- return the_loop(i);
+ return the_loop_deref(i);
}
return i + 1;
}
@@ -81,7 +83,7 @@ func3(int i)
}
static int __noinline
-the_loop(int i)
+the_loop_deref(int i)
{
while (*foo != 0) {
i = func3(i);
@@ -97,6 +99,23 @@ the_loop(int i)
return i;
}
+static int __noinline
+the_loop_jump(int i)
+{
+ while ((*bar)() != 0) {
+ i = func3(i);
+ i = func1(i);
+ i = func2(i);
+ }
+
+#ifdef NOINLINE_HACK
+ if (noinline)
+ vfork();
+#endif
+
+ return i;
+}
+
jmp_buf env;
static void
@@ -155,14 +174,42 @@ handler(int s)
longjmp(env, 1);
}
-ATF_TC(sig_backtrace);
-ATF_TC_HEAD(sig_backtrace, tc)
+ATF_TC(sig_backtrace_deref);
+ATF_TC_HEAD(sig_backtrace_deref, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test backtrace(3) across signal handlers, null pointer deref");
+}
+
+ATF_TC_BODY(sig_backtrace_deref, tc)
+{
+ sig_stack.ss_sp = mmap(NULL, SIGSTKSZ, PROT_READ | PROT_WRITE,
+ MAP_ANON | MAP_STACK, -1, 0);
+ ATF_REQUIRE(sig_stack.ss_sp != MAP_FAILED);
+
+ sig_stack.ss_size = SIGSTKSZ;
+ sig_stack.ss_flags = 0;
+ ATF_REQUIRE(sigaltstack(&sig_stack, NULL) == 0);
+
+ struct sigaction sa = {
+ .sa_handler = handler,
+ .sa_flags = SA_ONSTACK,
+ };
+ ATF_REQUIRE(sigaction(SIGSEGV, &sa, NULL) == 0);
+
+ if (setjmp(env) == 0) {
+ printf("%d\n", the_loop_deref(0));
+ }
+}
+
+ATF_TC(sig_backtrace_jump);
+ATF_TC_HEAD(sig_backtrace_jump, tc)
{
atf_tc_set_md_var(tc, "descr",
- "Test backtrace(3) across signal handlers");
+ "Test backtrace(3) across signal handlers, null pointer jump");
}
-ATF_TC_BODY(sig_backtrace, tc)
+ATF_TC_BODY(sig_backtrace_jump, tc)
{
sig_stack.ss_sp = mmap(NULL, SIGSTKSZ, PROT_READ | PROT_WRITE,
MAP_ANON | MAP_STACK, -1, 0);
@@ -179,13 +226,14 @@ ATF_TC_BODY(sig_backtrace, tc)
ATF_REQUIRE(sigaction(SIGSEGV, &sa, NULL) == 0);
if (setjmp(env) == 0) {
- printf("%d\n", the_loop(0));
+ printf("%d\n", the_loop_jump(0));
}
}
ATF_TP_ADD_TCS(tp)
{
- ATF_TP_ADD_TC(tp, sig_backtrace);
+ ATF_TP_ADD_TC(tp, sig_backtrace_deref);
+ ATF_TP_ADD_TC(tp, sig_backtrace_jump);
return atf_no_error();
}