authorgravatar for ian@ianjohnson.devIan Johnson <ian@ianjohnson.dev> 2025-08-08 21:58:33-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-08 19:37:33-07:00
log14f11377cbcc4ff2da75e3dee9bb1d9e06013de1
tree17c2117dec8253562b47ec71ca04f0d3a97165f0
parentdf46ee61c4a853c0cf43007306bdc44e578d0702

Fetch.git: fix FetchStream packet reading

Progress towards #24732

1 files changed, 15 insertions(+), 4 deletions(-)

src/Package/Fetch/git.zig+15-4
...@@ -595,6 +595,17 @@ pub const Packet = union(enum) {...@@ -595,6 +595,17 @@ pub const Packet = union(enum) {
595595
596 /// Reads a packet in pkt-line format.596 /// Reads a packet in pkt-line format.
597 fn read(reader: *std.Io.Reader) !Packet {597 fn read(reader: *std.Io.Reader) !Packet {
598 const packet: Packet = try .peek(reader);
599 switch (packet) {
600 .data => |data| reader.toss(data.len),
601 else => {},
602 }
603 return packet;
604 }
605
606 /// Consumes the header of a pkt-line packet and reads any associated data
607 /// into the reader's buffer, but does not consume the data.
608 fn peek(reader: *std.Io.Reader) !Packet {
598 const length = std.fmt.parseUnsigned(u16, try reader.take(4), 16) catch return error.InvalidPacket;609 const length = std.fmt.parseUnsigned(u16, try reader.take(4), 16) catch return error.InvalidPacket;
599 switch (length) {610 switch (length) {
600 0 => return .flush,611 0 => return .flush,
...@@ -603,7 +614,7 @@ pub const Packet = union(enum) {...@@ -603,7 +614,7 @@ pub const Packet = union(enum) {
603 3 => return error.InvalidPacket,614 3 => return error.InvalidPacket,
604 else => if (length - 4 > max_data_length) return error.InvalidPacket,615 else => if (length - 4 > max_data_length) return error.InvalidPacket,
605 }616 }
606 return .{ .data = try reader.take(length - 4) };617 return .{ .data = try reader.peek(length - 4) };
607 }618 }
608619
609 /// Writes a packet in pkt-line format.620 /// Writes a packet in pkt-line format.
...@@ -1088,15 +1099,15 @@ pub const Session = struct {...@@ -1088,15 +1099,15 @@ pub const Session = struct {
1088 const input = fs.input;1099 const input = fs.input;
1089 if (fs.remaining_len == 0) {1100 if (fs.remaining_len == 0) {
1090 while (true) {1101 while (true) {
1091 switch (Packet.read(input) catch |err| {1102 switch (Packet.peek(input) catch |err| {
1092 fs.err = err;1103 fs.err = err;
1093 return error.ReadFailed;1104 return error.ReadFailed;
1094 }) {1105 }) {
1095 .flush => return error.EndOfStream,1106 .flush => return error.EndOfStream,
1096 .data => |data| if (data.len > 1) switch (@as(StreamCode, @enumFromInt(data[0]))) {1107 .data => |data| if (data.len > 1) switch (@as(StreamCode, @enumFromInt(data[0]))) {
1097 .pack_data => {1108 .pack_data => {
1098 try input.discardAll(1);1109 input.toss(1);
1099 fs.remaining_len = data.len;1110 fs.remaining_len = data.len - 1;
1100 break;1111 break;
1101 },1112 },
1102 .fatal_error => {1113 .fatal_error => {