[Top][All Lists]
[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;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- tighten up handling of FIELDWIDTHS values,
Jim Meyering <=