The current code in json_quote_str() only accepts strict printable ASCII
code points (i.e. 32-127), all other code points are dropped from the
JSON output. The code is attempting to drop only non-printable ASCII
characters, but doing a signed comparison of the byte value is also
dropping characters with values >= 128.
This patch uses an unsigned comparison to accept code points 32-255.
Reviewed-by: Carl Worth <cworth@cworth.org> (with some additional
details for commit message).
for (loop = 0, required = 0, ptr = str;
loop < len;
loop++, required++, ptr++) {
- if (*ptr < 32 || *ptr == '\"' || *ptr == '\\')
+ if ((unsigned char)(*ptr) < 32 || *ptr == '\"' || *ptr == '\\')
required++;
}
*ptr2++ = '\"';
for (loop = 0; loop < len; loop++) {
- if (*ptr > 31 && *ptr != '\"' && *ptr != '\\') {
+ if ((unsigned char)(*ptr) > 31 && *ptr != '\"' && *ptr != '\\') {
*ptr2++ = *ptr++;
} else {
*ptr2++ = '\\';