mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -04:00
json: fix \uXXXX parsing
We need exactly 4 hex characters, everything else is refused. We also copy those characters directly to the output string without assuming any encoding. See #2337
This commit is contained in:
parent
d9871f36c1
commit
f2cdb15e0c
2 changed files with 10 additions and 7 deletions
|
|
@ -355,15 +355,15 @@ static inline int spa_json_parse_stringn(const char *val, int len, char *result,
|
|||
else if (*p == 'f')
|
||||
*result++ = '\f';
|
||||
else if (*p == 'u') {
|
||||
char *end;
|
||||
uint16_t v = strtol(p+1, &end, 16);
|
||||
if (p+1 == end) {
|
||||
uint8_t v[2];
|
||||
if (p + 5 > val + len ||
|
||||
sscanf(p+1, "%02hhx%02hhx", &v[0], &v[1]) != 2) {
|
||||
*result++ = *p;
|
||||
} else {
|
||||
p = end-1;
|
||||
if (v > 0xff)
|
||||
*result++ = (v >> 8) & 0xff;
|
||||
*result++ = v & 0xff;
|
||||
p += 4;
|
||||
if (v[0] != 0)
|
||||
*result++ = v[0];
|
||||
*result++ = v[1];
|
||||
}
|
||||
} else
|
||||
*result++ = *p;
|
||||
|
|
|
|||
|
|
@ -176,6 +176,9 @@ PWTEST(json_encode)
|
|||
pwtest_str_eq(dst, "\"\\u0004\\u0005\\u001f \\u0001\x7f\x90\"");
|
||||
pwtest_int_eq(spa_json_parse_stringn(dst, sizeof(dst), result, sizeof(result)), 1);
|
||||
pwtest_str_eq(result, "\x04\x05\x1f\x20\x01\x7f\x90");
|
||||
strcpy(dst, "\"\\u03b2a\"");
|
||||
pwtest_int_eq(spa_json_parse_stringn(dst, sizeof(dst), result, sizeof(result)), 1);
|
||||
pwtest_str_eq(result, "\003\262a");
|
||||
|
||||
return PWTEST_PASS;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue