From cf126baeb5472f83c7eaf676d3259cc6c3b0f458 Mon Sep 17 00:00:00 2001 From: Daniel Wennberg Date: Fri, 7 Nov 2025 20:29:16 -0800 Subject: [PATCH] Check that file reader has capacity before priming --- src/cli/args.zig | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/cli/args.zig b/src/cli/args.zig index a34560b78..76026fbf2 100644 --- a/src/cli/args.zig +++ b/src/cli/args.zig @@ -1427,7 +1427,12 @@ pub const LineIterator = struct { // // This will also optimize reads down the line as we're // more likely to beworking with buffered data. - self.r.fillMore() catch {}; + // + // fillMore asserts that the buffer has available capacity, + // so skip this if it's full. + if (self.r.bufferedLen() < self.r.buffer.len) { + self.r.fillMore() catch {}; + } var writer: std.Io.Writer = .fixed(self.entry[2..]); @@ -1590,3 +1595,33 @@ test "LineIterator with CRLF line endings" { try testing.expectEqual(@as(?[]const u8, null), iter.next()); try testing.expectEqual(@as(?[]const u8, null), iter.next()); } + +test "LineIterator with buffered reader" { + const testing = std.testing; + var f: std.Io.Reader = .fixed("A\nB = C\n"); + var buf: [2]u8 = undefined; + var r = f.limited(.unlimited, &buf); + const reader = &r.interface; + + var iter: LineIterator = .init(reader); + try testing.expectEqualStrings("--A", iter.next().?); + try testing.expectEqualStrings("--B=C", iter.next().?); + try testing.expectEqual(@as(?[]const u8, null), iter.next()); + try testing.expectEqual(@as(?[]const u8, null), iter.next()); +} + +test "LineIterator with buffered and primed reader" { + const testing = std.testing; + var f: std.Io.Reader = .fixed("A\nB = C\n"); + var buf: [2]u8 = undefined; + var r = f.limited(.unlimited, &buf); + const reader = &r.interface; + + try reader.fill(buf.len); + + var iter: LineIterator = .init(reader); + try testing.expectEqualStrings("--A", iter.next().?); + try testing.expectEqualStrings("--B=C", iter.next().?); + try testing.expectEqual(@as(?[]const u8, null), iter.next()); + try testing.expectEqual(@as(?[]const u8, null), iter.next()); +}