]> granicus.if.org Git - procps-ng/commitdiff
top: harden management of 'Hide_pid' array allocations
authorJim Warner <james.warner@comcast.net>
Thu, 1 Nov 2018 05:00:00 +0000 (00:00 -0500)
committerCraig Small <csmall@enc.com.au>
Wed, 2 Jan 2019 21:06:48 +0000 (08:06 +1100)
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 <james.warner@comcast.net>
top/top.c

index 2cff6b914d0dc35ed7181e1bf79c0e4ae4ebac26..efa8d12cf1ca9f9d7bab57343554c35028a1a7d6 100644 (file)
--- 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;