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();
 }

Reply via email to