From ca9142767c46ee8afcecce396b7309ab07e962e3 Mon Sep 17 00:00:00 2001 From: Jim Warner Date: Thu, 1 Nov 2018 00:00:00 -0500 Subject: [PATCH] top: harden management of 'Hide_pid' array allocations While setting the size of that Hide_pid array to equal total pids high water mark was probably safe, in truth there is no real relationship. At some point one could exceed that HWM if the 'v' toggle was used extensively and at least 1 of those entries remained non-negative. This commit simply divorces Hide_tot from the pids HWM and bases Hide_pid array size on actual run-time need. Signed-off-by: Jim Warner --- top/top.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/top/top.c b/top/top.c index 2cff6b91..efa8d12c 100644 --- a/top/top.c +++ b/top/top.c @@ -4331,7 +4331,6 @@ static void forest_begin (WIN_t *q) { if (hwmsav < PIDSmaxt) { // grow, but never shrink hwmsav = PIDSmaxt; Tree_ppt = alloc_r(Tree_ppt, sizeof(void *) * hwmsav); - Hide_pid = alloc_r(Hide_pid, sizeof(int) * hwmsav); } #ifndef TREE_SCANALL @@ -4986,11 +4985,19 @@ static void keys_task (int ch) { break; } } - if (i == Hide_tot) Hide_pid[Hide_tot++] = pid; - // plenty of room, but if everything's expanded let's reset ... - for (i = 0; i < Hide_tot; i++) - if (Hide_pid[i] > 0) break; - if (i == Hide_tot) Hide_tot = 0; + if (i == Hide_tot) { + static int totsav; + if (Hide_tot >= totsav) { + totsav += 128; + Hide_pid = alloc_r(Hide_pid, sizeof(int) * totsav); + } + Hide_pid[Hide_tot++] = pid; + } else { + // if everything's expanded, let's empty the array ... + for (i = 0; i < Hide_tot; i++) + if (Hide_pid[i] > 0) break; + if (i == Hide_tot) Hide_tot = 0; + } } } break;