Skip to content

Commit d7628e4

Browse files
committed
Rework logic and naming according to review.
Signed-off-by: Aaruni Kaushik <akaushik@mathematik.uni-kl.de>
1 parent 8b61e8f commit d7628e4

1 file changed

Lines changed: 32 additions & 17 deletions

File tree

bubblewrap.c

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -381,23 +381,30 @@ handle_die_with_parent (void)
381381
die_with_error ("prctl");
382382
}
383383

384+
static int forwarded_signals[] =
385+
{
386+
SIGINT,
387+
SIGTERM,
388+
SIGCONT,
389+
SIGHUP,
390+
SIGQUIT,
391+
SIGUSR1,
392+
SIGUSR2,
393+
SIGWINCH,
394+
};
395+
384396
static void
385-
gate_signals (int action, sigset_t *prevmask)
397+
block_forwarded_signals (sigset_t *prevmask)
386398
{
387399
sigset_t mask;
388-
389-
/* When unblocking, only restore if not previously blocked. */
400+
size_t i;
390401

391402
sigemptyset (&mask);
392403

393-
if (action == SIG_BLOCK || !sigismember (prevmask, SIGINT))
394-
sigaddset (&mask, SIGINT);
395-
396-
if (action == SIG_BLOCK || !sigismember (prevmask, SIGTERM))
397-
sigaddset (&mask, SIGTERM);
398-
399-
if (sigprocmask (action, &mask, prevmask) == -1)
400-
die_with_error ("sigprocmask");
404+
for (i = 0; i < N_ELEMENTS (forwarded_signals); i++)
405+
{
406+
sigaddset (&mask, forwarded_signals[i]);
407+
}
401408
}
402409

403410
static void
@@ -521,6 +528,7 @@ monitor_child (int event_fd, pid_t child_pid, int setup_finished_fd)
521528
int exitc;
522529
pid_t died_pid;
523530
int died_status;
531+
size_t i;
524532

525533
/* Close all extra fds in the monitoring process.
526534
Any passed in fds have been passed on to the child anyway. */
@@ -535,8 +543,11 @@ monitor_child (int event_fd, pid_t child_pid, int setup_finished_fd)
535543

536544
sigemptyset (&mask);
537545
sigaddset (&mask, SIGCHLD);
538-
sigaddset (&mask, SIGINT);
539-
sigaddset (&mask, SIGTERM);
546+
547+
for (i = 0; i < N_ELEMENTS(forwarded_signals); i++)
548+
{
549+
sigaddset(&mask, forwarded_signals[i]);
550+
}
540551

541552
signal_fd = signalfd (-1, &mask, SFD_CLOEXEC | SFD_NONBLOCK);
542553
if (signal_fd == -1)
@@ -2673,7 +2684,8 @@ main (int argc,
26732684
int res UNUSED;
26742685
cleanup_free char *args_data UNUSED = NULL;
26752686
int intermediate_pids_sockets[2] = {-1, -1};
2676-
sigset_t sigmask;
2687+
sigset_t sigmask_before_forwarding;
2688+
sigemptyset (&sigmask_before_forwarding);
26772689

26782690
/* Handle --version early on before we try to acquire/drop
26792691
* any capabilities so it works in a build environment;
@@ -2849,7 +2861,7 @@ main (int argc,
28492861

28502862
/* We block other signals here to avoid leaving an orphan. */
28512863
if (opt_forward_signals)
2852-
gate_signals (SIG_BLOCK, &sigmask);
2864+
block_forwarded_signals (&sigmask_before_forwarding);
28532865

28542866
clone_flags = SIGCHLD | CLONE_NEWNS;
28552867
if (opt_unshare_user)
@@ -3001,9 +3013,12 @@ main (int argc,
30013013
return monitor_child (event_fd, pid, setup_finished_pipe[0]);
30023014
}
30033015

3004-
/* Unblock other signals here to receive signals from the parent. */
3016+
/* Restore the state of sigmask from before the blocking. */
30053017
if (opt_forward_signals)
3006-
gate_signals (SIG_UNBLOCK, &sigmask);
3018+
{
3019+
if (sigprocmask (SIG_SETMASK, &sigmask_before_forwarding, NULL) != 0)
3020+
die_with_error ("sigprocmask");
3021+
}
30073022

30083023
if (opt_pidns_fd > 0)
30093024
{

0 commit comments

Comments
 (0)