@@ -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+
384396static 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
403410static 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