]> Savannah Git Hosting - gnulib.git/commitdiff
xstrtol: prohibit monstrosities like "1bB"
authorPaul Eggert <eggert@cs.ucla.edu>
Wed, 27 Apr 2016 19:10:54 +0000 (12:10 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 27 Apr 2016 19:11:46 +0000 (12:11 -0700)
Problem reported by Young Mo Kang in: http://bugs.gnu.org/23388
* lib/xstrtol.c (__xstrtol): Allow trailing second suffixes like
"B" only if the first suffix needs a base.
* tests/test-xstrtol.sh: Test this.

ChangeLog
lib/xstrtol.c
tests/test-xstrtol.sh

index 2589371d2103d1743cfbf5f21700b61591f9e51e..09c302cb9d6be5b85d8fcd13148a06fdbaf7f55a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2016-04-27  Paul Eggert  <eggert@cs.ucla.edu>
+
+       xstrtol: prohibit monstrosities like "1bB"
+       Problem reported by Young Mo Kang in: http://bugs.gnu.org/23388
+       * lib/xstrtol.c (__xstrtol): Allow trailing second suffixes like
+       "B" only if the first suffix needs a base.
+       * tests/test-xstrtol.sh: Test this.
+
 2016-04-21  Pádraig Brady  <P@draigBrady.com>
 
        xstrtod: reinstate setting of *result upon ERANGE
index 5a3afb545e17983c3ee15654dd8cc242725f168a..c5b16922c32825527c627aac7919d10638d87979 100644 (file)
@@ -148,8 +148,11 @@ __xstrtol (const char *s, char **ptr, int strtol_base,
           return err | LONGINT_INVALID_SUFFIX_CHAR;
         }
 
-      if (strchr (valid_suffixes, '0'))
+      switch (**p)
         {
+        case 'E': case 'G': case 'g': case 'k': case 'K': case 'M': case 'm':
+        case 'P': case 'T': case 't': case 'Y': case 'Z':
+
           /* The "valid suffix" '0' is a special flag meaning that
              an optional second suffix is allowed, which can change
              the base.  A suffix "B" (e.g. "100MB") stands for a power
@@ -157,19 +160,20 @@ __xstrtol (const char *s, char **ptr, int strtol_base,
              a power of 1024.  If no suffix (e.g. "100M"), assume
              power-of-1024.  */
 
-          switch (p[0][1])
-            {
-            case 'i':
-              if (p[0][2] == 'B')
-                suffixes += 2;
-              break;
-
-            case 'B':
-            case 'D': /* 'D' is obsolescent */
-              base = 1000;
-              suffixes++;
-              break;
-            }
+          if (strchr (valid_suffixes, '0'))
+            switch (p[0][1])
+              {
+              case 'i':
+                if (p[0][2] == 'B')
+                  suffixes += 2;
+                break;
+
+              case 'B':
+              case 'D': /* 'D' is obsolescent */
+                base = 1000;
+                suffixes++;
+                break;
+              }
         }
 
       switch (**p)
@@ -179,6 +183,9 @@ __xstrtol (const char *s, char **ptr, int strtol_base,
           break;
 
         case 'B':
+          /* This obsolescent first suffix is distinct from the 'B'
+             second suffix above.  E.g., 'tar -L 1000B' means change
+             the tape after writing 1000 KiB of data.  */
           overflow = bkm_scale (&tmp, 1024);
           break;
 
index f718d8f77987574df0f94a0114f7be11a9a7c516..5425bc79dc2a95cfebb119ecc9762306e10a4fef 100755 (executable)
@@ -16,6 +16,7 @@ test-xstrtol 9x >> out 2>&1 && result=1
 test-xstrtol 010 >> out 2>&1 || result=1
 # suffix without integer is valid
 test-xstrtol MiB >> out 2>&1 || result=1
+test-xstrtol 1bB >> out 2>&1 && result=1
 
 # test xstrtoul
 test-xstrtoul 1 >> out 2>&1 || result=1
@@ -27,6 +28,7 @@ test-xstrtoul x >> out 2>&1 && result=1
 test-xstrtoul 9x >> out 2>&1 && result=1
 test-xstrtoul 010 >> out 2>&1 || result=1
 test-xstrtoul MiB >> out 2>&1 || result=1
+test-xstrtoul 1bB >> out 2>&1 && result=1
 
 # Find out how to remove carriage returns from output. Solaris /usr/ucb/tr
 # does not understand '\r'.
@@ -51,6 +53,7 @@ invalid X argument 'x'
 invalid suffix in X argument '9x'
 010->8 ()
 MiB->1048576 ()
+invalid suffix in X argument '1bB'
 1->1 ()
 invalid X argument '-1'
 1k->1024 ()
@@ -60,6 +63,7 @@ invalid X argument 'x'
 invalid suffix in X argument '9x'
 010->8 ()
 MiB->1048576 ()
+invalid suffix in X argument '1bB'
 EOF
 
 compare expected out || result=1