Skip to content

Commit a09a4df

Browse files
committed
Reject NaN with payload while parsing JSON
This commit drops support for parsing NaN with payload in JSON like `NaN123` and fixes CVE-2024-53427. Other JSON extensions like `NaN` and `Infinity` are still supported. Fixes #3023, fixes #3196, fixes #3246.
1 parent a8ce2ff commit a09a4df

File tree

3 files changed

+15
-11
lines changed

3 files changed

+15
-11
lines changed

src/jv.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,11 @@ static jv jvp_literal_number_new(const char * literal) {
585585
return JV_INVALID;
586586
}
587587
if (decNumberIsNaN(&n->num_decimal)) {
588+
// Reject NaN with payload.
589+
if (n->num_decimal.digits > 1 || *n->num_decimal.lsu != 0) {
590+
jv_mem_free(n);
591+
return JV_INVALID;
592+
}
588593
jv_mem_free(n);
589594
return jv_number(NAN);
590595
}

tests/jq.test

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2110,11 +2110,17 @@ tojson | fromjson
21102110
{"a":nan}
21112111
{"a":null}
21122112

2113-
# also "nan with payload" #2985
2114-
if have_decnum then fromjson else nan end | isnan
2115-
"nan1234"
2113+
# NaN with payload is not parsed
2114+
.[] | try (fromjson | isnan) catch .
2115+
["NaN","-NaN","NaN1","NaN10","NaN100","NaN1000","NaN10000","NaN100000"]
21162116
true
2117-
2117+
true
2118+
"Invalid numeric literal at EOF at line 1, column 4 (while parsing 'NaN1')"
2119+
"Invalid numeric literal at EOF at line 1, column 5 (while parsing 'NaN10')"
2120+
"Invalid numeric literal at EOF at line 1, column 6 (while parsing 'NaN100')"
2121+
"Invalid numeric literal at EOF at line 1, column 7 (while parsing 'NaN1000')"
2122+
"Invalid numeric literal at EOF at line 1, column 8 (while parsing 'NaN10000')"
2123+
"Invalid numeric literal at EOF at line 1, column 9 (while parsing 'NaN100000')"
21182124

21192125
# calling input/0, or debug/0 in a test doesn't crash jq
21202126

tests/shtest

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -669,13 +669,6 @@ if ! x=$($JQ -cn "$(printf '[\r\n1,# comment\r\n2,# comment\\\r\ncomment\r\n3\r\
669669
exit 1
670670
fi
671671

672-
# CVE-2023-50268: No stack overflow comparing a nan with a large payload
673-
if $JQ -ne 'have_decnum'; then
674-
$VALGRIND $Q $JQ '1 != .' <<\EOF >/dev/null
675-
Nan4000
676-
EOF
677-
fi
678-
679672
# Allow passing the inline jq script before -- #2919
680673
if ! r=$($JQ --args -rn -- '$ARGS.positional[0]' bar) || [ "$r" != bar ]; then
681674
echo "passing the inline script after -- didn't work"

0 commit comments

Comments
 (0)