std.fs.File: fix discarding past end of file in positional mode #25232
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
std.Io.Reader.discardShort
will loop infinitely if the read position is at the end of the file.In
std/fs/File.zig
:zig/lib/std/fs/File.zig
Lines 1382 to 1390 in 32a1aab
on L1387, if
pos == size
thendelta == 0
, so the function will return 0. Then instd/Io/Reader.zig
zig/lib/std/Io/Reader.zig
Lines 605 to 622 in 32a1aab
on L615,
discard_len
will be 0, soremaining
will never decrement.A simple reproduction
zig run repro.zig
:There are probably multiple ways to address this, and I don't know if this is the best one, but I am reasonably confident that infinite looping is not the correct behavior here.