*** ../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;