You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* Fix `rustix::fs::Dir` to avoid unbounded buffer growth.
Fix `Dir`'s buffer size computation to avoid resizing past a fixed
upper limit. This prevents it from growing without bound, such as in
the case of `Dir::rewind` for repeated iterations with the same `Dir`.
* Don't let `Dir` continue to try to iterate after a failure.
* Handle `io::Errno::INTR` gracefully.
* Write a more detailed comment on the buffer growth policy.
* Also mention that no buffer can ever be big enough for everything.
* Add tests against over-allocation & stuck iterator
* Rm `dir_iterator_does_not_overallocate` unit test in favour of docs
* Extend `test_dir` to cover `rewind`.
* Consistently handle directory removal as ending the stream.
libc implementations of directory iteration handle directory removal
by just ending the stream. In the linux_raw backend, this looks like
`ENOENT` from `getdents64`, so change the code to check for `ENOENT`
and end the stream.
This requires changing the `dir_iterator_does_not_get_stuck_on_io_error`
test to no longer expect a failure, so it's now renamed to
`dir_iterator_handles_dir_removal`.
To test the error case, add a new `dir_iterator_handles_io_errors`
test which uses `dup2` to induce an error, in both the linux_raw and
libc backends.
This exposes the fact that the libc `Dir` implementation was also
assuming that users would stop iterating after hitting a failure, so
add a `any_errors` flag to the libc backend as well.
* Add a test for removing the directory after doing `read_from`.
* In the libc backend, handle `ENOENT` when opening ".".
---------
Co-authored-by: cyqsimon <[email protected]>
0 commit comments