Skip to content

Commit b43915b

Browse files
committed
runtests: handle interrupted reads from IPC pipes
These can be interrupted by signals, especially SIGINT to shut down, and must be restarted so the IPC call arrives correctly. If the read just returns an error instead, the IPC calling state will go out of sync and a proper shutdown won't happen. Ref: curl#10818
1 parent 0cab135 commit b43915b

File tree

1 file changed

+14
-8
lines changed

1 file changed

+14
-8
lines changed

tests/runner.pm

+14-8
Original file line numberDiff line numberDiff line change
@@ -1203,14 +1203,17 @@ sub controlleripccall {
12031203
# Called by controller
12041204
sub runnerar {
12051205
my ($runnerid) = @_;
1206+
my $err;
12061207
my $datalen;
1207-
if (sysread($controllerr{$runnerid}, $datalen, 4) <= 0) {
1208-
die "error in runnerar\n";
1208+
while(! defined ($err = sysread($controllerr{$runnerid}, $datalen, 4)) || $err <= 0) {
1209+
$!{EINTR} || die "error in runnerar: $!\n";
1210+
# system call was interrupted, probably by ^C; restart it so we stay in sync
12091211
}
12101212
my $len=unpack("L", $datalen);
12111213
my $buf;
1212-
if (sysread($controllerr{$runnerid}, $buf, $len) <= 0) {
1213-
die "error in runnerar\n";
1214+
while(! defined ($err = sysread($controllerr{$runnerid}, $buf, $len)) || $err <= 0) {
1215+
$!{EINTR} || die "error in runnerar: $!\n";
1216+
# system call was interrupted, probably by ^C; restart it so we stay in sync
12141217
}
12151218

12161219
# Decode response values
@@ -1259,14 +1262,17 @@ sub runnerar_ready {
12591262
# The IPC is read from the $runnerr pipe and the response is
12601263
# written to the $runnerw pipe
12611264
sub ipcrecv {
1265+
my $err;
12621266
my $datalen;
1263-
if (sysread($runnerr, $datalen, 4) <= 0) {
1264-
die "error in ipcrecv\n";
1267+
while(! defined ($err = sysread($runnerr, $datalen, 4)) || $err <= 0) {
1268+
$!{EINTR} || die "error in ipcrecv: $!\n";
1269+
# system call was interrupted, probably by ^C; restart it so we stay in sync
12651270
}
12661271
my $len=unpack("L", $datalen);
12671272
my $buf;
1268-
if (sysread($runnerr, $buf, $len) <= 0) {
1269-
die "error in ipcrecv\n";
1273+
while(! defined ($err = sysread($runnerr, $buf, $len)) || $err <= 0) {
1274+
$!{EINTR} || die "error in ipcrecv: $!\n";
1275+
# system call was interrupted, probably by ^C; restart it so we stay in sync
12701276
}
12711277

12721278
# Decode the function name and arguments

0 commit comments

Comments
 (0)