bug-gnu-utils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

tighten up handling of FIELDWIDTHS values


From: Jim Meyering
Subject: tighten up handling of FIELDWIDTHS values
Date: Fri, 08 Apr 2005 17:42:41 +0200

Hi Arnold,

Currently, gawk doesn't complain about non-integer FIELDWIDTHS values,
nor does it detect overflow or a couple of other problems.  Here's a
patch that fixes those, along with some simple invocations of gawk to
test the change:

./gawk 'BEGIN { FIELDWIDTHS = "" }'                      2>/dev/null&&echo bug
./gawk 'BEGIN { FIELDWIDTHS = "'$(echo 2^31|bc)'" }'     2>/dev/null&&echo bug
./gawk 'BEGIN { FIELDWIDTHS = "'$(echo 2^32+1|bc)' 1" }' 2>/dev/null&&echo bug
./gawk 'BEGIN { FIELDWIDTHS = "xxx" }'                   2>/dev/null&&echo bug
./gawk 'BEGIN { FIELDWIDTHS = "-9" }'                    2>/dev/null&&echo bug
./gawk 'BEGIN { FIELDWIDTHS = "-'$(echo 2^32-1|bc)'" }'  2>/dev/null&&echo bug
./gawk 'BEGIN { FIELDWIDTHS = "-" }'                     2>/dev/null&&echo bug
./gawk 'BEGIN { FIELDWIDTHS = "0" }'                     2>/dev/null&&echo bug

./gawk 'BEGIN { FIELDWIDTHS = "'$(echo 2^31-1|bc)'" }' || echo bug
./gawk 'BEGIN { FIELDWIDTHS = "9" }'   || echo bug
./gawk 'BEGIN { FIELDWIDTHS = "9 " }'  || echo bug
./gawk 'BEGIN { FIELDWIDTHS = " 9" }'  || echo bug
./gawk 'BEGIN { FIELDWIDTHS = " 9 " }' || echo bug
./gawk 'BEGIN { FIELDWIDTHS = "1" }'   || echo bug

2005-04-08  Jim Meyering  <address@hidden>

        * field.c (set_FIELDWIDTHS): Tighten up the code to accept FIELDWIDTHS
        values in [1..INT_MAX], e.g., detect overflow and invalid strings,
        and reject strings starting with `-'.

--- field.c.~1~ 2005-04-06 14:02:19.906978041 +0200
+++ field.c     2005-04-08 17:40:23.845830826 +0200
@@ -3,7 +3,7 @@
  */
 
 /* 
- * Copyright (C) 1986, 1988, 1989, 1991-2004 the Free Software Foundation, Inc.
+ * Copyright (C) 1986, 1988, 1989, 1991-2005 the Free Software Foundation, Inc.
  * 
  * This file is part of GAWK, the GNU implementation of the
  * AWK Programming Language.
@@ -910,16 +910,38 @@ set_FIELDWIDTHS()
                emalloc(FIELDWIDTHS, int *, fw_alloc * sizeof(int), 
"set_FIELDWIDTHS");
        FIELDWIDTHS[0] = 0;
        for (i = 1; ; i++) {
+               unsigned long int tmp;
                if (i >= fw_alloc) {
                        fw_alloc *= 2;
                        erealloc(FIELDWIDTHS, int *, fw_alloc * sizeof(int), 
"set_FIELDWIDTHS");
                }
-               FIELDWIDTHS[i] = (int) strtoul(scan, &end, 10);
-               if (end == scan)
-                       break;
-               if (FIELDWIDTHS[i] <= 0)
-                       fatal(_("field %d in FIELDWIDTHS, must be > 0"), i);
+               /* Ensure that there is no leading `-' sign.  Otherwise,
+                  strtoul would accept it and return a bogus result.  */
+               while (isblank(*scan)) {
+                       ++scan;
+               }
+               if (*scan == '-')
+                       fatal(_("invalid FIELDWIDTHS value, near `%s'"),
+                             scan);
+
+               /* Detect an invalid base-10 integer, a valid value that
+                  is followed by something other than a blank or '\0',
+                  or a value that is not in the range [1..INT_MAX].  */
+               errno = 0;
+               tmp = strtoul(scan, &end, 10);
+               if (errno != 0
+                   || !(*end == '\0' || isblank(*end))
+                   || !(0 < tmp && tmp <= INT_MAX))
+                       fatal(_("invalid FIELDWIDTHS value, near `%s'"),
+                             scan);
+               FIELDWIDTHS[i] = tmp;
                scan = end;
+               /* Skip past any trailing blanks.  */
+               while (isblank(*scan)) {
+                       ++scan;
+               }
+               if (*scan == '\0')
+                       break;
        }
        FIELDWIDTHS[i] = -1;
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]