summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Williams <nico@cryptonector.com>2015-06-17 11:24:34 -0500
committerNicolas Williams <nico@cryptonector.com>2015-06-17 11:24:34 -0500
commit4ef04e5b5cabd17b9d5b6402c523e6ca92466cf3 (patch)
tree906903baafa25648cf172b092304a99d90d06cef
parent0f5345e515e269470f50a584ad3a6c63213d4d38 (diff)
Sequence parser: wait for RS on startup (fix #687)
Per-RFC7464.
-rw-r--r--jv_parse.c56
-rwxr-xr-xtests/run8
2 files changed, 37 insertions, 27 deletions
diff --git a/jv_parse.c b/jv_parse.c
index cdffd1c0..b6d6e955 100644
--- a/jv_parse.c
+++ b/jv_parse.c
@@ -77,7 +77,10 @@ static void parser_init(struct jv_parser* p, int flags) {
p->next = jv_invalid();
p->tokenbuf = 0;
p->tokenlen = p->tokenpos = 0;
- p->st = JV_PARSER_NORMAL;
+ if ((p->flags & JV_PARSE_SEQ))
+ p->st = JV_PARSER_WAITING_FOR_RS;
+ else
+ p->st = JV_PARSER_NORMAL;
p->eof = 0;
p->curr_buf = 0;
p->curr_buf_length = p->curr_buf_pos = p->curr_buf_is_partial = 0;
@@ -720,8 +723,17 @@ jv jv_parser_next(struct jv_parser* p) {
presult msg = 0;
while (!msg && p->curr_buf_pos < p->curr_buf_length) {
ch = p->curr_buf[p->curr_buf_pos++];
- if (ch != '\036' && p->st == JV_PARSER_WAITING_FOR_RS)
+ if (p->st == JV_PARSER_WAITING_FOR_RS) {
+ if (ch == '\n') {
+ p->line++;
+ p->column = 0;
+ } else {
+ p->column++;
+ }
+ if (ch == '\036')
+ p->st = JV_PARSER_NORMAL;
continue; // need to resync, wait for RS
+ }
msg = scan(p, ch, &value);
}
if (msg == OK) {
@@ -752,26 +764,26 @@ jv jv_parser_next(struct jv_parser* p) {
p->eof = 1;
assert(p->curr_buf_pos == p->curr_buf_length);
jv_free(value);
- if (p->st != JV_PARSER_WAITING_FOR_RS) {
- if (p->st != JV_PARSER_NORMAL) {
- value = make_error(p, "Unfinished string at EOF at line %d, column %d", p->line, p->column);
- parser_reset(p);
- p->st = JV_PARSER_WAITING_FOR_RS;
- return value;
- }
- if ((msg = check_literal(p))) {
- value = make_error(p, "%s at EOF at line %d, column %d", msg, p->line, p->column);
- parser_reset(p);
- p->st = JV_PARSER_WAITING_FOR_RS;
- return value;
- }
- if (((p->flags & JV_PARSE_STREAMING) && p->stacklen != 0) ||
- (!(p->flags & JV_PARSE_STREAMING) && p->stackpos != 0)) {
- value = make_error(p, "Unfinished JSON term at EOF at line %d, column %d", p->line, p->column);
- parser_reset(p);
- p->st = JV_PARSER_WAITING_FOR_RS;
- return value;
- }
+ if (p->st == JV_PARSER_WAITING_FOR_RS)
+ return make_error(p, "Unfinished abandoned text at EOF at line %d, column %d", p->line, p->column);
+ if (p->st != JV_PARSER_NORMAL) {
+ value = make_error(p, "Unfinished string at EOF at line %d, column %d", p->line, p->column);
+ parser_reset(p);
+ p->st = JV_PARSER_WAITING_FOR_RS;
+ return value;
+ }
+ if ((msg = check_literal(p))) {
+ value = make_error(p, "%s at EOF at line %d, column %d", msg, p->line, p->column);
+ parser_reset(p);
+ p->st = JV_PARSER_WAITING_FOR_RS;
+ return value;
+ }
+ if (((p->flags & JV_PARSE_STREAMING) && p->stacklen != 0) ||
+ (!(p->flags & JV_PARSE_STREAMING) && p->stackpos != 0)) {
+ value = make_error(p, "Unfinished JSON term at EOF at line %d, column %d", p->line, p->column);
+ parser_reset(p);
+ p->st = JV_PARSER_WAITING_FOR_RS;
+ return value;
}
// p->next is either invalid (nothing here, but no syntax error)
// or valid (this is the value). either way it's the thing to return
diff --git a/tests/run b/tests/run
index b213b565..0dc966f4 100755
--- a/tests/run
+++ b/tests/run
@@ -111,7 +111,6 @@ fi
## into tests/all.test
cat > $d/expected <<EOF
-ignoring parse error: Potentially truncated top-level numeric value at line 1, column 2
ignoring parse error: Truncated value at line 2, column 5
ignoring parse error: Truncated value at line 2, column 25
ignoring parse error: Truncated value at line 2, column 41
@@ -120,7 +119,6 @@ printf '1\0362 3\n[0,1\036[4,5]true"ab"{"c":4\036{}{"d":5,"e":6"\036false\n'|$VA
cmp $d/out $d/expected
cat > $d/expected <<EOF
-ignoring parse error: Potentially truncated top-level numeric value at line 1, column 2
ignoring parse error: Truncated value at line 2, column 5
ignoring parse error: Truncated value at line 2, column 25
ignoring parse error: Truncated value at line 3, column 1
@@ -131,21 +129,21 @@ cmp $d/out $d/expected
# Note that here jq sees no inputs at all but it still succeeds because
# --seq ignores parse errors
cat > $d/expected <<EOF
-ignoring parse error: Unfinished string at EOF at line 1, column 4
+ignoring parse error: Unfinished abandoned text at EOF at line 1, column 4
EOF
printf '"foo'|./jq -ce --seq . > $d/out 2>&1
cmp $d/out $d/expected
# Numeric values truncated by EOF are ignored
cat > $d/expected <<EOF
-ignoring parse error: Potentially truncated top-level numeric value at EOF at line 1, column 1
+ignoring parse error: Unfinished abandoned text at EOF at line 1, column 1
EOF
printf '1'|./jq -ce --seq . > $d/out 2>&1
cmp $d/out $d/expected
cat > $d/expected <<EOF
EOF
-printf '1\n'|./jq -ces --seq '. == [1]' >/dev/null 2> $d/out
+printf '1\n'|./jq -cen --seq '[inputs] == []' >/dev/null 2> $d/out
cmp $d/out $d/expected
## Test streaming parser