@@ -315,26 +315,34 @@ static int jsmn_parse_primitive(jsmn_parser *parser, const char *js,
315
315
numstate != JSMN_NUM_INT_ZERO &&
316
316
numstate != JSMN_NUM_FRAC &&
317
317
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
+ }
319
324
}
320
325
}
321
326
322
327
/* 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
+ }
338
346
}
339
347
#else
340
348
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,
387
395
const size_t len , jsmntok_t * tokens ,
388
396
const size_t num_tokens ) {
389
397
jsmntok_t * token ;
390
-
391
398
unsigned int start = parser -> pos ;
392
399
400
+ /* Skip starting quote */
393
401
parser -> pos ++ ;
394
402
395
- /* Skip starting quote */
396
403
for (; parser -> pos < len && js [parser -> pos ] != '\0' ; parser -> pos ++ ) {
397
404
char c = js [parser -> pos ];
398
405
0 commit comments