Fix univalue handling of \u0000 characters.
Univalue's parsing of \u escape sequences did not handle NUL characters correctly. They were, effectively, dropped. The extended test-case fails with the old code, and is fixed with this patch.
This commit is contained in:
@@ -188,25 +188,22 @@ enum jtokentype getJsonToken(string& tokenVal, unsigned int& consumed,
|
||||
case 't': valStr += "\t"; break;
|
||||
|
||||
case 'u': {
|
||||
char buf[4] = {0,0,0,0};
|
||||
char *last = &buf[0];
|
||||
unsigned int codepoint;
|
||||
if (hatoui(raw + 1, raw + 1 + 4, codepoint) !=
|
||||
raw + 1 + 4)
|
||||
return JTOK_ERR;
|
||||
|
||||
if (codepoint <= 0x7f)
|
||||
*last = (char)codepoint;
|
||||
valStr.push_back((char)codepoint);
|
||||
else if (codepoint <= 0x7FF) {
|
||||
*last++ = (char)(0xC0 | (codepoint >> 6));
|
||||
*last = (char)(0x80 | (codepoint & 0x3F));
|
||||
valStr.push_back((char)(0xC0 | (codepoint >> 6)));
|
||||
valStr.push_back((char)(0x80 | (codepoint & 0x3F)));
|
||||
} else if (codepoint <= 0xFFFF) {
|
||||
*last++ = (char)(0xE0 | (codepoint >> 12));
|
||||
*last++ = (char)(0x80 | ((codepoint >> 6) & 0x3F));
|
||||
*last = (char)(0x80 | (codepoint & 0x3F));
|
||||
valStr.push_back((char)(0xE0 | (codepoint >> 12)));
|
||||
valStr.push_back((char)(0x80 | ((codepoint >> 6) & 0x3F)));
|
||||
valStr.push_back((char)(0x80 | (codepoint & 0x3F)));
|
||||
}
|
||||
|
||||
valStr += buf;
|
||||
raw += 4;
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user