Skip to content

Commit 388f16c

Browse files
cahirwpzfranciscozdo
authored andcommitted
Extract changes from #1320 (#1406)
1 parent 963e9fe commit 388f16c

File tree

12 files changed

+111
-31
lines changed

12 files changed

+111
-31
lines changed

bin/utest/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ LIBWRAP = \
6060
xsetresgid.c \
6161
xsetresuid.c \
6262
xsignal.c \
63+
xsigaction.c \
64+
xsigprocmask.c \
6365
xstat.c \
6466
xsymlink.c \
6567
xunlink.c \

bin/utest/libwrap/xsigaction.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#include "utest.h"
2+
#include <signal.h>
3+
4+
void xsigaction(int sig, const struct sigaction *restrict act,
5+
struct sigaction *restrict oact) {
6+
int result = sigaction(sig, act, oact);
7+
8+
if (result < 0)
9+
die("sigaction: %s", strerror(errno));
10+
}

bin/utest/libwrap/xsigprocmask.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#include "utest.h"
2+
#include <signal.h>
3+
4+
void xsigprocmask(int how, const sigset_t *restrict set,
5+
sigset_t *restrict oset) {
6+
int result = sigprocmask(how, set, oset);
7+
8+
if (result < 0)
9+
die("sigprocmask: %s", strerror(errno));
10+
}

bin/utest/signal.c

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <stdio.h>
77
#include <sys/wait.h>
88
#include <unistd.h>
9+
#include <errno.h>
910

1011
/* ======= signal_basic ======= */
1112
static volatile int sigusr1_handled = 0;
@@ -149,7 +150,7 @@ TEST_ADD(signal_cont_masked, 0) {
149150
if (pid == 0) {
150151
/* Block SIGCONT. */
151152
sigset_t mask, old;
152-
__sigemptyset(&mask);
153+
sigemptyset(&mask);
153154
sigaddset(&mask, SIGCONT);
154155
assert(sigprocmask(SIG_BLOCK, &mask, &old) == 0);
155156
/* Even though SIGCONT is blocked, it should wake us up, but it
@@ -203,7 +204,7 @@ TEST_ADD(signal_mask, 0) {
203204
do {
204205
sched_yield();
205206
sigpending(&set);
206-
} while (!__sigismember(&set, SIGCONT));
207+
} while (!sigismember(&set, SIGCONT));
207208

208209
assert(!sigcont_handled);
209210

@@ -220,15 +221,15 @@ TEST_ADD(signal_mask, 0) {
220221
/* ======= signal_mask_nonmaskable ======= */
221222
TEST_ADD(signal_mask_nonmaskable, 0) {
222223
sigset_t set, old;
223-
__sigemptyset(&set);
224-
__sigaddset(&set, SIGSTOP);
225-
__sigaddset(&set, SIGKILL);
226-
__sigaddset(&set, SIGUSR1);
224+
sigemptyset(&set);
225+
sigaddset(&set, SIGSTOP);
226+
sigaddset(&set, SIGKILL);
227+
sigaddset(&set, SIGUSR1);
227228
/* The call should succeed, but SIGKILL and SIGSTOP shouldn't be blocked. */
228-
assert(sigprocmask(SIG_BLOCK, &set, &old) == 0);
229-
assert(sigprocmask(SIG_BLOCK, NULL, &set) == 0);
230-
__sigaddset(&old, SIGUSR1);
231-
assert(__sigsetequal(&set, &old));
229+
xsigprocmask(SIG_BLOCK, &set, &old);
230+
xsigprocmask(SIG_BLOCK, NULL, &set);
231+
sigaddset(&old, SIGUSR1);
232+
assert(sigsetequal(&set, &old));
232233
return 0;
233234
}
234235

@@ -238,11 +239,11 @@ TEST_ADD(signal_sigsuspend, 0) {
238239
xsignal(SIGCONT, sigcont_handler);
239240
xsignal(SIGUSR1, sigusr1_handler);
240241
sigset_t set, old;
241-
__sigemptyset(&set);
242-
__sigaddset(&set, SIGCONT);
243-
__sigaddset(&set, SIGUSR1);
244-
assert(sigprocmask(SIG_BLOCK, &set, &old) == 0);
245-
__sigaddset(&old, SIGCONT);
242+
sigemptyset(&set);
243+
sigaddset(&set, SIGCONT);
244+
sigaddset(&set, SIGUSR1);
245+
xsigprocmask(SIG_BLOCK, &set, &old);
246+
sigaddset(&old, SIGCONT);
246247
pid_t cpid = xfork();
247248
if (cpid == 0) {
248249
for (int i = 0; i < 10; i++) {
@@ -255,19 +256,19 @@ TEST_ADD(signal_sigsuspend, 0) {
255256
/* Go to sleep with SIGCONT blocked and SIGUSR1 unblocked. */
256257
debug("Calling sigsuspend()...");
257258
sigset_t current;
258-
sigprocmask(SIG_BLOCK, NULL, &current);
259-
assert(__sigismember(&current, SIGUSR1));
260-
assert(!__sigismember(&old, SIGUSR1));
259+
xsigprocmask(SIG_BLOCK, NULL, &current);
260+
assert(sigismember(&current, SIGUSR1));
261+
assert(!sigismember(&old, SIGUSR1));
261262
sigsuspend(&old);
262263
/* Check if mask is set back after waking up */
263-
sigprocmask(SIG_BLOCK, NULL, &set);
264-
assert(__sigsetequal(&set, &current));
264+
xsigprocmask(SIG_BLOCK, NULL, &set);
265+
assert(sigsetequal(&set, &current));
265266
/* SIGUSR1 should have woken us up, but SIGCONT should still be pending. */
266267
assert(sigusr1_handled);
267268
assert(!sigcont_handled);
268-
__sigemptyset(&set);
269-
__sigaddset(&set, SIGCONT);
270-
assert(sigprocmask(SIG_UNBLOCK, &set, NULL) == 0);
269+
sigemptyset(&set);
270+
sigaddset(&set, SIGCONT);
271+
xsigprocmask(SIG_UNBLOCK, &set, NULL);
271272
assert(sigcont_handled);
272273

273274
wait_child_finished(cpid);
@@ -279,8 +280,8 @@ TEST_ADD(signal_sigsuspend_stop, 0) {
279280
pid_t ppid = getpid();
280281
xsignal(SIGUSR1, sigusr1_handler);
281282
sigset_t set, old;
282-
__sigemptyset(&set);
283-
__sigaddset(&set, SIGUSR1);
283+
sigemptyset(&set);
284+
sigaddset(&set, SIGUSR1);
284285
assert(sigprocmask(SIG_BLOCK, &set, &old) == 0);
285286
pid_t cpid = xfork();
286287
if (cpid == 0) {
@@ -352,8 +353,8 @@ TEST_ADD(signal_handler_mask, 0) {
352353
pid_t ppid = getpid();
353354
struct sigaction sa = {.sa_handler = yield_handler, .sa_flags = 0};
354355
/* Block SIGUSR1 when executing handler for SIGUSR2. */
355-
__sigemptyset(&sa.sa_mask);
356-
__sigaddset(&sa.sa_mask, SIGUSR1);
356+
sigemptyset(&sa.sa_mask);
357+
sigaddset(&sa.sa_mask, SIGUSR1);
357358
assert(sigaction(SIGUSR2, &sa, NULL) == 0);
358359
xsignal(SIGUSR1, sigusr1_handler);
359360
xsignal(SIGCONT, sigcont_handler);

bin/utest/utest.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,11 @@ void wait_child_continued(pid_t pid);
9595

9696
#include <errno.h>
9797
#include <string.h>
98+
#include <sys/sigtypes.h>
9899

99100
typedef void (*sig_t)(int);
100101
struct stat;
102+
struct sigaction;
101103
struct timezone;
102104
struct timeval;
103105

@@ -124,6 +126,10 @@ int xopen(const char *path, int flags, ...);
124126
void xpipe(int pipefd[2]);
125127
void xrmdir(const char *pathname);
126128
sig_t xsignal(int sig, sig_t func);
129+
void xsigaction(int sig, const struct sigaction *restrict act,
130+
struct sigaction *restrict oact);
131+
void xsigprocmask(int how, const sigset_t *restrict set,
132+
sigset_t *restrict oset);
127133
void xsetgroups(int size, gid_t *list);
128134
void xsetresuid(uid_t ruid, uid_t euid, uid_t suid);
129135
void xsetresgid(gid_t rgid, gid_t egid, gid_t sgid);

bin/utest/util.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,14 @@ static void noop_handler(int signo) {
4343
void signal_setup(int signo) {
4444
xsignal(signo, noop_handler);
4545
sigset_t mask;
46-
__sigemptyset(&mask);
46+
sigemptyset(&mask);
4747
sigaddset(&mask, signo);
4848
assert(sigprocmask(SIG_BLOCK, &mask, NULL) == 0);
4949
}
5050

5151
void wait_for_signal(int signo) {
5252
sigset_t mask;
53-
__sigfillset(&mask);
53+
sigfillset(&mask);
5454
sigdelset(&mask, signo);
5555
sigsuspend(&mask);
5656
}

bin/utest/util.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
#include <string.h>
77
#include <sys/mman.h>
88

9+
static inline int sigsetequal(sigset_t *a, sigset_t *b) {
10+
return memcmp(a, b, sizeof(sigset_t)) == 0;
11+
}
12+
913
/* Do the necessary setup needed to wait for the signal.
1014
* Must be called before receiving the signal,
1115
* ideally at the very beginning of the test procedure. */

include/sys/signal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ int do_sigaction(signo_t sig, const sigaction_t *act, sigaction_t *oldact);
203203
int do_sigprocmask(int how, const sigset_t *set, sigset_t *oset);
204204
int do_sigsuspend(proc_t *p, const sigset_t *mask);
205205
int do_sigpending(proc_t *p, sigset_t *set);
206-
int do_sigtimedwait(proc_t *p, sigset_t waitset, ksiginfo_t *kinfo,
206+
int do_sigtimedwait(proc_t *p, sigset_t waitset, ksiginfo_t *ksi,
207207
struct timespec *timeout);
208208

209209
#endif /* !_KERNEL */

include/sys/sigtypes.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ typedef struct {
1515
uint32_t __bits; /* bit 0 is unused */
1616
} sigset_t;
1717

18+
#if defined(_KERNEL) || defined(_LIBC)
19+
1820
/*
1921
* Macro for manipulating signal masks.
2022
*/
@@ -33,6 +35,8 @@ typedef struct {
3335
{ (t)->__bits &= (s)->__bits; }
3436
#define __sigfindset(s) (__builtin_ffs((s)->__bits))
3537

38+
#endif /* !_KERNEL */
39+
3640
typedef struct sigaltstack {
3741
void *ss_sp; /* signal stack base */
3842
size_t ss_size; /* signal stack length */

lib/libc/gen/sigismember.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#include <errno.h>
2+
#include <signal.h>
3+
4+
int sigismember(const sigset_t *set, int signo) {
5+
if (signo <= 0 || signo >= NSIG) {
6+
errno = EINVAL;
7+
return -1;
8+
}
9+
return (__sigismember(set, signo));
10+
}

0 commit comments

Comments
 (0)