libmultipath: scan_devname: fix int overflow detection
authorMartin Wilck <mwilck@suse.com>
Sat, 12 Oct 2019 21:27:44 +0000 (21:27 +0000)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Mon, 2 Mar 2020 08:16:30 +0000 (09:16 +0100)
For an int n, it's possible that n > 0 and (26 * n) > 0, but
and still 26 * n overflows the int.
E.g. n = 0x0ec4ec4e; 26 * n = 0x17fffffec, truncated to 32 bit
yields 0x7fffffec, which is > 0.

And anyway, relying on a signed int overflow to detect a problem
is wrong, as the result of such operations is undefined in C.

Signed-off-by: Martin Wilck <mwilck@suse.com>
libmultipath/alias.c

index 0fb206d..a96ba5c 100644 (file)
@@ -77,6 +77,7 @@ scan_devname(const char *alias, const char *prefix)
 {
        const char *c;
        int i, n = 0;
+       static const int last_26 = INT_MAX / 26;
 
        if (!prefix || strncmp(alias, prefix, strlen(prefix)))
                return -1;
@@ -93,9 +94,9 @@ scan_devname(const char *alias, const char *prefix)
                if (*c < 'a' || *c > 'z')
                        return -1;
                i = *c - 'a';
-               n = ( n * 26 ) + i;
-               if (n < 0)
+               if (n > last_26 || (n == last_26 && i >= INT_MAX % 26))
                        return -1;
+               n = n * 26 + i;
                c++;
                n++;
        }