From 36d79738ccc8356bfdeac06622ea4e49ed30adcd Mon Sep 17 00:00:00 2001 From: Aleksandr Trukhin Date: Mon, 10 Oct 2022 22:52:03 +0300 Subject: [PATCH] Fix dir iterator in case of an error. Do not resize internal buffer on error, otherwise iterator gets stuck in infinite loop with zeroed `dirent`s after the first error. Correct behavior is to return error indefinitely if it persists. Error can be ENOENT if the directory is unlinked while iterating, for example. Signed-off-by: Aleksandr Trukhin --- src/backend/linux_raw/fs/dir.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/backend/linux_raw/fs/dir.rs b/src/backend/linux_raw/fs/dir.rs index 359f0afe..cfa347d0 100644 --- a/src/backend/linux_raw/fs/dir.rs +++ b/src/backend/linux_raw/fs/dir.rs @@ -136,15 +136,19 @@ impl Dir { } fn read_more(&mut self) -> Option> { + let og_len = self.buf.len(); // Capacity increment currently chosen by wild guess. self.buf .resize(self.buf.capacity() + 32 * size_of::(), 0); - self.pos = 0; let nread = match crate::backend::fs::syscalls::getdents(self.fd.as_fd(), &mut self.buf) { Ok(nread) => nread, - Err(err) => return Some(Err(err)), + Err(err) => { + self.buf.resize(og_len, 0); + return Some(Err(err)); + } }; self.buf.resize(nread, 0); + self.pos = 0; if nread == 0 { None } else {