aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2023-09-25 18:40:28 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2023-10-09 03:24:31 +0000
commite19be5b01eabc5260011d97ae807e8d2410cf511 (patch)
tree57564e666fcf0e2bfec193d630d3e49305fa5da4
parent9a077205ca6cc1fa13ad50a797aed638abb9e7cb (diff)
downloadsrc-e19be5b01eabc5260011d97ae807e8d2410cf511.tar.gz
src-e19be5b01eabc5260011d97ae807e8d2410cf511.zip
SIGSYS: add tests
(cherry picked from commit 0afcac3e37e911f7e387ebeb2aae19b2b00ca4cc)
-rw-r--r--tests/sys/kern/Makefile1
-rw-r--r--tests/sys/kern/sigsys.c69
2 files changed, 70 insertions, 0 deletions
diff --git a/tests/sys/kern/Makefile b/tests/sys/kern/Makefile
index f2fe9e7008d9..6396b22005c3 100644
--- a/tests/sys/kern/Makefile
+++ b/tests/sys/kern/Makefile
@@ -48,6 +48,7 @@ TEST_METADATA.unix_seqpacket_test+= timeout="15"
ATF_TESTS_C+= unix_socketpair_test
ATF_TESTS_C+= waitpid_nohang
ATF_TESTS_C+= pdeathsig
+ATF_TESTS_C+= sigsys
ATF_TESTS_SH+= coredump_phnum_test
ATF_TESTS_SH+= sonewconn_overflow
diff --git a/tests/sys/kern/sigsys.c b/tests/sys/kern/sigsys.c
new file mode 100644
index 000000000000..75e3816fc158
--- /dev/null
+++ b/tests/sys/kern/sigsys.c
@@ -0,0 +1,69 @@
+/*-
+ * Copyright (c) 2023 The FreeBSD Foundation
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * This software were developed by Konstantin Belousov <kib@FreeBSD.org>
+ * under sponsorship from the FreeBSD Foundation.
+ */
+
+#include <sys/syscall.h>
+
+#include <atf-c.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdatomic.h>
+#include <stdbool.h>
+
+static sig_atomic_t sigsys_cnt;
+
+static void
+sigsys_handler(int signo, siginfo_t *si, void *ucp)
+{
+ sigsys_cnt++;
+}
+
+ATF_TC(sigsys_test);
+
+ATF_TC_HEAD(sigsys_test, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Testing delivery of SIGSYS on invalid syscalls");
+}
+
+ATF_TC_BODY(sigsys_test, tc)
+{
+ struct sigaction sa;
+
+ memset(&sa, 0, sizeof(sa));
+ sa.sa_sigaction = sigsys_handler;
+ sa.sa_flags = SA_SIGINFO;
+ ATF_REQUIRE(sigaction(SIGSYS, &sa, NULL) == 0);
+
+ ATF_REQUIRE(syscall(273) == -1); /* reserved */
+ ATF_CHECK_ERRNO(ENOSYS, true);
+ atomic_signal_fence(memory_order_seq_cst);
+ ATF_CHECK_EQ(1, sigsys_cnt);
+
+ ATF_REQUIRE(syscall(440) == -1); /* SYS_kse_switchin */
+ ATF_CHECK_ERRNO(ENOSYS, true);
+ atomic_signal_fence(memory_order_seq_cst);
+ ATF_CHECK_EQ(2, sigsys_cnt);
+
+ /* Hope this is enough for say next two months */
+ ATF_REQUIRE(syscall(3000000) == -1);
+ ATF_CHECK_ERRNO(ENOSYS, true);
+ atomic_signal_fence(memory_order_seq_cst);
+ ATF_CHECK_EQ(3, sigsys_cnt);
+
+ ATF_REQUIRE(syscall(SYS_afs3_syscall) == -1);
+ ATF_CHECK_ERRNO(ENOSYS, true);
+ atomic_signal_fence(memory_order_seq_cst);
+ ATF_CHECK_EQ(4, sigsys_cnt);
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+ ATF_TP_ADD_TC(tp, sigsys_test);
+ return (atf_no_error());
+}