BASH PATCH REPORT
                            =================

Bash-Release: 3.2
Patch-ID: bash32-018

Bug-Reported-by:        [email protected]
Bug-Reference-ID:       <[email protected]>
Bug-Reference-URL:      http://lists.gnu.org/archive/html/bug-bash/2007-05/msg00061.html

Bug-Description:

In certain cases, bash can lose the saved status of a background job, though
it should still be reported by `wait'.  Bash can also loop infinitely after
creating and waiting for 4096 jobs.

Patch:

*** ../bash-20070510/jobs.c     Thu Mar  8 16:05:50 2007
--- jobs.c      Fri May 18 11:40:14 2007
***************
*** 784,792 ****
     {
       old = js.j_firstj++;
       while (js.j_firstj != old)
       {
         if (js.j_firstj >= js.j_jobslots)
           js.j_firstj = 0;
!         if (jobs[js.j_firstj])
           break;
         js.j_firstj++;
--- 784,794 ----
     {
       old = js.j_firstj++;
+       if (old >= js.j_jobslots)
+       old = js.j_jobslots - 1;
       while (js.j_firstj != old)
       {
         if (js.j_firstj >= js.j_jobslots)
           js.j_firstj = 0;
!         if (jobs[js.j_firstj] || js.j_firstj == old)  /* needed if old == 0 */
           break;
         js.j_firstj++;
***************
*** 798,806 ****
     {
       old = js.j_lastj--;
       while (js.j_lastj != old)
       {
         if (js.j_lastj < 0)
           js.j_lastj = js.j_jobslots - 1;
!         if (jobs[js.j_lastj])
           break;
         js.j_lastj--;
--- 800,810 ----
     {
       old = js.j_lastj--;
+       if (old < 0)
+       old = 0;
       while (js.j_lastj != old)
       {
         if (js.j_lastj < 0)
           js.j_lastj = js.j_jobslots - 1;
!         if (jobs[js.j_lastj] || js.j_lastj == old)    /* needed if old == js.j_jobslots */
           break;
         js.j_lastj--;
***************
*** 964,968 ****
   realloc_jobs_list ();

!   return (js.j_lastj);
 }

--- 975,983 ----
   realloc_jobs_list ();

! #ifdef DEBUG
!   itrace("compact_jobs_list: returning %d", (js.j_lastj || jobs[js.j_lastj]) ? js.j_lastj + 1 : 0);
! #endif
!
!   return ((js.j_lastj || jobs[js.j_lastj]) ? js.j_lastj + 1 : 0);
 }

*** ../bash-3.2/patchlevel.h    Thu Apr 13 08:31:04 2006
--- patchlevel.h        Mon Oct 16 14:22:54 2006
***************
*** 26,30 ****
    looks for to find the patch level (for the sccs version string). */

! #define PATCHLEVEL 17

 #endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
    looks for to find the patch level (for the sccs version string). */

! #define PATCHLEVEL 18

 #endif /* _PATCHLEVEL_H_ */