summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew J. Schorr <aschorr@telemetry-investments.com>2015-01-05 12:37:43 -0500
committerAndrew J. Schorr <aschorr@telemetry-investments.com>2015-01-05 12:37:43 -0500
commit0d867aa42ea8c3487678dcceea484c10c88914cb (patch)
treeaa4e0d5dbc795b253d3bfa280995fa9ec8a27009
parenta29f6a213fb18c199a4b1358327dc6d21f59eb64 (diff)
downloadgawk-0d867aa42ea8c3487678dcceea484c10c88914cb.tar.gz
Fix bug in io.c:wait_any where we may not have waited for the requested child process exit status.
-rw-r--r--ChangeLog7
-rw-r--r--io.c7
2 files changed, 13 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index eb7555f2..f0c3dc4e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2015-01-05 Andrew J. Schorr <aschorr@telemetry-investments.com>
+
+ * io.c (wait_any): If the `interesting' argument is non-zero, then we
+ must not return until that child process has exited, since the caller
+ gawk_pclose depends on our returning its exit status. So in that case,
+ do not pass WNOHANG to waitpid.
+
2015-01-04 Andrew J. Schorr <aschorr@telemetry-investments.com>
* gawkapi.h: Fix another comment typo.
diff --git a/io.c b/io.c
index 6e6d1a1a..f849f839 100644
--- a/io.c
+++ b/io.c
@@ -2250,7 +2250,12 @@ wait_any(int interesting) /* pid of interest, if any */
#endif
for (;;) {
# if defined(HAVE_WAITPID) && defined(WNOHANG)
- if ((pid = waitpid(-1, & status, WNOHANG)) == 0)
+ /*
+ * N.B. If the caller wants status for a specific child process
+ * (i.e. interesting is non-zero), then we must hang until we
+ * get exit status for that child.
+ */
+ if ((pid = waitpid(-1, & status, (interesting ? 0 : WNOHANG))) == 0)
/* No children have exited */
break;
# elif defined(HAVE_SYS_WAIT_H) /* POSIX compatible sys/wait.h */