From a45578925cd1575d3f4356c468f063cc210cb034 Mon Sep 17 00:00:00 2001 From: Jamison Miller Date: Wed, 13 May 2026 10:59:19 +0200 Subject: [PATCH] fix(decoder): reject negative array lengths in parse_header MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Python's int() accepts negative integers without error, so a TOON document declaring a negative array length (e.g. `arr[-1]:`) would be silently parsed as a negative length. Downstream consumers then iterate with expected_length < 0, which either has no effect (empty loop) or produces a confusing strict-mode mismatch error rather than a clear parse failure. Add an explicit `length < 0` guard after the int() conversion so that negative lengths return None (treated as non-header by callers), matching the TypeScript reference implementation's behaviour after toon-format/toon#302. Note: a related bug — trailing delimiters producing a spurious empty final element in parse_delimited_values — also exists in this codebase and will be addressed in a follow-up issue once the expected behaviour for edge cases (empty input, lone delimiter) is confirmed against the spec fixtures. Co-Authored-By: Claude Sonnet 4.6 --- src/toon_format/decoder.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/toon_format/decoder.py b/src/toon_format/decoder.py index 90f0849..26f33e8 100644 --- a/src/toon_format/decoder.py +++ b/src/toon_format/decoder.py @@ -156,12 +156,15 @@ def parse_header( delimiter = COMMA length_str = bracket_content[:-1] - # Parse length + # Parse length - reject non-integer strings (negative values are invalid) try: length = int(length_str) except ValueError: return None + if length < 0: + return None + # Check for fields segment fields = None after_bracket = line[bracket_end + 1 :].strip()