From b4575711c71a92986aeb4c363072f72d5859a144 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Sat, 2 Feb 2019 08:11:07 -0700 Subject: [PATCH] Fix logic error when cloning file descriptor in user scheme fmap --- src/scheme/user.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/scheme/user.rs b/src/scheme/user.rs index df1c556..cb410ca 100644 --- a/src/scheme/user.rs +++ b/src/scheme/user.rs @@ -317,9 +317,22 @@ impl Scheme for UserScheme { let contexts = context::contexts(); let context_lock = contexts.current().ok_or(Error::new(ESRCH))?; let context = context_lock.read(); - let desc = context.get_file(FileHandle(file)) - .ok_or(Error::new(EBADF))? - .clone(); + // TODO: Faster, cleaner mechanism to get descriptor + let scheme = inner.scheme_id.load(Ordering::SeqCst); + let mut desc_res = Err(Error::new(EBADF)); + for context_file_opt in context.files.lock().iter() { + if let Some(context_file) = context_file_opt { + let (context_scheme, context_number) = { + let desc = context_file.description.read(); + (desc.scheme, desc.number) + }; + if context_scheme == scheme && context_number == file { + desc_res = Ok(context_file.clone()); + break; + } + } + } + let desc = desc_res?; (context.id, context.euid, context.egid, Arc::downgrade(&context_lock), desc) };