[Pkg-privacy-commits] [msva-perl] 186/356: ensure that quickly-terminating master subprocesses do not escape our notice

Ximin Luo infinity0 at moszumanska.debian.org
Mon Aug 24 07:41:54 UTC 2015


This is an automated email from the git hooks/post-receive script.

infinity0 pushed a commit to branch debian
in repository msva-perl.

commit 0249c28cc2c1ceb825682252275014a082ce1bd3
Author: Daniel Kahn Gillmor <dkg at fifthhorseman.net>
Date:   Wed Oct 27 00:18:03 2010 -0400

    ensure that quickly-terminating master subprocesses do not escape our notice
---
 Crypt/Monkeysphere/MSVA.pm | 43 +++++++++++++++++++++++++++++++++++++------
 Net/Server/MSVA.pm         |  5 +++++
 2 files changed, 42 insertions(+), 6 deletions(-)

diff --git a/Crypt/Monkeysphere/MSVA.pm b/Crypt/Monkeysphere/MSVA.pm
index bff6088..ee71236 100755
--- a/Crypt/Monkeysphere/MSVA.pm
+++ b/Crypt/Monkeysphere/MSVA.pm
@@ -605,6 +605,34 @@
     return $status, $ret;
   }
 
+  sub pre_loop_hook {
+    my $self = shift;
+    my $server = shift;
+
+    $self->spawn_master_subproc($server);
+    if (exists $self->{child_pid} &&
+        $self->{child_pid} != 0) {
+      my $val;
+      while (defined($val = POSIX::waitpid(-1, POSIX::WNOHANG)) && $val > 0) {
+        msvalog('debug', "waitpid on %d: got %d\n", $self->{child_pid}, $val);
+        if ($val == $self->{child_pid}) {
+          $self->master_subprocess_died($server, $?);
+        }
+      }
+    }
+  }
+
+  sub master_subprocess_died {
+    my $self = shift;
+    my $server = shift;
+    my $subproc_return = shift;
+
+    my $exitstatus = POSIX::WEXITSTATUS($subproc_return);
+    msvalog('verbose', "Subprocess %d terminated; exiting %d.\n", $self->{child_pid}, $exitstatus);
+    $server->set_exit_status($exitstatus);
+    $server->server_close();
+  }
+
   sub child_dies {
     my $self = shift;
     my $pid = shift;
@@ -637,10 +665,7 @@
     } elsif (exists $self->{child_pid} &&
              ($self->{child_pid} == 0 ||
               $self->{child_pid} == $pid)) {
-      my $exitstatus = POSIX::WEXITSTATUS($?);
-      msvalog('verbose', "Subprocess %d terminated; exiting %d.\n", $pid, $exitstatus);
-      $server->set_exit_status($exitstatus);
-      $server->server_close();
+      $self->master_subprocess_died($server, $?);
     }
   }
 
@@ -677,6 +702,12 @@
       $server->server_close();
     }
     $self->port($port);
+    $self->{updatemonitor} = Crypt::Monkeysphere::MSVA::Monitor->new($logger);
+  }
+
+  sub spawn_master_subproc {
+    my $self = shift;
+    my $server = shift;
 
     if ((exists $ENV{MSVA_CHILD_PID}) && ($ENV{MSVA_CHILD_PID} ne '')) {
       # this is most likely a re-exec.
@@ -684,6 +715,8 @@
       $self->{child_pid} = $ENV{MSVA_CHILD_PID} + 0;
     } elsif ($#ARGV >= 0) {
       $self->{child_pid} = 0; # indicate that we are planning to fork.
+      # avoid ignoring SIGCHLD right before we fork.
+      $SIG{CHLD} = 'DEFAULT';
       my $fork = fork();
       if (! defined $fork) {
         msvalog('error', "could not fork\n");
@@ -718,8 +751,6 @@
       # ssh-agent.  maybe avoid backgrounding by setting
       # MSVA_NO_BACKGROUND.
     };
-
-    $self->{updatemonitor} = Crypt::Monkeysphere::MSVA::Monitor->new($logger);
   }
 
   sub extracerts {
diff --git a/Net/Server/MSVA.pm b/Net/Server/MSVA.pm
index 805700b..07e43ee 100644
--- a/Net/Server/MSVA.pm
+++ b/Net/Server/MSVA.pm
@@ -32,6 +32,11 @@
     $msva->post_bind_hook($self, @_);
   }
 
+  sub pre_loop_hook {
+    my $self = shift;
+    $msva->pre_loop_hook($self, @_);
+  }
+
   sub set_exit_status {
     my $self = shift;
     $exit_status = shift;

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-privacy/packages/msva-perl.git



More information about the Pkg-privacy-commits mailing list