chiark / gitweb /
prefork-interp: fixes
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 19 Aug 2022 21:42:14 +0000 (22:42 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 21 Aug 2022 20:21:10 +0000 (21:21 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
cprogs/prefork-interp.c
perl/Prefork.pm
perl/prefork-interp-test

index 56e848ad1adcceb8d9f64303d6abd43287a30821..71bcbd651f6b2c00824ab8d8cb84a28d88cfc47d 100644 (file)
@@ -271,13 +271,14 @@ static void send_request(void) {
   size_t len = 0;
   prepare_message(&len, 0);
 
-  char *m = xmalloc(len + 4);
+  size_t tlen = len + 4;
+  char *m = xmalloc(tlen);
   char *p = m;
   prepare_length(0, &p, len);
   prepare_message(0, &p);
-  assert(p == m + len + 4);
+  assert(p == m + tlen);
 
-  ssize_t sr = fwrite(p, len, 1, call_sock);
+  ssize_t sr = fwrite(m, tlen, 1, call_sock);
   if (sr != 1) diee("write request (buffer)");
 
   if (fflush(call_sock)) diee("write request");
index 7d1459d4bdb8007857989f21a84874cc6241c12d..f740251bee008a08e9cc2853f371e00c44fe982a 100644 (file)
@@ -109,12 +109,12 @@ sub protocol_exchange () {
   $r = read(CALL, $len, 4) // protocol_read_fail("message length");
   $r == 4 or _exit(0);
 
-  $len = unpack "L", $len;
+  $len = unpack "N", $len;
   my $data;
   $r = read(CALL, $data, $len) // protocol_read_fail("message data ($len)");
   $r == $len or _exit(0);
 
-  @ARGV = split /\0/, $data;
+  @ARGV = split /\0/, $data, -1;
   @ARGV >= 2 or die("message data has too few strings (".(scalar @ARGV).")");
   length(pop(@ARGV)) and die("message data missing trailing nul");
   %ENV = ();
@@ -146,7 +146,7 @@ sub initialisation_complete {
   }
   open LISTEN, "+>&=$env_fds[0]" or croak "listen fd: $!";
   open CALL,   "+>&=$env_fds[1]" or croak "call fd: $!";
-  open WATCHE,  "<&=$env_fds[3]" or croak "watch stderr fd: $!";
+  open WATCHE, ">+&=$env_fds[3]" or croak "watch stderr fd: $!";
 
   if (!$opts{no_openlog}) {
     openlog("prefork-interp $0", 'ndelay,nofatal,pid',
index 226a042ce59b1b20abdf1110243a76cd986b71c0..b1ce858fb72d16b4dda35cf634fface06a443866 100755 (executable)
@@ -8,7 +8,7 @@ use Proc::Prefork;
 sub prwhen ($) {
   my ($when) = @_;
   my @env = sort keys %ENV;
-  print STDERR "$when - STDERR - @ARGV - $ENV{PREFORK_INTERP} - @env"
+  print STDERR "$when - STDERR - @ARGV - $ENV{PREFORK_INTERP} - @env\n"
     and flush STDERR or die $!;
   print STDOUT "$when - STDOUT\n"
     and flush STDOUT or die $!;