From 6a9db19eb786b51cf1aea232ae7af72b35ac834a Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 15 Aug 2020 21:41:31 +0200 Subject: Fix EOF and null byte handling This is a bit questionable, but the null byte support is needed for streaming over a socket where some delimiter is required. This caused a bug where serdi would hang forever on corrupt files that contain a null byte. Fix this by consuming the byte, but otherwise behaving as before. --- src/n3.c | 9 ++++++--- tests/bad/bad-null-byte.ttl | Bin 0 -> 27 bytes tests/bad/manifest.ttl | 6 ++++++ 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 tests/bad/bad-null-byte.ttl diff --git a/src/n3.c b/src/n3.c index fad12070..906a0ac4 100644 --- a/src/n3.c +++ b/src/n3.c @@ -1063,7 +1063,7 @@ read_object(SerdReader* reader, ReadContext* ctx, bool emit, bool* ate_dot) } } switch (c) { - case EOF: case '\0': case ')': + case EOF: case ')': return r_err(reader, SERD_ERR_BAD_SYNTAX, "expected object\n"); case '[': simple = false; @@ -1166,7 +1166,7 @@ read_predicateObjectList(SerdReader* reader, ReadContext ctx, bool* ate_dot) do { read_ws_star(reader); switch (c = peek_byte(reader)) { - case EOF: case '\0': + case EOF: return r_err(reader, SERD_ERR_BAD_SYNTAX, "unexpected end of file\n"); case '.': case ']': case '}': @@ -1471,7 +1471,10 @@ read_n3_statement(SerdReader* reader) SerdStatus st = SERD_SUCCESS; read_ws_star(reader); switch (peek_byte(reader)) { - case EOF: case '\0': + case '\0': + eat_byte_safe(reader, '\0'); + return SERD_FAILURE; + case EOF: return SERD_FAILURE; case '@': if (!fancy_syntax(reader)) { diff --git a/tests/bad/bad-null-byte.ttl b/tests/bad/bad-null-byte.ttl new file mode 100644 index 00000000..4f2cb404 Binary files /dev/null and b/tests/bad/bad-null-byte.ttl differ diff --git a/tests/bad/manifest.ttl b/tests/bad/manifest.ttl index 57fb02f7..2c103a84 100644 --- a/tests/bad/manifest.ttl +++ b/tests/bad/manifest.ttl @@ -59,6 +59,7 @@ <#bad-misspelled-prefix> <#bad-namespace> <#bad-ns> + <#bad-null-byte> <#bad-num> <#bad-object2> <#bad-object> @@ -337,6 +338,11 @@ mf:name "bad-ns" ; mf:action . +<#bad-null-byte> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-null-byte" ; + mf:action . + <#bad-num> rdf:type rdft:TestTurtleNegativeSyntax ; mf:name "bad-num" ; -- cgit v1.2.1