Skip to content

Commit fd2e0e4

Browse files
Bugfix for strict primitive parsing
1 parent 30f2b7c commit fd2e0e4

File tree

1 file changed

+25
-18
lines changed

1 file changed

+25
-18
lines changed

jsmn.h

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -315,26 +315,34 @@ static int jsmn_parse_primitive(jsmn_parser *parser, const char *js,
315315
numstate != JSMN_NUM_INT_ZERO &&
316316
numstate != JSMN_NUM_FRAC &&
317317
numstate != JSMN_NUM_EXP) {
318-
return JSMN_ERROR_INVAL;
318+
if (parser->pos >= len || js[parser->pos] == '\0') {
319+
parser->pos = start;
320+
return JSMN_ERROR_PART;
321+
} else {
322+
return JSMN_ERROR_INVAL;
323+
}
319324
}
320325
}
321326

322327
/* Verify that what comes after the primitive is a non-primitive character */
323-
switch (js[parser->pos]) {
324-
case '\t':
325-
case '\r':
326-
case '\n':
327-
case ' ':
328-
case ',':
329-
case ':':
330-
case '"':
331-
case '[':
332-
case ']':
333-
case '{':
334-
case '}':
335-
break;
336-
default:
337-
return JSMN_ERROR_INVAL;
328+
if (parser->pos < len) {
329+
switch (js[parser->pos]) {
330+
case '\t':
331+
case '\r':
332+
case '\n':
333+
case ' ':
334+
case ',':
335+
case ':':
336+
case '"':
337+
case '[':
338+
case ']':
339+
case '{':
340+
case '}':
341+
case '\0':
342+
break;
343+
default:
344+
return JSMN_ERROR_INVAL;
345+
}
338346
}
339347
#else
340348
for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
@@ -387,12 +395,11 @@ static int jsmn_parse_string(jsmn_parser *parser, const char *js,
387395
const size_t len, jsmntok_t *tokens,
388396
const size_t num_tokens) {
389397
jsmntok_t *token;
390-
391398
unsigned int start = parser->pos;
392399

400+
/* Skip starting quote */
393401
parser->pos++;
394402

395-
/* Skip starting quote */
396403
for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
397404
char c = js[parser->pos];
398405

0 commit comments

Comments
 (0)