Coverage Report

Created: 2026-07-30 06:11

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/systemd/src/basic/signal-util.h
Line
Count
Source
1
/* SPDX-License-Identifier: LGPL-2.1-or-later */
2
#pragma once
3
4
#include <signal.h>     /* IWYU pragma: export */
5
6
#include "forward.h"
7
8
int reset_all_signal_handlers(void);
9
int reset_signal_mask(void);
10
11
int sigaction_many_internal(const struct sigaction *sa, ...);
12
13
#define ignore_signals(...)                                             \
14
0
        sigaction_many_internal(                                        \
15
0
                        &sigaction_ignore,                              \
16
0
                        __VA_ARGS__,                                    \
17
0
                        -1)
18
19
#define default_signals(...)                                            \
20
0
        sigaction_many_internal(                                        \
21
0
                        &sigaction_default,                             \
22
0
                        __VA_ARGS__,                                    \
23
0
                        -1)
24
25
#define sigaction_many(sa, ...)                                         \
26
        sigaction_many_internal(sa, __VA_ARGS__, -1)
27
28
int sigset_add_many_internal(sigset_t *ss, ...);
29
0
#define sigset_add_many(...) sigset_add_many_internal(__VA_ARGS__, -1)
30
31
int sigprocmask_many_internal(int how, sigset_t *ret_old_mask, ...);
32
#define sigprocmask_many(...) sigprocmask_many_internal(__VA_ARGS__, -1)
33
34
DECLARE_STRING_TABLE_LOOKUP(signal, int);
35
const char* signal_code_to_string(int signo, int code) _const_;
36
37
void nop_signal_handler(int sig);
38
39
284
static inline void block_signals_reset(sigset_t **ss) {
40
284
        assert(ss);
41
42
284
        if (!*ss)
43
0
                return;
44
45
284
        assert_log(sigprocmask(SIG_SETMASK, *ss, NULL) >= 0);
46
284
}
Unexecuted instantiation: udev-config.c:block_signals_reset
Unexecuted instantiation: udev-error.c:block_signals_reset
Unexecuted instantiation: udev-manager.c:block_signals_reset
Unexecuted instantiation: udev-spawn.c:block_signals_reset
Unexecuted instantiation: udev-watch.c:block_signals_reset
Unexecuted instantiation: fuzz-pe-binary.c:block_signals_reset
Unexecuted instantiation: fuzz-hwdb.c:block_signals_reset
Unexecuted instantiation: fuzz-journald-util.c:block_signals_reset
Unexecuted instantiation: journald-manager.c:block_signals_reset
Unexecuted instantiation: fuzz-dhcp-server.c:block_signals_reset
Unexecuted instantiation: fuzz-dhcp-relay.c:block_signals_reset
Unexecuted instantiation: fuzz-journal-remote.c:block_signals_reset
Unexecuted instantiation: fuzz-dhcp-client.c:block_signals_reset
Unexecuted instantiation: fuzz-udev-rules.c:block_signals_reset
Unexecuted instantiation: ask-password-api.c:block_signals_reset
Unexecuted instantiation: async.c:block_signals_reset
Unexecuted instantiation: bus-unit-util.c:block_signals_reset
Unexecuted instantiation: common-signal.c:block_signals_reset
Unexecuted instantiation: conf-parser.c:block_signals_reset
Unexecuted instantiation: copy.c:block_signals_reset
Unexecuted instantiation: fork-notify.c:block_signals_reset
Unexecuted instantiation: format-table.c:block_signals_reset
Unexecuted instantiation: pager.c:block_signals_reset
Unexecuted instantiation: parse-argument.c:block_signals_reset
Unexecuted instantiation: snapshot-util.c:block_signals_reset
Unexecuted instantiation: tests.c:block_signals_reset
Unexecuted instantiation: nss-util.c:block_signals_reset
Unexecuted instantiation: log.c:block_signals_reset
process-util.c:block_signals_reset
Line
Count
Source
39
284
static inline void block_signals_reset(sigset_t **ss) {
40
284
        assert(ss);
41
42
284
        if (!*ss)
43
0
                return;
44
45
284
        assert_log(sigprocmask(SIG_SETMASK, *ss, NULL) >= 0);
46
284
}
Unexecuted instantiation: sigbus.c:block_signals_reset
Unexecuted instantiation: signal-util.c:block_signals_reset
Unexecuted instantiation: terminal-util.c:block_signals_reset
Unexecuted instantiation: sd-event.c:block_signals_reset
Unexecuted instantiation: sd-json.c:block_signals_reset
Unexecuted instantiation: dbus-kill.c:block_signals_reset
Unexecuted instantiation: dbus-service.c:block_signals_reset
Unexecuted instantiation: dbus-unit.c:block_signals_reset
Unexecuted instantiation: kill.c:block_signals_reset
Unexecuted instantiation: load-fragment.c:block_signals_reset
Unexecuted instantiation: manager.c:block_signals_reset
Unexecuted instantiation: service.c:block_signals_reset
Unexecuted instantiation: unit.c:block_signals_reset
Unexecuted instantiation: varlink-kill.c:block_signals_reset
Unexecuted instantiation: varlink-service.c:block_signals_reset
47
48
#define BLOCK_SIGNALS(...)                                              \
49
0
        sigset_t _saved_sigset;                                         \
50
0
        _cleanup_(block_signals_reset) _unused_ sigset_t *_saved_sigsetp = \
51
0
                assert_log(sigprocmask_many(SIG_BLOCK, &_saved_sigset, __VA_ARGS__) >= 0) ? \
52
0
                &_saved_sigset : NULL;
53
54
0
#define SIGNO_INVALID (-EINVAL)
55
56
3.94k
static inline bool SIGNAL_VALID(int signo) {
57
3.94k
        return signo > 0 && signo < _NSIG;
58
3.94k
}
Unexecuted instantiation: udev-config.c:SIGNAL_VALID
Unexecuted instantiation: udev-error.c:SIGNAL_VALID
Unexecuted instantiation: udev-manager.c:SIGNAL_VALID
Unexecuted instantiation: udev-spawn.c:SIGNAL_VALID
Unexecuted instantiation: udev-watch.c:SIGNAL_VALID
Unexecuted instantiation: fuzz-pe-binary.c:SIGNAL_VALID
Unexecuted instantiation: fuzz-hwdb.c:SIGNAL_VALID
Unexecuted instantiation: fuzz-journald-util.c:SIGNAL_VALID
Unexecuted instantiation: journald-manager.c:SIGNAL_VALID
Unexecuted instantiation: fuzz-dhcp-server.c:SIGNAL_VALID
Unexecuted instantiation: fuzz-dhcp-relay.c:SIGNAL_VALID
Unexecuted instantiation: fuzz-journal-remote.c:SIGNAL_VALID
Unexecuted instantiation: fuzz-dhcp-client.c:SIGNAL_VALID
Unexecuted instantiation: fuzz-udev-rules.c:SIGNAL_VALID
Unexecuted instantiation: ask-password-api.c:SIGNAL_VALID
Unexecuted instantiation: async.c:SIGNAL_VALID
Unexecuted instantiation: bus-unit-util.c:SIGNAL_VALID
Unexecuted instantiation: common-signal.c:SIGNAL_VALID
Unexecuted instantiation: conf-parser.c:SIGNAL_VALID
Unexecuted instantiation: copy.c:SIGNAL_VALID
Unexecuted instantiation: fork-notify.c:SIGNAL_VALID
Unexecuted instantiation: format-table.c:SIGNAL_VALID
Unexecuted instantiation: pager.c:SIGNAL_VALID
Unexecuted instantiation: parse-argument.c:SIGNAL_VALID
Unexecuted instantiation: snapshot-util.c:SIGNAL_VALID
Unexecuted instantiation: tests.c:SIGNAL_VALID
Unexecuted instantiation: nss-util.c:SIGNAL_VALID
Unexecuted instantiation: log.c:SIGNAL_VALID
Unexecuted instantiation: process-util.c:SIGNAL_VALID
Unexecuted instantiation: sigbus.c:SIGNAL_VALID
signal-util.c:SIGNAL_VALID
Line
Count
Source
56
3.94k
static inline bool SIGNAL_VALID(int signo) {
57
3.94k
        return signo > 0 && signo < _NSIG;
58
3.94k
}
Unexecuted instantiation: terminal-util.c:SIGNAL_VALID
Unexecuted instantiation: sd-event.c:SIGNAL_VALID
Unexecuted instantiation: sd-json.c:SIGNAL_VALID
Unexecuted instantiation: dbus-kill.c:SIGNAL_VALID
Unexecuted instantiation: dbus-service.c:SIGNAL_VALID
Unexecuted instantiation: dbus-unit.c:SIGNAL_VALID
Unexecuted instantiation: kill.c:SIGNAL_VALID
Unexecuted instantiation: load-fragment.c:SIGNAL_VALID
Unexecuted instantiation: manager.c:SIGNAL_VALID
Unexecuted instantiation: service.c:SIGNAL_VALID
Unexecuted instantiation: unit.c:SIGNAL_VALID
Unexecuted instantiation: varlink-kill.c:SIGNAL_VALID
Unexecuted instantiation: varlink-service.c:SIGNAL_VALID
59
60
0
static inline const char* signal_to_string_with_check(int n) {
61
0
        if (!SIGNAL_VALID(n))
62
0
                return NULL;
63
64
0
        return signal_to_string(n);
65
0
}
Unexecuted instantiation: udev-config.c:signal_to_string_with_check
Unexecuted instantiation: udev-error.c:signal_to_string_with_check
Unexecuted instantiation: udev-manager.c:signal_to_string_with_check
Unexecuted instantiation: udev-spawn.c:signal_to_string_with_check
Unexecuted instantiation: udev-watch.c:signal_to_string_with_check
Unexecuted instantiation: fuzz-pe-binary.c:signal_to_string_with_check
Unexecuted instantiation: fuzz-hwdb.c:signal_to_string_with_check
Unexecuted instantiation: fuzz-journald-util.c:signal_to_string_with_check
Unexecuted instantiation: journald-manager.c:signal_to_string_with_check
Unexecuted instantiation: fuzz-dhcp-server.c:signal_to_string_with_check
Unexecuted instantiation: fuzz-dhcp-relay.c:signal_to_string_with_check
Unexecuted instantiation: fuzz-journal-remote.c:signal_to_string_with_check
Unexecuted instantiation: fuzz-dhcp-client.c:signal_to_string_with_check
Unexecuted instantiation: fuzz-udev-rules.c:signal_to_string_with_check
Unexecuted instantiation: ask-password-api.c:signal_to_string_with_check
Unexecuted instantiation: async.c:signal_to_string_with_check
Unexecuted instantiation: bus-unit-util.c:signal_to_string_with_check
Unexecuted instantiation: common-signal.c:signal_to_string_with_check
Unexecuted instantiation: conf-parser.c:signal_to_string_with_check
Unexecuted instantiation: copy.c:signal_to_string_with_check
Unexecuted instantiation: fork-notify.c:signal_to_string_with_check
Unexecuted instantiation: format-table.c:signal_to_string_with_check
Unexecuted instantiation: pager.c:signal_to_string_with_check
Unexecuted instantiation: parse-argument.c:signal_to_string_with_check
Unexecuted instantiation: snapshot-util.c:signal_to_string_with_check
Unexecuted instantiation: tests.c:signal_to_string_with_check
Unexecuted instantiation: nss-util.c:signal_to_string_with_check
Unexecuted instantiation: log.c:signal_to_string_with_check
Unexecuted instantiation: process-util.c:signal_to_string_with_check
Unexecuted instantiation: sigbus.c:signal_to_string_with_check
Unexecuted instantiation: signal-util.c:signal_to_string_with_check
Unexecuted instantiation: terminal-util.c:signal_to_string_with_check
Unexecuted instantiation: sd-event.c:signal_to_string_with_check
Unexecuted instantiation: sd-json.c:signal_to_string_with_check
Unexecuted instantiation: dbus-kill.c:signal_to_string_with_check
Unexecuted instantiation: dbus-service.c:signal_to_string_with_check
Unexecuted instantiation: dbus-unit.c:signal_to_string_with_check
Unexecuted instantiation: kill.c:signal_to_string_with_check
Unexecuted instantiation: load-fragment.c:signal_to_string_with_check
Unexecuted instantiation: manager.c:signal_to_string_with_check
Unexecuted instantiation: service.c:signal_to_string_with_check
Unexecuted instantiation: unit.c:signal_to_string_with_check
Unexecuted instantiation: varlink-kill.c:signal_to_string_with_check
Unexecuted instantiation: varlink-service.c:signal_to_string_with_check
66
67
int signal_is_blocked(int sig);
68
69
int autoreaping_enabled(void);
70
71
int pop_pending_signal_internal(int sig, ...);
72
0
#define pop_pending_signal(...) pop_pending_signal_internal(__VA_ARGS__, -1)
73
74
void propagate_signal(int sig, siginfo_t *siginfo);
75
76
extern const struct sigaction sigaction_ignore;
77
extern const struct sigaction sigaction_default;
78
extern const struct sigaction sigaction_nop_nocldstop;
79
80
int parse_signo(const char *s, int *ret);
81
82
0
static inline bool si_code_from_process(int si_code) {
83
        /* Returns true if the .si_code field of siginfo_t or the .ssi_code field of struct signalfd_siginfo
84
         * indicate that the signal originates from a userspace process, and hence the .si_pid/.ssi_pid field
85
         * is valid. This check is not obvious, since on one hand SI_USER/SI_QUEUE are supposed to be the
86
         * values that kill() and sigqueue() set, and that's documented in sigaction(2), but on the other
87
         * hand rt_sigqueueinfo(2) says userspace can actually set any value below zero. Hence check for
88
         * either.
89
         *
90
         * Also quoting POSIX:
91
         *
92
         * "On systems not supporting the XSI option, the si_pid and si_uid members of siginfo_t are only
93
         * required to be valid when si_code is SI_USER or SI_QUEUE. On XSI-conforming systems, they are also
94
         * valid for all si_code values less than or equal to 0; however, it is unspecified whether SI_USER
95
         * and SI_QUEUE have values less than or equal to zero, and therefore XSI applications should check
96
         * whether si_code has the value SI_USER or SI_QUEUE or is less than or equal to 0 to tell whether
97
         * si_pid and si_uid are valid."
98
         *
99
         * From: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html */
100
101
0
        return si_code < 0 || IN_SET(si_code, SI_USER, SI_QUEUE);
102
0
}
Unexecuted instantiation: udev-config.c:si_code_from_process
Unexecuted instantiation: udev-error.c:si_code_from_process
Unexecuted instantiation: udev-manager.c:si_code_from_process
Unexecuted instantiation: udev-spawn.c:si_code_from_process
Unexecuted instantiation: udev-watch.c:si_code_from_process
Unexecuted instantiation: fuzz-pe-binary.c:si_code_from_process
Unexecuted instantiation: fuzz-hwdb.c:si_code_from_process
Unexecuted instantiation: fuzz-journald-util.c:si_code_from_process
Unexecuted instantiation: journald-manager.c:si_code_from_process
Unexecuted instantiation: fuzz-dhcp-server.c:si_code_from_process
Unexecuted instantiation: fuzz-dhcp-relay.c:si_code_from_process
Unexecuted instantiation: fuzz-journal-remote.c:si_code_from_process
Unexecuted instantiation: fuzz-dhcp-client.c:si_code_from_process
Unexecuted instantiation: fuzz-udev-rules.c:si_code_from_process
Unexecuted instantiation: ask-password-api.c:si_code_from_process
Unexecuted instantiation: async.c:si_code_from_process
Unexecuted instantiation: bus-unit-util.c:si_code_from_process
Unexecuted instantiation: common-signal.c:si_code_from_process
Unexecuted instantiation: conf-parser.c:si_code_from_process
Unexecuted instantiation: copy.c:si_code_from_process
Unexecuted instantiation: fork-notify.c:si_code_from_process
Unexecuted instantiation: format-table.c:si_code_from_process
Unexecuted instantiation: pager.c:si_code_from_process
Unexecuted instantiation: parse-argument.c:si_code_from_process
Unexecuted instantiation: snapshot-util.c:si_code_from_process
Unexecuted instantiation: tests.c:si_code_from_process
Unexecuted instantiation: nss-util.c:si_code_from_process
Unexecuted instantiation: log.c:si_code_from_process
Unexecuted instantiation: process-util.c:si_code_from_process
Unexecuted instantiation: sigbus.c:si_code_from_process
Unexecuted instantiation: signal-util.c:si_code_from_process
Unexecuted instantiation: terminal-util.c:si_code_from_process
Unexecuted instantiation: sd-event.c:si_code_from_process
Unexecuted instantiation: sd-json.c:si_code_from_process
Unexecuted instantiation: dbus-kill.c:si_code_from_process
Unexecuted instantiation: dbus-service.c:si_code_from_process
Unexecuted instantiation: dbus-unit.c:si_code_from_process
Unexecuted instantiation: kill.c:si_code_from_process
Unexecuted instantiation: load-fragment.c:si_code_from_process
Unexecuted instantiation: manager.c:si_code_from_process
Unexecuted instantiation: service.c:si_code_from_process
Unexecuted instantiation: unit.c:si_code_from_process
Unexecuted instantiation: varlink-kill.c:si_code_from_process
Unexecuted instantiation: varlink-service.c:si_code_from_process
103
104
void sigterm_process_group_handler(int signal, siginfo_t *info, void *ucontext);