]> granicus.if.org Git - procps-ng/commitdiff
top: prevent buffer overflow potential in all routines
authorJim Warner <james.warner@comcast.net>
Sat, 2 Jun 2018 05:00:00 +0000 (00:00 -0500)
committerCraig Small <csmall@enc.com.au>
Sat, 9 Jun 2018 11:35:20 +0000 (21:35 +1000)
Whereas an original patch (referenced below) addressed
some symptoms related to manually edited config files,
this solution deals with root causes. And it goes much
beyond any single top field by protecting all of top's
fields. Henceforth, a duplicated field is not allowed.

Reference(s):
. original qualys patch
0114-top-Prevent-buffer-overflow-in-calibrate_fields.patch

Signed-off-by: Jim Warner <james.warner@comcast.net>
top/top.c

index d05fb34e12954a86a6e61e9a83b25a4cf732bbac..648a456795fbd0ea318b6800abcde21c47f7124f 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -3246,7 +3246,7 @@ static const char *config_file (FILE *fp, const char *name, float *delay) {
    *delay = (float)tmp_whole + (float)tmp_fract / 1000;
 
    for (i = 0 ; i < GROUPSMAX; i++) {
-      int x;
+      int n, x;
       WIN_t *w = &Winstk[i];
       p = fmtmk(N_fmt(RC_bad_entry_fmt), i+1, name);
 
@@ -3258,6 +3258,11 @@ static const char *config_file (FILE *fp, const char *name, float *delay) {
  too bad fscanf is not as flexible with his format string as snprintf
 error Hey, fix the above fscanf 'PFLAGSSIZ' dependency !
 #endif
+      // ensure there's been no manual alteration of fieldscur
+      for (n = 0 ; n < EU_MAXPFLGS; n++) {
+         if (strchr(w->rc.fieldscur, w->rc.fieldscur[n]) != strrchr(w->rc.fieldscur, w->rc.fieldscur[n]))
+            return p;
+      }
       // be tolerant of missing release 3.3.10 graph modes additions
       if (3 > fscanf(fp, "\twinflags=%d, sortindx=%d, maxtasks=%d, graph_cpus=%d, graph_mems=%d\n"
          , &w->rc.winflags, &w->rc.sortindx, &w->rc.maxtasks, &w->rc.graph_cpus, &w->rc.graph_mems))