diff options
| author | Ian Johnson <ian@ianjohnson.dev> | 2025-08-08 21:58:33 -0400 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2025-08-08 19:37:33 -0700 |
| commit | 14f11377cbcc4ff2da75e3dee9bb1d9e06013de1 (patch) | |
| tree | 17c2117dec8253562b47ec71ca04f0d3a97165f0 | |
| parent | df46ee61c4a853c0cf43007306bdc44e578d0702 (diff) | |
| download | zig-14f11377cbcc4ff2da75e3dee9bb1d9e06013de1.tar.gz zig-14f11377cbcc4ff2da75e3dee9bb1d9e06013de1.zip | |
Fetch.git: fix FetchStream packet reading
Progress towards #24732
| -rw-r--r-- | src/Package/Fetch/git.zig | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/Package/Fetch/git.zig b/src/Package/Fetch/git.zig index 03d29655d7..bc5a3efffe 100644 --- a/src/Package/Fetch/git.zig +++ b/src/Package/Fetch/git.zig @@ -595,6 +595,17 @@ pub const Packet = union(enum) { /// Reads a packet in pkt-line format. fn read(reader: *std.Io.Reader) !Packet { + const packet: Packet = try .peek(reader); + switch (packet) { + .data => |data| reader.toss(data.len), + else => {}, + } + return packet; + } + + /// Consumes the header of a pkt-line packet and reads any associated data + /// into the reader's buffer, but does not consume the data. + fn peek(reader: *std.Io.Reader) !Packet { const length = std.fmt.parseUnsigned(u16, try reader.take(4), 16) catch return error.InvalidPacket; switch (length) { 0 => return .flush, @@ -603,7 +614,7 @@ pub const Packet = union(enum) { 3 => return error.InvalidPacket, else => if (length - 4 > max_data_length) return error.InvalidPacket, } - return .{ .data = try reader.take(length - 4) }; + return .{ .data = try reader.peek(length - 4) }; } /// Writes a packet in pkt-line format. @@ -1088,15 +1099,15 @@ pub const Session = struct { const input = fs.input; if (fs.remaining_len == 0) { while (true) { - switch (Packet.read(input) catch |err| { + switch (Packet.peek(input) catch |err| { fs.err = err; return error.ReadFailed; }) { .flush => return error.EndOfStream, .data => |data| if (data.len > 1) switch (@as(StreamCode, @enumFromInt(data[0]))) { .pack_data => { - try input.discardAll(1); - fs.remaining_len = data.len; + input.toss(1); + fs.remaining_len = data.len - 1; break; }, .fatal_error => { |
