]> Sergey Matveev's repositories - public-inbox.git/commitdiff
ipc: localize fields assignment
authorEric Wong <e@80x24.org>
Thu, 4 Feb 2021 09:59:22 +0000 (00:59 -0900)
committerEric Wong <e@80x24.org>
Fri, 5 Feb 2021 00:16:27 +0000 (00:16 +0000)
We don't want circular references giving surprising behavior
during worker exit.

lib/PublicInbox/IPC.pm

index 3873649b6bb5abcaad05309285eea05cc87c8f32..078aaa2c47e1adc3d0984e8eeed4e02a00557b12 100644 (file)
@@ -338,7 +338,6 @@ sub _wq_worker_start ($$$) {
                srand($seed);
                eval { PublicInbox::DS->Reset };
                delete @$self{qw(-wq_s1 -wq_workers -wq_ppid)};
                srand($seed);
                eval { PublicInbox::DS->Reset };
                delete @$self{qw(-wq_s1 -wq_workers -wq_ppid)};
-               @$self{keys %$fields} = values(%$fields) if $fields;
                $SIG{$_} = 'IGNORE' for (qw(PIPE));
                $SIG{$_} = 'DEFAULT' for (qw(TTOU TTIN TERM QUIT INT CHLD));
                local $0 = $self->{-wq_ident};
                $SIG{$_} = 'IGNORE' for (qw(PIPE));
                $SIG{$_} = 'DEFAULT' for (qw(TTOU TTIN TERM QUIT INT CHLD));
                local $0 = $self->{-wq_ident};
@@ -346,6 +345,8 @@ sub _wq_worker_start ($$$) {
                # ensure we properly exit even if warn() dies:
                my $end = PublicInbox::OnDestroy->new($$, sub { exit(!!$@) });
                eval {
                # ensure we properly exit even if warn() dies:
                my $end = PublicInbox::OnDestroy->new($$, sub { exit(!!$@) });
                eval {
+                       $fields //= {};
+                       local @$self{keys %$fields} = values(%$fields);
                        my $on_destroy = $self->ipc_atfork_child;
                        local %SIG = %SIG;
                        wq_worker_loop($self);
                        my $on_destroy = $self->ipc_atfork_child;
                        local %SIG = %SIG;
                        wq_worker_loop($self);