From bd158e4e74ad556351a59f5c52375c738234c975 Mon Sep 17 00:00:00 2001 From: Jiajie Chen Date: Tue, 30 Apr 2019 17:10:35 +0800 Subject: [PATCH] Do not panic when exec file is invalid --- kernel/src/shell.rs | 9 +++------ kernel/src/syscall/proc.rs | 28 +++++++++++++++++----------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/kernel/src/shell.rs b/kernel/src/shell.rs index 57bf14c..84c4367 100644 --- a/kernel/src/shell.rs +++ b/kernel/src/shell.rs @@ -30,12 +30,9 @@ pub fn add_user_shell() { let init_args = vec!["busybox".into(), "ash".into()]; if let Ok(inode) = ROOT_INODE.lookup(init_shell) { - processor().manager().add(Thread::new_user( - &inode, - init_shell, - init_args, - init_envs, - )); + processor() + .manager() + .add(Thread::new_user(&inode, init_shell, init_args, init_envs)); } else { processor().manager().add(Thread::new_kernel(shell, 0)); } diff --git a/kernel/src/syscall/proc.rs b/kernel/src/syscall/proc.rs index 7fc1f47..4cb982f 100644 --- a/kernel/src/syscall/proc.rs +++ b/kernel/src/syscall/proc.rs @@ -174,19 +174,25 @@ pub fn sys_exec( let inode = proc.lookup_inode(&path)?; // Make new Thread - let (mut vm, entry_addr, ustack_top) = Thread::new_user_vm(&inode, &path, args, envs).unwrap(); - - // Activate new page table - core::mem::swap(&mut proc.vm, &mut vm); - unsafe { - proc.vm.activate(); - } + match Thread::new_user_vm(&inode, &path, args, envs) { + Ok((mut vm, entry_addr, ustack_top)) => { + // Activate new page table + core::mem::swap(&mut proc.vm, &mut vm); + unsafe { + proc.vm.activate(); + } - // Modify the TrapFrame - *tf = TrapFrame::new_user_thread(entry_addr, ustack_top); + // Modify the TrapFrame + *tf = TrapFrame::new_user_thread(entry_addr, ustack_top); - info!("exec:END: path: {:?}", path); - Ok(0) + info!("exec:END: path: {:?}", path); + Ok(0) + } + Err(err) => { + info!("exec failed with {}", err); + Err(SysError::EINVAL) + } + } } pub fn sys_yield() -> SysResult {