diff --git a/src/syscall/process.rs b/src/syscall/process.rs
index 6582705e2a83e74d40ac6a2ef733ea713552a118..fe87701db8184925aaf5471f43e4683af59000a4 100644
--- a/src/syscall/process.rs
+++ b/src/syscall/process.rs
@@ -601,7 +601,7 @@ pub fn exec(path: &[u8], arg_ptrs: &[[usize; 2]]) -> Result<usize> {
                 drop(path); // Drop so that usage is not allowed after unmapping context
                 drop(arg_ptrs); // Drop so that usage is not allowed after unmapping context
 
-                let (vfork, ppid) = {
+                let (vfork, ppid, files) = {
                     let contexts = context::contexts();
                     let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
                     let mut context = context_lock.write();
@@ -773,21 +773,23 @@ pub fn exec(path: &[u8], arg_ptrs: &[[usize; 2]]) -> Result<usize> {
                     let vfork = context.vfork;
                     context.vfork = false;
 
-                    for (fd, file_option) in context.files.lock().iter_mut().enumerate() {
-                        let mut cloexec = false;
-                        if let Some(ref file) = *file_option {
-                            if file.cloexec {
-                                cloexec = true;
-                            }
-                        }
+                    let files = Arc::clone(&context.files);
+
+                    (vfork, context.ppid, files)
+                };
 
-                        if cloexec {
-                            let _ = file_option.take().unwrap().close(FileHandle::from(fd));
+                for (fd, file_option) in files.lock().iter_mut().enumerate() {
+                    let mut cloexec = false;
+                    if let Some(ref file) = *file_option {
+                        if file.cloexec {
+                            cloexec = true;
                         }
                     }
 
-                    (vfork, context.ppid)
-                };
+                    if cloexec {
+                        let _ = file_option.take().unwrap().close(FileHandle::from(fd));
+                    }
+                }
 
                 if vfork {
                     let contexts = context::contexts();