]> granicus.if.org Git - procps-ng/commitdiff
top: be more careful with memcpy length specifications
authorJim Warner <james.warner@comcast.net>
Tue, 17 May 2022 05:00:00 +0000 (00:00 -0500)
committerCraig Small <csmall@dropbear.xyz>
Wed, 18 May 2022 11:30:56 +0000 (21:30 +1000)
Using 'mempcpy' was a mistake where plain old 'memcpy'
was appropriate. More importantly, the careless length
specified resulted in a SEGV under some circumstances.

[ namely, it occurred under a multi-threaded top and ]
[ the top program itself as focus + CtrlN 'environ'. ]

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

index 6603f2220fc6ccd4c57849156e5a200495c3a202..87ba96e7e997d3bf94c6a1c7a89874685e9c1382 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -4933,8 +4933,12 @@ static int bot_focus_str (const char *hdr, const char *str) {
    int n, x;
 
    if (str) {
+      // we're a little careless with overhead here (it's a one time cost)
+      memset(Bot_buf, '\0', sizeof(Bot_buf));
+      n = strlen(str);
+      if (n >= sizeof(Bot_buf)) n = sizeof(Bot_buf) - 1;
       if (!*str || !strcmp(str, "-")) strcpy(Bot_buf, "n/a");
-      else memccpy(Bot_buf, str, '\0', sizeof(Bot_buf) - 1);
+      else memccpy(Bot_buf, str, '\0', n);
       Bot_rsvd = 1 + BOT_RSVD + (strlen(Bot_buf) / Screen_cols);
       if (Bot_rsvd > maxRSVD) Bot_rsvd = maxRSVD;
       // caller itself may have used fmtmk, so we'll old school it ...
@@ -4975,8 +4979,11 @@ static int bot_focus_strv (const char *hdr, const char **strv) {
    int i, n, x;
 
    if (strv) {
-      // we won't worry about picking up some trailing garbage ...
-      mempcpy(Bot_buf, strv[0], sizeof(Bot_buf));
+      // we're a little careless with overhead here (it's a one time cost)
+      memset(Bot_buf, '\0', sizeof(Bot_buf));
+      n = (void*)&strv[0] - (void*)strv[0];
+      if (n >= sizeof(Bot_buf)) n = sizeof(Bot_buf) - 1;
+      memcpy(Bot_buf, strv[0], n);
       for (nsav= 0, p = Bot_buf; strv[nsav] != NULL; nsav++) {
          p += strlen(strv[nsav]) + 1;
          if ((p - Bot_buf) >= sizeof(Bot_buf))