std.fs.File.Reader: fix wrong calculation when reading

This commit is contained in:
Andrew Kelley 2025-06-27 14:43:32 -07:00
parent 55d6341eab
commit bc9db143c9
4 changed files with 13 additions and 9 deletions

View File

@ -1083,7 +1083,7 @@ pub const Reader = struct {
return error.EndOfStream;
}
r.pos += n;
return w.advanceVector(n);
return n;
},
.streaming_reading => {
if (is_windows) {
@ -1106,7 +1106,7 @@ pub const Reader = struct {
return error.EndOfStream;
}
r.pos += n;
return w.advanceVector(n);
return n;
},
.failure => return error.ReadFailed,
}

View File

@ -701,9 +701,13 @@ pub const Reader = struct {
var hp: HeadParser = .{ .state = .seen_rn };
var trailers_len: usize = 2;
while (true) {
if (trailers_len >= in.buffer.len) return error.HttpHeadersOversize;
try in.fill(trailers_len + 1);
trailers_len += hp.feed(in.buffered()[trailers_len..]);
if (in.buffer.len - trailers_len == 0) return error.HttpHeadersOversize;
const remaining = in.buffered()[trailers_len..];
if (remaining.len == 0) {
try in.fillMore();
continue;
}
trailers_len += hp.feed(remaining);
if (hp.state == .finished) {
reader.state = .ready;
reader.trailers = in.buffered()[0..trailers_len];

View File

@ -942,7 +942,7 @@ pub fn fill(r: *Reader, n: usize) Error!void {
writer.end = r.end;
r.end += r.vtable.stream(r, &writer, .limited(r.buffer.len - r.end)) catch |err| switch (err) {
error.WriteFailed => unreachable,
else => |e| return e,
error.ReadFailed, error.EndOfStream => |e| return e,
};
}
}
@ -1168,9 +1168,9 @@ fn takeMultipleOf7Leb128(r: *Reader, comptime Result: type) TakeLeb128Error!Resu
/// Left-aligns data such that `r.seek` becomes zero.
pub fn rebase(r: *Reader) void {
if (r.seek == 0) return;
const data = r.buffer[r.seek..r.end];
const dest = r.buffer[0..data.len];
std.mem.copyForwards(u8, dest, data);
@memmove(r.buffer[0..data.len], data);
r.seek = 0;
r.end = data.len;
}

View File

@ -1943,7 +1943,7 @@ pub const Stream = struct {
else => |err| return windows.unexpectedWSAError(err),
};
if (n == 0) return error.EndOfStream;
return io_w.advanceVector(n);
return n;
}
},
else => struct {