From 21f45911879abbaf5933c65df1beac8399b30038 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Tue, 23 May 2017 22:11:15 +0300 Subject: Additional robustness in FIELDWIDTHS parsing. --- field.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'field.c') diff --git a/field.c b/field.c index de1bae5f..54055adc 100644 --- a/field.c +++ b/field.c @@ -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; -- cgit v1.2.3