From: Ian Jackson Date: Fri, 19 Aug 2022 21:42:14 +0000 (+0100) Subject: prefork-interp: fixes X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-utils.git;a=commitdiff_plain;h=edfd31a7dc7d3bbc403959938bdedc8698b84f22 prefork-interp: fixes Signed-off-by: Ian Jackson --- diff --git a/cprogs/prefork-interp.c b/cprogs/prefork-interp.c index 56e848a..71bcbd6 100644 --- a/cprogs/prefork-interp.c +++ b/cprogs/prefork-interp.c @@ -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"); diff --git a/perl/Prefork.pm b/perl/Prefork.pm index 7d1459d..f740251 100644 --- a/perl/Prefork.pm +++ b/perl/Prefork.pm @@ -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', diff --git a/perl/prefork-interp-test b/perl/prefork-interp-test index 226a042..b1ce858 100755 --- a/perl/prefork-interp-test +++ b/perl/prefork-interp-test @@ -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 $!;