Fix a parsing bug for \uXXXX escapes (some invalid escapes were accepted).
Found by gcc -O -Wall identifying a use of uninitialised variables.
This commit is contained in:
1 parent
3898f744dc
commit
134b062be7
1 file changed
+5
-1
+5
-1
@@ -155,6 +155,7 @@ static int unhex4(char* hex) {
|
|||||||
if ('0' <= c && c <= '9') n = c - '0';
|
if ('0' <= c && c <= '9') n = c - '0';
|
||||||
else if ('a' <= c && c <= 'f') n = c - 'a' + 10;
|
else if ('a' <= c && c <= 'f') n = c - 'a' + 10;
|
||||||
else if ('A' <= c && c <= 'F') n = c - 'A' + 10;
|
else if ('A' <= c && c <= 'F') n = c - 'A' + 10;
|
||||||
|
else return -1;
|
||||||
r <<= 4;
|
r <<= 4;
|
||||||
r |= n;
|
r |= n;
|
||||||
}
|
}
|
||||||
@@ -186,7 +187,10 @@ static pfunc found_string(struct jv_parser* p) {
|
|||||||
/* ahh, the complicated case */
|
/* ahh, the complicated case */
|
||||||
if (in + 4 > end)
|
if (in + 4 > end)
|
||||||
return "Invalid \\uXXXX escape";
|
return "Invalid \\uXXXX escape";
|
||||||
unsigned long codepoint = unhex4(in);
|
int hexvalue = unhex4(in);
|
||||||
|
if (hexvalue < 0)
|
||||||
|
return "Invalid characters in \\uXXXX escape";
|
||||||
|
unsigned long codepoint = (unsigned long)hexvalue;
|
||||||
in += 4;
|
in += 4;
|
||||||
if (0xD800 <= codepoint && codepoint <= 0xDBFF) {
|
if (0xD800 <= codepoint && codepoint <= 0xDBFF) {
|
||||||
/* who thought UTF-16 surrogate pairs were a good idea? */
|
/* who thought UTF-16 surrogate pairs were a good idea? */
|
||||||
|
|||||||
Reference in new issue
Block a user