]> granicus.if.org Git - procps-ng/commitdiff
w: Clamp maxcmd to the MIN/MAX_CMD_WIDTH range.
authorQualys Security Advisory <qsa@qualys.com>
Thu, 1 Jan 1970 00:00:00 +0000 (00:00 +0000)
committerCraig Small <csmall@enc.com.au>
Wed, 13 Jun 2018 12:05:18 +0000 (22:05 +1000)
The current checks allow out-of-range values (for example, if
getenv/atoi returns ~-2GB, maxcmd becomes ~+2GB after the subtraction).
This is not a security problem, none of this is under an attacker's
control.

w.c

diff --git a/w.c b/w.c
index b3c0644648aacc5494504994d8c0acbd1c9b6a21..35710a3a6758aefe0cae9f14acdb1c0ed24707ff 100644 (file)
--- a/w.c
+++ b/w.c
@@ -579,11 +579,14 @@ int main(int argc, char **argv)
                maxcmd = atoi(p);
        else
                maxcmd = MAX_CMD_WIDTH;
-       if (MAX_CMD_WIDTH < maxcmd)
-               maxcmd = MAX_CMD_WIDTH;
+#define CLAMP_CMD_WIDTH(cw) do { \
+       if ((cw) < MIN_CMD_WIDTH) (cw) = MIN_CMD_WIDTH; \
+       if ((cw) > MAX_CMD_WIDTH) (cw) = MAX_CMD_WIDTH; \
+} while (0)
+       CLAMP_CMD_WIDTH(maxcmd);
        maxcmd -= 21 + userlen + (from ? fromlen : 0) + (longform ? 20 : 0);
-       if (maxcmd < MIN_CMD_WIDTH)
-        maxcmd = MIN_CMD_WIDTH;
+       CLAMP_CMD_WIDTH(maxcmd);
+#undef CLAMP_CMD_WIDTH
 
        procs = readproctab(PROC_FILLCOM | PROC_FILLUSR | PROC_FILLSTAT);