about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTomoaki Kawada <kawada@kmckk.co.jp>2022-10-13 14:16:12 +0900
committerTomoaki Kawada <kawada@kmckk.co.jp>2022-10-13 15:10:23 +0900
commit76bec177bca25a35aa55a364bb8d2d66e0d5d45e (patch)
treebfe2eba8c606c1d4686862c9431d5fdcdb9c5d65
parent2a9217601c0e5ae83fa8bca6797137a6d2f7e4e5 (diff)
downloadrust-76bec177bca25a35aa55a364bb8d2d66e0d5d45e.tar.gz
rust-76bec177bca25a35aa55a364bb8d2d66e0d5d45e.zip
kmc-solid: Handle errors returned by `SOLID_FS_ReadDir`
-rw-r--r--library/std/src/sys/solid/fs.rs20
1 files changed, 12 insertions, 8 deletions
diff --git a/library/std/src/sys/solid/fs.rs b/library/std/src/sys/solid/fs.rs
index 9692222534e..6c66b93a3e1 100644
--- a/library/std/src/sys/solid/fs.rs
+++ b/library/std/src/sys/solid/fs.rs
@@ -175,15 +175,19 @@ impl Iterator for ReadDir {
     type Item = io::Result<DirEntry>;
 
     fn next(&mut self) -> Option<io::Result<DirEntry>> {
-        unsafe {
-            let mut out_dirent = MaybeUninit::uninit();
-            error::SolidError::err_if_negative(abi::SOLID_FS_ReadDir(
+        let entry = unsafe {
+            let mut out_entry = MaybeUninit::uninit();
+            match error::SolidError::err_if_negative(abi::SOLID_FS_ReadDir(
                 self.inner.dirp,
-                out_dirent.as_mut_ptr(),
-            ))
-            .ok()?;
-            Some(Ok(DirEntry { entry: out_dirent.assume_init(), inner: Arc::clone(&self.inner) }))
-        }
+                out_entry.as_mut_ptr(),
+            )) {
+                Ok(_) => out_entry.assume_init(),
+                Err(e) if e.as_raw() == abi::SOLID_ERR_NOTFOUND => return None,
+                Err(e) => return Some(Err(e.as_io_error())),
+            }
+        };
+
+        (entry.d_name[0] != 0).then(|| Ok(DirEntry { entry, inner: Arc::clone(&self.inner) }))
     }
 }