Parcourir la source

On brain-dead Linux platforms somewhere between glibc 2.3.3 (20040405) and glibc 2.3.3 (20040917) (e.g. between SuSE 9.1 and SuSE 9.2 or between Gentoo 1.4.x and 1.5.x) the system headers provide the waitpid(2) option WCONTINUED although the underlying Linux kernels 2.4 and 2.6 still do not support this option and return EINVAL on waitpid(2) using WCONTINUED. As a side-effect the GNU Bash goes into an endless loop with waitpid(3) calls after the first executed command terminated. The following patch is derived from Gentoo Portage and workarounds this problems by gracefully and efficiently degrading the options on waitpid(2) calls. Well, it's just another great example of how good Linux provides standardized APIs -- actually they are nothing more than Potemkin villages. Ggrrrrr!

Ralf S. Engelschall il y a 21 ans
Parent
commit
a075e0c931
2 fichiers modifiés avec 51 ajouts et 1 suppressions
  1. 50 0
      bash/bash.patch
  2. 1 1
      bash/bash.spec

+ 50 - 0
bash/bash.patch

@@ -175,3 +175,53 @@ Index: lib/sh/strftime.c
  			off = -zone.tz_minuteswest;
  #endif /* !HAVE_TZNAME */
 
+-----------------------------------------------------------------------------
+
+On brain-dead Linux platforms somewhere between glibc 2.3.3 (20040405)
+and glibc 2.3.3 (20040917) (e.g. between SuSE 9.1 and SuSE 9.2 or
+between Gentoo 1.4.x and 1.5.x) the system headers provide the
+waitpid(2) option WCONTINUED although the underlying Linux kernels 2.4
+and 2.6 still do not support this option and return EINVAL on waitpid(2)
+using WCONTINUED.
+
+As a side-effect the GNU Bash goes into an endless loop with waitpid(3)
+calls after the first executed command terminated. The following
+patch is derived from Gentoo Portage and workarounds this problems by
+gracefully and efficiently degrading the options on waitpid(2) calls.
+
+Well, it's just another great example of how good Linux provides
+standardized APIs -- actually they are nothing more than Potemkin
+villages. Ggrrrrr!
+
+Index: jobs.c
+--- jobs.c.orig	2004-11-04 10:29:23 +0100
++++ jobs.c	2004-11-04 10:32:47 +0100
+@@ -2476,6 +2476,9 @@
+   PROCESS *child;
+   pid_t pid;
+   int call_set_current, last_stopped_job, job, children_exited, waitpid_flags;
++#ifdef __linux__
++  static int wcontinued_not_supported = 0;
++#endif
+ 
+   call_set_current = children_exited = 0;
+   last_stopped_job = NO_JOB;
+@@ -2489,7 +2492,18 @@
+ 			: 0;
+       if (sigchld || block == 0)
+ 	waitpid_flags |= WNOHANG;
++#ifdef __linux__
++      retry:
++      if (wcontinued_not_supported)
++          waitpid_flags &= ~WCONTINUED;
++#endif
+       pid = WAITPID (-1, &status, waitpid_flags);
++#ifdef __linux__
++      if (pid == -1 && errno == EINVAL) {
++          wcontinued_not_supported = 1;
++          goto retry;
++      }
++#endif
+ 
+       /* The check for WNOHANG is to make sure we decrement sigchld only
+ 	 if it was non-zero before we called waitpid. */

+ 1 - 1
bash/bash.spec

@@ -40,7 +40,7 @@ Class:        CORE
 Group:        Shell
 License:      GPL
 Version:      %{V_base_real}.%{V_plvl_raw}
-Release:      20041101
+Release:      20041104
 
 #   list of sources
 Source0:      ftp://ftp.cwru.edu/pub/bash/bash-%{V_base_real}.tar.gz