From 4a442846926f7e3d1b30b7afac59dd1def0e5a41 Mon Sep 17 00:00:00 2001 From: Gregor Hoffleit Date: Thu, 4 Mar 2010 11:40:03 +0100 Subject: [PATCH] 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). --- json.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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++ = '\\';