From d03893a2533bb10a60ff4409929eda0e21868b66 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Wed, 13 May 2026 11:23:45 +0700 Subject: [PATCH] Add munmap to solve leak --- src/mount/redox/resource.rs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/mount/redox/resource.rs b/src/mount/redox/resource.rs index 39c16f3cbc..edb30997e9 100644 --- a/src/mount/redox/resource.rs +++ b/src/mount/redox/resource.rs @@ -440,6 +440,14 @@ impl FileMmapInfo { pub fn in_use(&self) -> bool { self.open_fds > 0 || self.ranges.iter().any(|(_, fmap)| fmap.rc > 0) } + + pub fn stale(&self) -> bool { + // TODO: should this be any? + // TODO: stale by duration/memory pressure + self.ranges + .iter() + .all(|(_, fmap)| fmap.version != self.version) + } } impl Drop for FileMmapInfo { @@ -708,10 +716,16 @@ impl Resource for FileResource { // Notify filesystem of close tx.on_close_node(self.node_ptr)?; - /*TODO: leaks memory, but why? - // Remove from fmaps list - fmaps.remove(&self.node_ptr.id()); - */ + // if this fmap version is outdated it's no use + if fmap_info.stale() { + let fmap = fmaps + .remove(&self.node_ptr.id()) + .expect("fmap_info must exist"); + + if let Err(e) = unsafe { libredox::call::munmap(fmap.base as *mut _, fmap.size) } { + log::error!("Munmap error {e}"); + } + } } Ok(())