diff --git a/cJSON_Utils.c b/cJSON_Utils.c index 9c0c33e35a2aa189c4a3967f5485a64952a781b2..e9e809cac9ea5c2aa99da9f42442011ed171aa4e 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -288,22 +288,35 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON * const object, const char *po /* JSON Patch implementation. */ static void cJSONUtils_InplaceDecodePointerString(unsigned char *string) { - unsigned char *s2 = string; + unsigned char *decoded_string = string; if (string == NULL) { return; } - for (; *string; (void)s2++, string++) + for (; *string; (void)decoded_string++, string++) { - *s2 = (unsigned char) ((*string != '~') - ? (*string) - : ((*(++string) == '0') - ? '~' - : '/')); + if (string[0] == '~') + { + if (string[1] == '0') + { + decoded_string[0] = '~'; + } + else if (string[1] == '1') + { + decoded_string[1] = '/'; + } + else + { + /* invalid escape sequence */ + return; + } + + string++; + } } - *s2 = '\0'; + decoded_string[0] = '\0'; } /* non-broken cJSON_DetachItemFromArray */