signal-util: do not abort when sigprocmask() failed

BLOCK_SIGNALS() is also used in nss modules. If an application is
running with a too strict seccomp loads our nss modules, then the
assertion may be triggered.

Fixes #38582.
This commit is contained in:
Yu Watanabe
2025-08-17 00:14:42 +09:00
parent ea70753479
commit 4ca46971a0
+13 -8
View File
@@ -36,16 +36,21 @@ int signal_from_string(const char *s) _pure_;
void nop_signal_handler(int sig);
static inline void block_signals_reset(sigset_t *ss) {
assert_se(sigprocmask(SIG_SETMASK, ss, NULL) >= 0);
static inline void block_signals_reset(sigset_t **ss) {
assert(ss);
if (!*ss)
return;
assert_log(sigprocmask(SIG_SETMASK, *ss, NULL) >= 0);
}
#define BLOCK_SIGNALS(...) \
_cleanup_(block_signals_reset) _unused_ sigset_t _saved_sigset = ({ \
sigset_t _t; \
assert_se(sigprocmask_many(SIG_BLOCK, &_t, __VA_ARGS__) >= 0); \
_t; \
})
#define BLOCK_SIGNALS(...) \
sigset_t _saved_sigset; \
_cleanup_(block_signals_reset) _unused_ sigset_t *_saved_sigsetp = \
assert_log(sigprocmask_many(SIG_BLOCK, &_saved_sigset, __VA_ARGS__) >= 0) ? \
&_saved_sigset : NULL;
#define SIGNO_INVALID (-EINVAL)
static inline bool SIGNAL_VALID(int signo) {