/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); |