diff options
author | David Robillard <d@drobilla.net> | 2025-01-30 14:36:04 -0500 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2025-01-30 15:51:01 -0500 |
commit | c6cb174e7085cd2a41ed0ab74bbcbd7963e68d9d (patch) | |
tree | d8c7ae3f1de156f95bbc5c2fc06d527f3dc446b3 /src/n3.c | |
parent | e7a120cddc8a72cfcc264c4cd83a0911d352e0a2 (diff) | |
download | serd-c6cb174e7085cd2a41ed0ab74bbcbd7963e68d9d.tar.gz serd-c6cb174e7085cd2a41ed0ab74bbcbd7963e68d9d.tar.bz2 serd-c6cb174e7085cd2a41ed0ab74bbcbd7963e68d9d.zip |
Fix handling of some invalid EOF cases in lax mode
The return status of these tests unfortunately isn't consistent, so instead of
testing for an exact exit status, instead check that the return status doesn't
seem to be an abort() or other signal code (which are negative on Linux, while
serdi itself never exits with a negative status).
Diffstat (limited to 'src/n3.c')
-rw-r--r-- | src/n3.c | 12 |
1 files changed, 6 insertions, 6 deletions
@@ -354,11 +354,11 @@ read_STRING_LITERAL_LONG(SerdReader* const reader, push_byte(reader, ref, c); st = read_character(reader, ref, flags, (uint8_t)q2); } - } else if (c == EOF) { - st = r_err(reader, SERD_ERR_BAD_SYNTAX, "end of file in long string\n"); - } else { + } else if (c > 0) { st = read_character(reader, ref, flags, (uint8_t)eat_byte_safe(reader, c)); + } else { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "end of file in long string\n"); } } @@ -735,7 +735,9 @@ read_IRIREF(SerdReader* const reader, Ref* const dest) reader, SERD_ERR_BAD_SYNTAX, "invalid IRI character '%c'\n", c); default: - if (c <= 0x20) { + if (c <= 0) { + st = r_err(reader, SERD_ERR_BAD_SYNTAX, "unexpected end of file\n"); + } else if (c <= 0x20) { st = r_err(reader, SERD_ERR_BAD_SYNTAX, "invalid IRI character (escape %%%02X)\n", @@ -743,8 +745,6 @@ read_IRIREF(SerdReader* const reader, Ref* const dest) if (!reader->strict) { st = SERD_FAILURE; push_byte(reader, *dest, c); - } else { - break; } } else if (!(c & 0x80)) { push_byte(reader, *dest, c); |