From e336882eee9d556480caafa267d097b7116c02c2 Mon Sep 17 00:00:00 2001 From: Wang Siyuan Date: Thu, 6 Nov 2025 11:31:41 +0000 Subject: [PATCH] Do not drop `Arc` in an incorrect context --- kernel/src/fs/procfs/pid/task/fd.rs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/kernel/src/fs/procfs/pid/task/fd.rs b/kernel/src/fs/procfs/pid/task/fd.rs index 10fc2bd03..5a9bb9abb 100644 --- a/kernel/src/fs/procfs/pid/task/fd.rs +++ b/kernel/src/fs/procfs/pid/task/fd.rs @@ -179,13 +179,14 @@ impl SymOps for FileSymOps { let thread = self.tid_dir_ops.thread(); let posix_thread = thread.as_posix_thread().unwrap(); - let file = if let Some(file_table) = posix_thread.file_table().lock().as_ref() - && let Ok(file) = file_table.read().get_file(self.file_desc) - { - file.clone() - } else { - return_errno_with_message!(Errno::ENOENT, "the file does not exist"); + let file_table = posix_thread.file_table().lock(); + let Some(file_table) = file_table.as_ref() else { + return_errno_with_message!(Errno::ENOENT, "the thread has exited"); }; + let file_table = file_table.read(); + let file = file_table + .get_file(self.file_desc) + .map_err(|_| Error::with_message(Errno::ENOENT, "the file does not exist"))?; let path_name = if let Some(inode_handle) = file.downcast_ref::() { inode_handle.path().abs_path() @@ -194,9 +195,6 @@ impl SymOps for FileSymOps { String::from("/dev/tty") }; - // FIXME: This may not always be a suitable context to drop a `FileLike` object. - drop(file); - Ok(path_name) } }