Module Name: src
Committed By: riastradh
Date: Mon Feb 19 12:29:48 UTC 2024
Modified Files:
src/tests/lib/libc/setjmp: t_sigstack.c
Log Message:
longjmp(3): Test signal mask vs stack restore with siglongjmp too.
PR lib/57946
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/tests/lib/libc/setjmp/t_sigstack.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/libc/setjmp/t_sigstack.c
diff -u src/tests/lib/libc/setjmp/t_sigstack.c:1.2 src/tests/lib/libc/setjmp/t_sigstack.c:1.3
--- src/tests/lib/libc/setjmp/t_sigstack.c:1.2 Mon Feb 19 04:33:21 2024
+++ src/tests/lib/libc/setjmp/t_sigstack.c Mon Feb 19 12:29:48 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: t_sigstack.c,v 1.2 2024/02/19 04:33:21 riastradh Exp $ */
+/* $NetBSD: t_sigstack.c,v 1.3 2024/02/19 12:29:48 riastradh Exp $ */
/*-
* Copyright (c) 2024 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_sigstack.c,v 1.2 2024/02/19 04:33:21 riastradh Exp $");
+__RCSID("$NetBSD: t_sigstack.c,v 1.3 2024/02/19 12:29:48 riastradh Exp $");
#include <setjmp.h>
#include <signal.h>
@@ -39,7 +39,10 @@ __RCSID("$NetBSD: t_sigstack.c,v 1.2 202
struct sigaltstack ss;
jmp_buf jmp;
+sigjmp_buf sigjmp;
unsigned nentries;
+const char *bailname;
+void (*bailfn)(void) __dead;
static void
on_sigusr1(int signo, siginfo_t *si, void *ctx)
@@ -81,10 +84,10 @@ on_sigusr1(int signo, siginfo_t *si, voi
#endif
ATF_REQUIRE_MSG((sp < ss.ss_sp ||
sp > (void *)((char *)ss.ss_sp + ss.ss_size)),
- "longjmp failed to restore stack before allowing signal --"
+ "%s failed to restore stack before allowing signal --"
" interrupted stack pointer %p lies in sigaltstack"
" [%p, %p), size 0x%zx",
- sp, ss.ss_sp, (char *)ss.ss_sp + ss.ss_size, ss.ss_size);
+ bailname, sp, ss.ss_sp, (char *)ss.ss_sp + ss.ss_size, ss.ss_size);
/*
* First time through, we want to test whether longjmp restores
@@ -100,19 +103,17 @@ on_sigusr1(int signo, siginfo_t *si, voi
/*
* Jump back to the original context.
*/
- longjmp(jmp, 1);
+ (*bailfn)();
}
-ATF_TC(setjmp);
-ATF_TC_HEAD(setjmp, tc)
-{
- atf_tc_set_md_var(tc, "descr",
- "Test longjmp restores stack first, then signal mask");
-}
-ATF_TC_BODY(setjmp, tc)
+static void
+go(const char *name, void (*fn)(void) __dead)
{
struct sigaction sa;
+ bailname = name;
+ bailfn = fn;
+
/*
* Allocate a stack for the signal handler to run in, and
* configure the system to use it.
@@ -145,6 +146,33 @@ ATF_TC_BODY(setjmp, tc)
RL(sigaction(SIGUSR1, &sa, NULL));
/*
+ * Raise the signal to enter the signal handler the first time.
+ */
+ RL(raise(SIGUSR1));
+
+ /*
+ * If we ever reach this point, something went seriously wrong.
+ */
+ atf_tc_fail("unreachable");
+}
+
+static void __dead
+bail_longjmp(void)
+{
+
+ longjmp(jmp, 1);
+}
+
+ATF_TC(setjmp);
+ATF_TC_HEAD(setjmp, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test longjmp restores stack first, then signal mask");
+}
+ATF_TC_BODY(setjmp, tc)
+{
+
+ /*
* Set up a return point for the signal handler: when the
* signal handler does longjmp(jmp, 1), it comes flying out of
* here.
@@ -153,21 +181,46 @@ ATF_TC_BODY(setjmp, tc)
return;
/*
- * Raise the signal to enter the signal handler the first time.
+ * Run the test with longjmp.
*/
- RL(raise(SIGUSR1));
+ go("longjmp", &bail_longjmp);
+}
+
+static void __dead
+bail_siglongjmp(void)
+{
+
+ siglongjmp(sigjmp, 1);
+}
+
+ATF_TC(sigsetjmp);
+ATF_TC_HEAD(sigsetjmp, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test siglongjmp restores stack first, then signal mask");
+}
+ATF_TC_BODY(sigsetjmp, tc)
+{
/*
- * If we ever reach this point, something went seriously wrong.
+ * Set up a return point for the signal handler: when the
+ * signal handler does siglongjmp(sigjmp, 1), it comes flying
+ * out of here.
*/
- atf_tc_fail("unreachable");
+ if (sigsetjmp(sigjmp, /*savesigmask*/1) == 1)
+ return;
+
+ /*
+ * Run the test with siglongjmp.
+ */
+ go("siglongjmp", &bail_siglongjmp);
}
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, setjmp);
-// ATF_TP_ADD_TC(tp, sigsetjmp);
+ ATF_TP_ADD_TC(tp, sigsetjmp);
return atf_no_error();
}