mirror of
https://github.com/mauiaaron/apple2.git
synced 2024-06-08 16:29:27 +00:00
Check for and disallow NULL tokens in one location
This commit is contained in:
parent
2da23f717a
commit
8b74dafc6f
34
externals/jsmn/jsmn.c
vendored
34
externals/jsmn/jsmn.c
vendored
|
@ -54,10 +54,6 @@ static int jsmn_parse_primitive(jsmn_parser *parser, const char *js,
|
|||
return JSMN_ERROR_PART;
|
||||
|
||||
found:
|
||||
if (tokens == NULL) {
|
||||
parser->pos--;
|
||||
return 0;
|
||||
}
|
||||
token = jsmn_alloc_token(parser, tokens, num_tokens);
|
||||
if (token == NULL) {
|
||||
parser->pos = start;
|
||||
|
@ -86,9 +82,6 @@ static int jsmn_parse_string(jsmn_parser *parser, const char *js,
|
|||
|
||||
/* Quote: end of string */
|
||||
if (c == '\"') {
|
||||
if (tokens == NULL) {
|
||||
return 0;
|
||||
}
|
||||
token = jsmn_alloc_token(parser, tokens, num_tokens);
|
||||
if (token == NULL) {
|
||||
parser->pos = start;
|
||||
|
@ -158,6 +151,10 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
|
|||
jsmntok_t *token;
|
||||
int count = parser->toknext;
|
||||
|
||||
if (tokens == NULL) {
|
||||
return JSMN_ERROR_NOMEM;
|
||||
}
|
||||
|
||||
for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
|
||||
char c;
|
||||
jsmntype_t type;
|
||||
|
@ -166,9 +163,6 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
|
|||
switch (c) {
|
||||
case '{': case '[':
|
||||
count++;
|
||||
if (tokens == NULL) {
|
||||
break;
|
||||
}
|
||||
token = jsmn_alloc_token(parser, tokens, num_tokens);
|
||||
if (token == NULL)
|
||||
return JSMN_ERROR_NOMEM;
|
||||
|
@ -182,8 +176,6 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
|
|||
parser->toksuper = parser->toknext - 1;
|
||||
break;
|
||||
case '}': case ']':
|
||||
if (tokens == NULL)
|
||||
break;
|
||||
type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY);
|
||||
if (parser->toknext < 1) {
|
||||
return JSMN_ERROR_INVAL;
|
||||
|
@ -208,7 +200,7 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
|
|||
r = jsmn_parse_string(parser, js, len, tokens, num_tokens);
|
||||
if (r < 0) return r;
|
||||
count++;
|
||||
if (parser->toksuper != -1 && tokens != NULL) {
|
||||
if (parser->toksuper != -1) {
|
||||
tokens[parser->toksuper].size++;
|
||||
jsmn_percolate_skip_counts(tokens, parser->toksuper);
|
||||
}
|
||||
|
@ -219,7 +211,7 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
|
|||
parser->toksuper = parser->toknext - 1;
|
||||
break;
|
||||
case ',':
|
||||
if (tokens != NULL && parser->toksuper != -1 &&
|
||||
if (parser->toksuper != -1 &&
|
||||
tokens[parser->toksuper].type != JSMN_ARRAY &&
|
||||
tokens[parser->toksuper].type != JSMN_OBJECT) {
|
||||
parser->toksuper = tokens[parser->toksuper].parent;
|
||||
|
@ -230,7 +222,7 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
|
|||
case '5': case '6': case '7' : case '8': case '9':
|
||||
case 't': case 'f': case 'n' :
|
||||
/* And they must not be keys of the object */
|
||||
if (tokens != NULL && parser->toksuper != -1) {
|
||||
if (parser->toksuper != -1) {
|
||||
jsmntok_t *t = &tokens[parser->toksuper];
|
||||
if (t->type == JSMN_OBJECT ||
|
||||
(t->type == JSMN_STRING && t->size != 0)) {
|
||||
|
@ -240,7 +232,7 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
|
|||
r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens);
|
||||
if (r < 0) return r;
|
||||
count++;
|
||||
if (parser->toksuper != -1 && tokens != NULL) {
|
||||
if (parser->toksuper != -1) {
|
||||
tokens[parser->toksuper].size++;
|
||||
jsmn_percolate_skip_counts(tokens, parser->toksuper);
|
||||
}
|
||||
|
@ -252,12 +244,10 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
|
|||
}
|
||||
}
|
||||
|
||||
if (tokens != NULL) {
|
||||
for (i = parser->toknext - 1; i >= 0; i--) {
|
||||
/* Unmatched opened object or array */
|
||||
if (tokens[i].start != -1 && tokens[i].end == -1) {
|
||||
return JSMN_ERROR_PART;
|
||||
}
|
||||
for (i = parser->toknext - 1; i >= 0; i--) {
|
||||
/* Unmatched opened object or array */
|
||||
if (tokens[i].start != -1 && tokens[i].end == -1) {
|
||||
return JSMN_ERROR_PART;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user