[PATCH] Avoid busy loop in wordexp when substituted command closed its stdout

Andreas Schwab schwab@suse.de
Mon Jan 21 10:05:00 GMT 2013


Once we receive EOF from the command no further output is expected, so
just block until the process dies instead of busy looping.

Andreas.

	[BZ #15020]
	* posix/wordexp.c (exec_comm): Avoid busy loop when command has
	closed its stdout.

diff --git a/NEWS b/NEWS
index cf6191b..abbbbae 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 bf49baa..96ce8a4 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)
-- 
1.8.1

-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."



More information about the Libc-alpha mailing list