On 3/20/17 6:29 PM, Eduardo Bustamante wrote:
> This was reported a month ago:
> http://lists.gnu.org/archive/html/bug-bash/2017-02/msg00025.html
The devel git branch on savannah has several fixes for this. If you
don't want to run that on a server, you can just snag the jobs.c file
from the latest snapshot and either try to just drop it in, or see
if the attached patch works.
Chet
--
``The lyf so short, the craft so long to lerne.'' - Chaucer
``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, UTech, CWRUc...@case.eduhttp://cnswww.cns.cwru.edu/~chet/
*** ../bash-4.4-patched/jobs.c 2016-11-11 13:42:55.0 -0500
--- jobs.c 2017-02-22 15:16:28.0 -0500
***
*** 813,818
struct pidstat *ps;
! bucket = pshash_getbucket (pid);
! psi = bgp_getindex ();
ps = [psi];
--- 796,815
struct pidstat *ps;
! /* bucket == existing chain of pids hashing to same value
! psi = where were going to put this pid/status */
!
! bucket = pshash_getbucket (pid); /* index into pidstat_table */
! psi = bgp_getindex (); /* bgpids.head, index into storage */
!
! /* XXX - what if psi == *bucket? */
! if (psi == *bucket)
! {
! #ifdef DEBUG
! internal_warning ("hashed pid %d (pid %d) collides with bgpids.head, skipping", psi, pid);
! #endif
! bgpids.storage[psi].pid = NO_PID; /* make sure */
! psi = bgp_getindex (); /* skip to next one */
! }
!
ps = [psi];
***
*** 842,845
--- 839,843
{
struct pidstat *ps;
+ ps_index_t *bucket;
ps = [psi];
***
*** 847,856
return;
! if (ps->bucket_next != NO_PID)
bgpids.storage[ps->bucket_next].bucket_prev = ps->bucket_prev;
! if (ps->bucket_prev != NO_PID)
bgpids.storage[ps->bucket_prev].bucket_next = ps->bucket_next;
else
! *(pshash_getbucket (ps->pid)) = ps->bucket_next;
}
--- 845,861
return;
! if (ps->bucket_next != NO_PIDSTAT)
bgpids.storage[ps->bucket_next].bucket_prev = ps->bucket_prev;
! if (ps->bucket_prev != NO_PIDSTAT)
bgpids.storage[ps->bucket_prev].bucket_next = ps->bucket_next;
else
! {
! bucket = pshash_getbucket (ps->pid);
! *bucket = ps->bucket_next; /* deleting chain head in hash table */
! }
!
! /* clear out this cell, just in case */
! ps->pid = NO_PID;
! ps->bucket_next = ps->bucket_prev = NO_PIDSTAT;
}
***
*** 859,863
pid_t pid;
{
! ps_index_t psi;
if (bgpids.storage == 0 || bgpids.nalloc == 0 || bgpids.npid == 0)
--- 864,868
pid_t pid;
{
! ps_index_t psi, orig_psi;
if (bgpids.storage == 0 || bgpids.nalloc == 0 || bgpids.npid == 0)
***
*** 865,871
/* Search chain using hash to find bucket in pidstat_table */
! for (psi = *(pshash_getbucket (pid)); psi != NO_PIDSTAT; psi = bgpids.storage[psi].bucket_next)
! if (bgpids.storage[psi].pid == pid)
! break;
if (psi == NO_PIDSTAT)
--- 870,883
/* Search chain using hash to find bucket in pidstat_table */
! for (orig_psi = psi = *(pshash_getbucket (pid)); psi != NO_PIDSTAT; psi = bgpids.storage[psi].bucket_next)
! {
! if (bgpids.storage[psi].pid == pid)
! break;
! if (orig_psi == bgpids.storage[psi].bucket_next) /* catch reported bug */
! {
! internal_warning ("bgp_delete: LOOP: psi (%d) == storage[psi].bucket_next", psi);
! return 0;
! }
! }
if (psi == NO_PIDSTAT)
***
*** 905,909
pid_t pid;
{
! ps_index_t psi;
if (bgpids.storage == 0 || bgpids.nalloc == 0 || bgpids.npid == 0)
--- 917,921
pid_t pid;
{
! ps_index_t psi, orig_psi;
if (bgpids.storage == 0 || bgpids.nalloc == 0 || bgpids.npid == 0)
***
*** 911,917
/* Search chain using hash to find bucket in pidstat_table */
! for (psi = *(pshash_getbucket (pid)); psi != NO_PIDSTAT; psi = bgpids.storage[psi].bucket_next)
! if (bgpids.storage[psi].pid == pid)
! return (bgpids.storage[psi].status);
return -1;
--- 923,936
/* Search chain using hash to find bucket in pidstat_table */
! for (orig_psi = psi = *(pshash_getbucket (pid)); psi != NO_PIDSTAT; psi = bgpids.storage[psi].bucket_next)
! {
! if (bgpids.storage[psi].pid == pid)
! return (bgpids.storage[psi].status);
! if (orig_psi == bgpids.storage[psi].bucket_next) /* catch reported bug */
! {
! internal_warning ("bgp_search: LOOP: psi (%d) == storage[psi].bucket_next", psi);
! return -1;
! }
! }
return -1;