#! /bin/sh -e if [ $# -eq 3 -a "$2" = '-d' ]; then pdir="-d $3" elif [ $# -ne 1 ]; then echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" exit 1 fi case "$1" in -patch) patch $pdir -f --no-backup-if-mismatch -p0 < $0;; -unpatch) patch $pdir -f --no-backup-if-mismatch -R -p0 < $0;; *) echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" exit 1 esac exit 0 # DP: bash-3.2 upstream patch bash32-018 BASH PATCH REPORT ================= Bash-Release: 3.2 Patch-ID: bash32-018 Bug-Reported-by: osicka@post.cz Bug-Reference-ID: <228.177-19682-1132061412-1179356692@post.cz> 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_ */