Check for and disallow NULL tokens in one location

This commit is contained in:
Aaron Culliney 2016-03-22 22:26:36 -07:00
parent 2da23f717a
commit 8b74dafc6f

34
externals/jsmn/jsmn.c vendored
View File

@ -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;
}
}