From: Thomas Lamprecht Date: Wed, 6 Sep 2017 11:29:04 +0000 (+0200) Subject: AbstractMigrate: do not overwrite global signal handlers X-Git-Url: https://git.proxmox.com/?p=pve-guest-common.git;a=commitdiff_plain;h=ee966a3f7a089a4ed4a0e5e7950e78ecbf001046 AbstractMigrate: do not overwrite global signal handlers 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. Signed-off-by: Thomas Lamprecht --- diff --git a/PVE/AbstractMigrate.pm b/PVE/AbstractMigrate.pm index 1efd502..5fa17ba 100644 --- a/PVE/AbstractMigrate.pm +++ b/PVE/AbstractMigrate.pm @@ -89,13 +89,13 @@ my $eval_int = sub { my ($self, $func, @param) = @_; eval { - local $SIG{INT} = $SIG{TERM} = $SIG{QUIT} = $SIG{HUP} = sub { - $self->{delayed_interrupt} = 0; - die "interrupted by signal\n"; - }; - local $SIG{PIPE} = sub { - $self->{delayed_interrupt} = 0; - die "interrupted by signal\n"; + local $SIG{INT} = + local $SIG{TERM} = + local $SIG{QUIT} = + local $SIG{HUP} = + local $SIG{PIPE} = sub { + $self->{delayed_interrupt} = 0; + die "interrupted by signal\n"; }; my $di = $self->{delayed_interrupt}; @@ -147,9 +147,13 @@ sub migrate { my $starttime = time(); - local $SIG{INT} = $SIG{TERM} = $SIG{QUIT} = $SIG{HUP} = $SIG{PIPE} = sub { - $self->log('err', "received interrupt - delayed"); - $self->{delayed_interrupt} = 1; + local $SIG{INT} = + local $SIG{TERM} = + local $SIG{QUIT} = + local $SIG{HUP} = + local $SIG{PIPE} = sub { + $self->log('err', "received interrupt - delayed"); + $self->{delayed_interrupt} = 1; }; # lock container during migration