From 8ef9b5798947b8b430c400ab989c15e21acdcac6 Mon Sep 17 00:00:00 2001 From: William Wong Date: Fri, 17 Feb 2017 10:38:29 +0800 Subject: [PATCH] Should only shift when scan_hex succeed --- parson.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/parson.c b/parson.c index 6a67cf4..e2bef19 100644 --- a/parson.c +++ b/parson.c @@ -501,18 +501,22 @@ static int scan_hex(const char c) { } static int scan_utf_16(const char *str, unsigned int *cp) { - unsigned int cp1 = scan_hex(*str++) << 12; - unsigned int cp2 = scan_hex(*str++) << 8; - unsigned int cp3 = scan_hex(*str++) << 4; - unsigned int cp4 = scan_hex(*str); + int i = 4; + int intermediate; - if (cp1 == EOF || cp2 == EOF || cp3 == EOF || cp4 == EOF) { - return EOF; - } else { - *cp = cp1 | cp2 | cp3 | cp4; + *cp = 0; - return 1; + while (i--) { + intermediate = scan_hex(*str++); + + if (intermediate == EOF) { + return EOF; + } + + *cp |= intermediate << (i << 2); } + + return 1; } static int parse_utf_16(const char **unprocessed, char **processed) {