diff --git a/src/libos/src/fs/file_ops/dup.rs b/src/libos/src/fs/file_ops/dup.rs index 52bd9847..fc07a9eb 100644 --- a/src/libos/src/fs/file_ops/dup.rs +++ b/src/libos/src/fs/file_ops/dup.rs @@ -23,7 +23,10 @@ pub fn do_dup2(old_fd: FileDesc, new_fd: FileDesc) -> Result { } if old_fd != new_fd { - files.put_at(new_fd, file, false); + if let Some(old_file) = files.put_at(new_fd, file, false) { + // If the file descriptor `new_fd` was previously open, close it silently. + old_file.release_advisory_locks() + } } Ok(new_fd) } @@ -46,6 +49,9 @@ pub fn do_dup3(old_fd: FileDesc, new_fd: FileDesc, flags: u32) -> Result Option { let mut table = &mut self.table; let mut table_entry = Some(FileTableEntry::new(file, close_on_spawn)); if fd as usize >= table.len() { @@ -96,6 +96,7 @@ impl FileTable { if table_entry.is_none() { self.num_fds += 1; } + table_entry.map(|entry| entry.file.clone()) } pub fn fds(&self) -> Vec {