diff --git i/src/common/jsonapi.c w/src/common/jsonapi.c index 98e4ef09426..63d92c66aec 100644 --- i/src/common/jsonapi.c +++ w/src/common/jsonapi.c @@ -858,10 +858,25 @@ json_lex_string(JsonLexContext *lex) } else if (lex->strval != NULL) { + size_t chunklen = 1; + if (hi_surrogate != -1) return JSON_UNICODE_LOW_SURROGATE; - appendStringInfoChar(lex->strval, *s); + while (len + chunklen < lex->input_length) + { + char next = *(s + chunklen); + + if (next == '\\' || next == '"' || (unsigned char) next < 32) + break; + + chunklen++; + } + + appendBinaryStringInfo(lex->strval, s, chunklen); + + s += (chunklen - 1); + len += (chunklen - 1); } }