Commit 5496901e71

Andrew Kelley <andrew@ziglang.org>
2025-07-11 19:03:54
std.Io.Reader.appendRemaining: add missing assert
1 parent 093fe02
Changed files (2)
lib
std
lib/std/Build/Cache.zig
@@ -661,7 +661,8 @@ pub const Manifest = struct {
     } {
         const gpa = self.cache.gpa;
         const input_file_count = self.files.entries.len;
-        var manifest_reader = self.manifest_file.?.reader(&.{}); // Reads positionally from zero.
+        var tiny_buffer: [1]u8 = undefined; // allows allocRemaining to detect limit exceeded
+        var manifest_reader = self.manifest_file.?.reader(&tiny_buffer); // Reads positionally from zero.
         const limit: std.io.Limit = .limited(manifest_file_size_max);
         const file_contents = manifest_reader.interface.allocRemaining(gpa, limit) catch |err| switch (err) {
             error.OutOfMemory => return error.OutOfMemory,
lib/std/Io/Reader.zig
@@ -245,6 +245,7 @@ pub fn appendRemaining(
     list: *std.ArrayListAlignedUnmanaged(u8, alignment),
     limit: Limit,
 ) LimitedAllocError!void {
+    assert(r.buffer.len != 0); // Needed to detect limit exceeded without losing data.
     const buffer = r.buffer;
     const buffer_contents = buffer[r.seek..r.end];
     const copy_len = limit.minInt(buffer_contents.len);
@@ -1657,11 +1658,12 @@ test "readAlloc when the backing reader provides one byte at a time" {
         }
     };
     const str = "This is a test";
+    var tiny_buffer: [1]u8 = undefined;
     var one_byte_stream: OneByteReader = .{
         .str = str,
         .i = 0,
         .reader = .{
-            .buffer = &.{},
+            .buffer = &tiny_buffer,
             .vtable = &.{ .stream = OneByteReader.stream },
             .seek = 0,
             .end = 0,