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, CWRU    c...@case.edu    http://cnswww.cns.cwru.edu/~chet/
*** ../bash-4.4-patched/jobs.c	2016-11-11 13:42:55.000000000 -0500
--- jobs.c	2017-02-22 15:16:28.000000000 -0500
***************
*** 813,818 ****
    struct pidstat *ps;
  
!   bucket = pshash_getbucket (pid);
!   psi = bgp_getindex ();
    ps = &bgpids.storage[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 = &bgpids.storage[psi];
  
***************
*** 842,845 ****
--- 839,843 ----
  {
    struct pidstat *ps;
+   ps_index_t *bucket;
  
    ps = &bgpids.storage[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;

Reply via email to