From ab087e0aa4bd9f12a73ca0b248f02d8a22d49e46 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Sat, 19 Jan 2013 17:18:47 +0100 Subject: Avoid busy loop in wordexp when substituted command closed its stdout --- ChangeLog | 6 ++++++ NEWS | 2 +- posix/wordexp.c | 14 ++++++++++++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3bf3949586..9b5346350c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2013-01-21 Andreas Schwab + + [BZ #15020] + * posix/wordexp.c (exec_comm): Avoid busy loop when command has + closed its stdout. + 2013-01-20 Andreas Schwab * sysdeps/powerpc/powerpc32/power4/fpu/mpa.c: Don't include diff --git a/NEWS b/NEWS index cf6191bb33..abbbbaeec5 100644 --- a/NEWS +++ b/NEWS @@ -10,7 +10,7 @@ Version 2.18 * The following bugs are resolved with this release: 13951, 14200, 14317, 14327, 14496, 14964, 14981, 14982, 14985, 14994, - 14996, 15003, 15023. + 14996, 15003, 15020, 15023. Version 2.17 diff --git a/posix/wordexp.c b/posix/wordexp.c index bf49baab9c..96ce8a4b17 100644 --- a/posix/wordexp.c +++ b/posix/wordexp.c @@ -953,7 +953,12 @@ exec_comm (char *comm, char **word, size_t *word_length, size_t *max_length, if ((buflen = TEMP_FAILURE_RETRY (__read (fildes[0], buffer, bufsize))) < 1) { - if (TEMP_FAILURE_RETRY (__waitpid (pid, &status, WNOHANG)) == 0) + /* If read returned 0 then the process has closed its + stdout. Don't use WNOHANG in that case to avoid busy + looping until the process eventually exits. */ + if (TEMP_FAILURE_RETRY (__waitpid (pid, &status, + buflen == 0 ? 0 : WNOHANG)) + == 0) continue; if ((buflen = TEMP_FAILURE_RETRY (__read (fildes[0], buffer, bufsize))) < 1) @@ -983,7 +988,12 @@ exec_comm (char *comm, char **word, size_t *word_length, size_t *max_length, if ((buflen = TEMP_FAILURE_RETRY (__read (fildes[0], buffer, bufsize))) < 1) { - if (TEMP_FAILURE_RETRY (__waitpid (pid, &status, WNOHANG)) == 0) + /* If read returned 0 then the process has closed its + stdout. Don't use WNOHANG in that case to avoid busy + looping until the process eventually exits. */ + if (TEMP_FAILURE_RETRY (__waitpid (pid, &status, + buflen == 0 ? 0 : WNOHANG)) + == 0) continue; if ((buflen = TEMP_FAILURE_RETRY (__read (fildes[0], buffer, bufsize))) < 1) -- cgit 1.4.1