run_fork_with_timeout: do not overwrite global signal handlers
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 6 Sep 2017 11:29:03 +0000 (13:29 +0200)
committerWolfgang Bumiller <w.bumiller@proxmox.com>
Thu, 7 Sep 2017 08:27:29 +0000 (10:27 +0200)
perls 'local' must be either used in front of each $SIG{...}
assignments or they must be put in a list, else it affects only the
first variable and the rest are *not* in local context.

This may cause weird behaviour where daemons seemingly do not get
terminating signals delivered correctly and thus may not shutdown
gracefully anymore.

As we only send SIGINT to processes if a manual stop action gets
triggered just catch this one here.

As this is a general method which allows to pass an arbitrary code
payload we cannot sanely handle all signals here, so remove trapping
all other besides SIGINT, if those need to be trapped that should be
done by the caller on a case by case basis.

Fixes: #1495

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
src/PVE/Tools.pm

index 9818f63..9ddcfda 100644 (file)
@@ -910,11 +910,9 @@ sub run_fork_with_timeout {
     # disable pending alarms, save their remaining time
     my $prev_alarm = alarm 0;
 
-    # trap before forking to avoid leaving a zombie if the parent get killed
+    # avoid leaving a zombie if the parent gets interrupted
     my $sig_received;
-    local $SIG{INT} = $SIG{TERM} = $SIG{QUIT} = $SIG{HUP} = $SIG{PIPE} = sub {
-       $sig_received++;
-    };
+    local $SIG{INT} = sub { $sig_received++; };
 
     my $child = fork();
     if (!defined($child)) {