diff options
author | Gregor Hoffleit <gregor@hoffleit.de> | 2010-03-04 11:40:03 +0100 |
---|---|---|
committer | Carl Worth <cworth@cworth.org> | 2010-04-13 08:30:40 -0700 |
commit | 4a442846926f7e3d1b30b7afac59dd1def0e5a41 (patch) | |
tree | 0c8f6a365bdfd342355ee85567bf914e91568cea /json.c | |
parent | 22d117d14497ddea11014cab2f25d1be57210de2 (diff) |
Fix json_quote_str to handle non-ASCII characters
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).
Diffstat (limited to 'json.c')
-rw-r--r-- | json.c | 4 |
1 files changed, 2 insertions, 2 deletions
@@ -63,7 +63,7 @@ json_quote_chararray(const void *ctx, const char *str, const size_t len) 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++; } @@ -80,7 +80,7 @@ json_quote_chararray(const void *ctx, const char *str, const size_t len) *ptr2++ = '\"'; for (loop = 0; loop < len; loop++) { - if (*ptr > 31 && *ptr != '\"' && *ptr != '\\') { + if ((unsigned char)(*ptr) > 31 && *ptr != '\"' && *ptr != '\\') { *ptr2++ = *ptr++; } else { *ptr2++ = '\\'; |