diff options
author | Nicolas Williams <nico@cryptonector.com> | 2014-12-12 16:58:23 -0600 |
---|---|---|
committer | Nicolas Williams <nico@cryptonector.com> | 2014-12-12 17:05:16 -0600 |
commit | 2075bec60fd57169b7bf6a440bcf05fbf290ffe9 (patch) | |
tree | e6f56099feddbfe40f4a0c09d38eadaa4cf47f6d | |
parent | 44c23824021821ef7083e786575a13bb292768bf (diff) |
Fix #647, but caused by 89791a0
-rw-r--r-- | jq_test.c | 8 | ||||
-rw-r--r-- | jv_parse.c | 6 |
2 files changed, 14 insertions, 0 deletions
@@ -101,6 +101,14 @@ static void run_jq_tests(FILE *testdata) { static void jv_test() { + /// JSON parser regression tests + { + jv v = jv_parse("{\"a':\"12\"}"); + assert(jv_get_kind(v) == JV_KIND_INVALID); + v = jv_invalid_get_msg(v); + assert(strcmp(jv_string_value(v), "Expected separator between values at line 1, column 9 (while parsing '{\"a':\"12\"}')") == 0); + jv_free(v); + } /// Arrays and numbers { jv a = jv_array(); @@ -456,9 +456,15 @@ jv jv_parser_next(struct jv_parser* p) { } else if (msg) { parser_reset(p); if (ch != '\036' && (p->flags & JV_PARSE_SEQ)) { + // Skip to the next RS p->st = JV_PARSER_WAITING_FOR_RS; return jv_invalid_with_msg(jv_string_fmt("%s at line %d, column %d (need RS to resync)", msg, p->line, p->column)); } + if (!(p->flags & JV_PARSE_SEQ)) { + // We're not parsing a JSON text sequence; throw this buffer away. + p->curr_buf = 0; + p->curr_buf_pos = 0; + } // Else ch must be RS; don't clear buf so we can start parsing again after this ch return jv_invalid_with_msg(jv_string_fmt("%s at line %d, column %d", msg, p->line, p->column)); } else if (p->curr_buf_is_partial) { assert(p->curr_buf_pos == p->curr_buf_length); |