diff --git a/src/jv_dtoa.c b/src/jv_dtoa.c index 175e82608f..9f8df4c6be 100644 --- a/src/jv_dtoa.c +++ b/src/jv_dtoa.c @@ -2368,29 +2368,21 @@ jvp_strtod sign = nz0 = nz1 = nz = bc.dplen = bc.uflchk = 0; dval(&rv) = 0.; - for(s = s00;;s++) switch(*s) { + switch(*(s = s00)) { case '-': sign = 1; /* no break */ JQ_FALLTHROUGH; case '+': if (*++s) - goto break2; + break; /* no break */ JQ_FALLTHROUGH; case 0: goto ret0; - case '\t': - case '\n': - case '\v': - case '\f': - case '\r': - case ' ': - continue; default: - goto break2; + break; } - break2: if (*s == '0') { #ifndef NO_HEX_FP /*{*/ switch(s[1]) { diff --git a/src/main.c b/src/main.c index d07b6ed0e7..7189a8eba2 100644 --- a/src/main.c +++ b/src/main.c @@ -422,12 +422,15 @@ int main(int argc, char* argv[]) { fprintf(stderr, "jq: --indent takes one parameter\n"); die(); } - dumpopts &= ~(JV_PRINT_TAB | JV_PRINT_INDENT_FLAGS(7)); - int indent = atoi(argv[i+1]); - if (indent < -1 || indent > 7) { + char* end = NULL; + errno = 0; + long indent = strtol(argv[i+1], &end, 10); + if (errno || indent < -1 || indent > 7 || + isspace(*argv[i+1]) || end == argv[i+1] || *end) { fprintf(stderr, "jq: --indent takes a number between -1 and 7\n"); die(); } + dumpopts &= ~(JV_PRINT_TAB | JV_PRINT_INDENT_FLAGS(7)); dumpopts |= JV_PRINT_INDENT_FLAGS(indent); i++; } else if (isoption(&text, 0, "seq", is_short)) { diff --git a/tests/jq.test b/tests/jq.test index 73a488ec8a..17232418f9 100644 --- a/tests/jq.test +++ b/tests/jq.test @@ -2342,8 +2342,8 @@ null 2 .[] |= try tonumber -["1", "2a", "3", " 4 ", "5.67", ".89", "-876", "+5.43", 21] -[1, 3, 5.67, 0.89, -876, 5.43, 21] +["1", "2a", "3", " 4", "5 ", "6.7", ".89", "-876", "+5.43", 21] +[1, 3, 6.7, 0.89, -876, 5.43, 21] # Also 1859, but from 2073 any(keys[]|tostring?;true)