diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2017-05-23 22:11:15 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2017-05-23 22:11:15 +0300 |
commit | 21f45911879abbaf5933c65df1beac8399b30038 (patch) | |
tree | 9b62a39822c3390d0e8d686811e860670ce9627d /field.c | |
parent | 6d75aa092bf1e04201c8bfa1c2ce88ca22422a00 (diff) | |
download | egawk-21f45911879abbaf5933c65df1beac8399b30038.tar.gz egawk-21f45911879abbaf5933c65df1beac8399b30038.tar.bz2 egawk-21f45911879abbaf5933c65df1beac8399b30038.zip |
Additional robustness in FIELDWIDTHS parsing.
Diffstat (limited to 'field.c')
-rw-r--r-- | field.c | 36 |
1 files changed, 18 insertions, 18 deletions
@@ -1175,39 +1175,39 @@ set_FIELDWIDTHS() /* * 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]. + * or a value that is not in the range [1..UINT_MAX]. */ errno = 0; tmp = strtoul(scan, &end, 10); if (errno == 0 && *end == ':' && (0 < tmp && tmp <= UINT_MAX)) { FIELDWIDTHS->fields[i].skip = tmp; scan = end + 1; - if (*scan == '*') - goto got_star; + if (*scan == '-') { + fatal_error = true; + break; + } // try scanning for field width tmp = strtoul(scan, &end, 10); } else FIELDWIDTHS->fields[i].skip = 0; - if (*scan == '*') { - got_star: - for (scan++; is_blank(*scan); scan++) - continue; - - if (*scan != '\0') - fatal(_("`*' must be the last designator in FIELDWIDTHS")); - - FIELDWIDTHS->fields[i].len = UINT_MAX; - FIELDWIDTHS->nf = i+1; - break; - } - if (errno != 0 || (*end != '\0' && ! is_blank(*end)) - || !(0 < tmp && tmp <= INT_MAX) + || !(0 < tmp && tmp <= UINT_MAX) ) { - fatal_error = true; + if (*scan == '*') { + for (scan++; is_blank(*scan); scan++) + continue; + + if (*scan != '\0') + fatal(_("`*' must be the last designator in FIELDWIDTHS")); + + FIELDWIDTHS->fields[i].len = UINT_MAX; + FIELDWIDTHS->nf = i+1; + } + else + fatal_error = true; break; } FIELDWIDTHS->fields[i].len = tmp; |