]> granicus.if.org Git - procps-ng/commitdiff
top: sanitized some potentially corrupt 'Inspect' data
authorJim Warner <james.warner@comcast.net>
Sun, 3 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)
This guards against rcfile 'Inspect' entries which may
include non-printable characters. While this shouldn't
occur, we have no real control over those crazy users.

[ and, while such data can't be used maliciously, it ]
[ does adversely impact such a user's screen display ]

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

index 91493bc1766e3ef34731e5c398802f7c510b133b..a83665ece4a7e95ed12cf7b9100e177c539b19ad 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -3343,6 +3343,7 @@ static const char *config_file (FILE *fp, const char *name, float *delay) {
    for (i = 0, Inspect.raw = alloc_s("\n");;) {
     #define iT(element) Inspect.tab[i].element
       size_t lraw = strlen(Inspect.raw) +1;
+      int n, x;
       char *s;
 
       if (i < 0 || (size_t)i >= INT_MAX / sizeof(struct I_ent)) break;
@@ -3356,6 +3357,14 @@ static const char *config_file (FILE *fp, const char *name, float *delay) {
       if (fbuf[0] == '#' || fbuf[0] == '\n') continue;
       Inspect.tab = alloc_r(Inspect.tab, sizeof(struct I_ent) * (i + 1));
 
+      // part of this is used in a show_special() call, so let's sanitize it
+      for (n = 0, x = strlen(fbuf); n < x; n++) {
+         if ((fbuf[n] != '\t' && fbuf[n] != '\n')
+          && (fbuf[n] < ' ')) {
+            fbuf[n] = '.';
+            Rc_questions = 1;
+         }
+      }
       if (!(s = strtok(fbuf, "\t\n"))) { Rc_questions = 1; continue; }
       iT(type) = alloc_s(s);
       if (!(s = strtok(NULL, "\t\n"))) { Rc_questions = 1; continue; }