t_sigaltstack.c revision 1.2 1 1.2 christos /* $NetBSD: t_sigaltstack.c,v 1.2 2020/05/01 21:35:30 christos Exp $ */
2 1.1 ryo
3 1.1 ryo /*-
4 1.1 ryo * Copyright (c) 2020 The NetBSD Foundation, Inc.
5 1.1 ryo * All rights reserved.
6 1.1 ryo *
7 1.1 ryo * Redistribution and use in source and binary forms, with or without
8 1.1 ryo * modification, are permitted provided that the following conditions
9 1.1 ryo * are met:
10 1.1 ryo * 1. Redistributions of source code must retain the above copyright
11 1.1 ryo * notice, this list of conditions and the following disclaimer.
12 1.1 ryo * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 ryo * notice, this list of conditions and the following disclaimer in the
14 1.1 ryo * documentation and/or other materials provided with the distribution.
15 1.1 ryo *
16 1.1 ryo * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17 1.1 ryo * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 1.1 ryo * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 1.1 ryo * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 1.1 ryo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 1.1 ryo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 1.1 ryo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 1.1 ryo * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 1.1 ryo * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 1.1 ryo * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 1.1 ryo * POSSIBILITY OF SUCH DAMAGE.
27 1.1 ryo */
28 1.1 ryo
29 1.1 ryo #include <sys/cdefs.h>
30 1.2 christos __RCSID("$NetBSD: t_sigaltstack.c,v 1.2 2020/05/01 21:35:30 christos Exp $");
31 1.1 ryo
32 1.1 ryo #include <signal.h>
33 1.1 ryo #include <stdbool.h>
34 1.1 ryo
35 1.1 ryo #include <atf-c.h>
36 1.1 ryo
37 1.1 ryo #include "h_macros.h"
38 1.1 ryo
39 1.1 ryo static stack_t sigstk;
40 1.1 ryo static bool handler_called;
41 1.1 ryo static bool handler_use_altstack;
42 1.1 ryo
43 1.1 ryo static void
44 1.1 ryo handler(int signo __unused)
45 1.1 ryo {
46 1.2 christos char sp[128];
47 1.1 ryo
48 1.1 ryo handler_called = true;
49 1.1 ryo
50 1.1 ryo /* checking if the stack pointer is within the range of altstack */
51 1.1 ryo if ((char *)sigstk.ss_sp <= sp &&
52 1.1 ryo ((char *)sigstk.ss_sp + sigstk.ss_size) > sp)
53 1.1 ryo handler_use_altstack = true;
54 1.1 ryo else
55 1.1 ryo handler_use_altstack = false;
56 1.1 ryo }
57 1.1 ryo
58 1.1 ryo ATF_TC(sigaltstack_onstack);
59 1.1 ryo ATF_TC_HEAD(sigaltstack_onstack, tc)
60 1.1 ryo {
61 1.1 ryo atf_tc_set_md_var(tc, "descr",
62 1.1 ryo "Checks for using signal stack with SA_ONSTACK");
63 1.1 ryo }
64 1.1 ryo
65 1.1 ryo ATF_TC_BODY(sigaltstack_onstack, tc)
66 1.1 ryo {
67 1.1 ryo struct sigaction sa;
68 1.1 ryo int i;
69 1.1 ryo
70 1.1 ryo /* set a signal handler use alternative stack */
71 1.1 ryo memset(&sigstk, 0, sizeof(sigstk));
72 1.1 ryo sigstk.ss_sp = malloc(SIGSTKSZ);
73 1.1 ryo ATF_REQUIRE(sigstk.ss_sp != NULL);
74 1.1 ryo sigstk.ss_size = SIGSTKSZ;
75 1.1 ryo sigstk.ss_flags = 0;
76 1.1 ryo ATF_REQUIRE(sigaltstack(&sigstk, 0) == 0);
77 1.1 ryo
78 1.1 ryo sigemptyset(&sa.sa_mask);
79 1.1 ryo sa.sa_handler = handler;
80 1.1 ryo sa.sa_flags = SA_ONSTACK;
81 1.1 ryo sigaction(SIGUSR1, &sa, NULL);
82 1.1 ryo
83 1.1 ryo /* test several times */
84 1.1 ryo for (i = 1; i <= 5; i++) {
85 1.1 ryo handler_called = false;
86 1.1 ryo kill(getpid(), SIGUSR1);
87 1.1 ryo
88 1.1 ryo if (!handler_called)
89 1.1 ryo atf_tc_fail("signal handler wasn't called (count=%d)", i);
90 1.1 ryo if (!handler_use_altstack)
91 1.1 ryo atf_tc_fail("alternative stack wasn't used (count=%d)", i);
92 1.1 ryo }
93 1.1 ryo }
94 1.1 ryo
95 1.1 ryo ATF_TP_ADD_TCS(tp)
96 1.1 ryo {
97 1.1 ryo ATF_TP_ADD_TC(tp, sigaltstack_onstack);
98 1.1 ryo
99 1.1 ryo return atf_no_error();
100 1.1 ryo }
101