From: Gregor Hoffleit Date: Thu, 4 Mar 2010 10:40:03 +0000 (+0100) Subject: Fix json_quote_str to handle non-ASCII characters X-Git-Tag: 0.2~65 X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=commitdiff_plain;h=4a442846926f7e3d1b30b7afac59dd1def0e5a41 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 (with some additional details for commit message). --- diff --git a/json.c b/json.c index f90b0fa2..1d0c1694 100644 --- a/json.c +++ b/json.c @@ -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++ = '\\';