Skip to content

Commit 72ceb41

Browse files
committed
builtin.c: fix signed integer overflow in jv2tm
jv2tm now properly clamps large number values to a signed 32-bit integer and rejects nan. Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=65885
1 parent 1411ce6 commit 72ceb41

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

src/builtin.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1464,13 +1464,20 @@ static jv f_strptime(jq_state *jq, jv a, jv b) {
14641464
#define TO_TM_FIELD(t, j, i) \
14651465
do { \
14661466
jv n = jv_array_get(jv_copy(j), (i)); \
1467-
if (jv_get_kind(n) != (JV_KIND_NUMBER)) { \
1467+
if (jv_get_kind(n) != (JV_KIND_NUMBER) || \
1468+
jvp_number_is_nan(n)) { \
14681469
jv_free(n); \
14691470
jv_free(j); \
14701471
return 0; \
14711472
} \
1472-
t = jv_number_value(n); \
1473+
double dint = jv_number_value(n); \
14731474
jv_free(n); \
1475+
if (dint < INT_MIN) \
1476+
t = INT_MIN; \
1477+
else if (dint > INT_MAX) \
1478+
t = INT_MAX; \
1479+
else \
1480+
t = (int)dint; \
14741481
} while (0)
14751482

14761483
static int jv2tm(jv a, struct tm *tm) {

tests/jq.test

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1585,6 +1585,12 @@ try mktime catch .
15851585
["a",1,2,3,4,5,6,7]
15861586
"mktime requires parsed datetime inputs"
15871587

1588+
# oss-fuzz #65885: non-int32 values are accepted and cause UB overflows
1589+
.[] | try ["OK", strftime("%Y-%m-%dT%H:%M:%SZ")] catch ["KO", .]
1590+
[[1e31],[NaN]]
1591+
["KO","strftime/1 requires parsed datetime inputs"]
1592+
["KO","strftime/1 requires parsed datetime inputs"]
1593+
15881594
# oss-fuzz #67403: non-string argument with number input fails assert
15891595
try ["OK", strftime([])] catch ["KO", .]
15901596
0

0 commit comments

Comments
 (0)