Skip to content

Commit

Permalink
implode: Better implode input validation
Browse files Browse the repository at this point in the history
Error on non-number codepoint, asserted before
Replace negative codepoint with uncode replacement character, asserted before

TODO:
Handle surrogate range 0xd800-0xdfff

Fixes #1160
  • Loading branch information
wader committed Jul 2, 2023
1 parent f88c4e5 commit 7657055
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 1 deletion.
11 changes: 11 additions & 0 deletions src/builtin.c
Original file line number Diff line number Diff line change
Expand Up @@ -1186,9 +1186,20 @@ static jv f_string_indexes(jq_state *jq, jv a, jv b) {
}

static jv f_string_implode(jq_state *jq, jv a) {
int i;
int len;
if (jv_get_kind(a) != JV_KIND_ARRAY) {
return ret_error(a, jv_string("implode input must be an array"));
}
len = jv_array_length(jv_copy(a));
for (i = 0; i < len; i++) {
jv n = jv_array_get(jv_copy(a), i);
if (jv_get_kind(n) != JV_KIND_NUMBER) {
jv_free(a);
return type_error(n, "codepoint must be a number");
}
}

return jv_string_implode(a);
}

Expand Down
2 changes: 1 addition & 1 deletion src/jv.c
Original file line number Diff line number Diff line change
Expand Up @@ -1363,7 +1363,7 @@ jv jv_string_implode(jv j) {
assert(JVP_HAS_KIND(n, JV_KIND_NUMBER));
int nv = jv_number_value(n);
jv_free(n);
if (nv > 0x10FFFF)
if (nv < 0 || nv > 0x10FFFF)
nv = 0xFFFD; // U+FFFD REPLACEMENT CHARACTER
s = jv_string_append_codepoint(s, nv);
}
Expand Down
9 changes: 9 additions & 0 deletions tests/jq.test
Original file line number Diff line number Diff line change
Expand Up @@ -1731,3 +1731,12 @@ false
. |= try . catch .
1
1

# explode/implode
implode|explode
[-1,0,1,2,3,1114111,1114112]
[65533,0,1,2,3,1114111,65533]

map(try implode catch .)
[123,["a"]]
["implode input must be an array","string (\"a\") codepoint must be a number"]

0 comments on commit 7657055

Please sign in to comment.