handle race condition with rapid subprocess death; also ensure termination of subproc...
authorDaniel Kahn Gillmor <dkg@fifthhorseman.net>
Fri, 12 Mar 2010 00:23:36 +0000 (19:23 -0500)
committerDaniel Kahn Gillmor <dkg@fifthhorseman.net>
Fri, 12 Mar 2010 00:23:36 +0000 (19:23 -0500)
msva-perl

index ad494f45565491f027ef3a2ae7563c7e473ea836..2a8b36dff9ef06a1439efc5c8f53105c97fb3722 100755 (executable)
--- a/msva-perl
+++ b/msva-perl
@@ -380,8 +380,11 @@ use strict;
     my $pid = shift;
     my $server = shift;
 
+    msvalog('debug', "Subprocess %d terminated.\n", $pid);
+
     if (exists $self->{child_pid} &&
-        $self->{child_pid} == $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);
@@ -403,14 +406,16 @@ use strict;
 
     my $argcount = @ARGV;
     if ($argcount) {
+      $self->{child_pid} = 0; # indicate that we are planning to fork.
       my $fork = fork();
       if (! defined $fork) {
         msvalog('error', "could not fork\n");
       } else {
         if ($fork) {
+          msvalog('debug', "Child process has PID %d\n", $fork);
           $self->{child_pid} = $fork;
         } else {
-          msvalog('verbose', "Executing: \n");
+          msvalog('verbose', "PID %d executing: \n", $$);
           for my $arg (@ARGV) {
             msvalog('verbose', " %s\n", $arg);
           }
@@ -420,7 +425,7 @@ use strict;
             push @args, untaint($_);
           }
           $ENV{MONKEYSPHERE_VALIDATION_AGENT_SOCKET} = sprintf('http://localhost:%d', $self->port);
-          exec(@args);
+          exec(@args) or die;
         }
       }
     };