]> granicus.if.org Git - procps-ng/commitdiff
0076-proc/readproc.c: Harden vectorize_this_str().
authorQualys Security Advisory <qsa@qualys.com>
Thu, 1 Jan 1970 00:00:00 +0000 (00:00 +0000)
committerCraig Small <csmall@enc.com.au>
Sat, 9 Jun 2018 11:35:19 +0000 (21:35 +1000)
This detects an integer overflow of "strlen + 1", prevents an integer
overflow of "tot + adj + (2 * pSZ)", and avoids calling snprintf with a
string longer than INT_MAX. Truncate rather than fail, since the callers
do not expect a failure of this function.

---------------------------- adapted for newlib branch
. logic is now in pids.c
. former 'vectorize_this_str' is now 'pids_vectorize_this'

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

index 5928e4f6bed9cdf60c9c435dd8dd7c876ec9ac29..b1d1572395aefad006fc1f74e877e2a384c24f31 100644 (file)
@@ -97,9 +97,10 @@ struct pids_info {
 static char** pids_vectorize_this (const char* src) {
  #define pSZ  (sizeof(char*))
     char *cpy, **vec;
-    int adj, tot;
+    size_t adj, tot;
 
     tot = strlen(src) + 1;                       // prep for our vectors
+    if (tot < 1 || tot >= INT_MAX) tot = INT_MAX-1; // integer overflow?
     adj = (pSZ-1) - ((tot + pSZ-1) & (pSZ-1));   // calc alignment bytes
     cpy = calloc(1, tot + adj + (2 * pSZ));      // get new larger buffer
     if (!cpy) return NULL;                       // oops, looks like ENOMEM