From ec7391468cf83e04d7e761a445d08e936801ae3c Mon Sep 17 00:00:00 2001 From: Marsman1996 Date: Wed, 21 Aug 2024 20:43:37 +0800 Subject: [PATCH] Fix panic in `from_which_and_id()` --- kernel/aster-nix/src/process/process_filter.rs | 11 ++++++----- kernel/aster-nix/src/syscall/waitid.rs | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/kernel/aster-nix/src/process/process_filter.rs b/kernel/aster-nix/src/process/process_filter.rs index 62329977a..9a8887741 100644 --- a/kernel/aster-nix/src/process/process_filter.rs +++ b/kernel/aster-nix/src/process/process_filter.rs @@ -14,14 +14,15 @@ pub enum ProcessFilter { impl ProcessFilter { // used for waitid - pub fn from_which_and_id(which: u64, id: u64) -> Self { + pub fn from_which_and_id(which: u64, id: u64) -> Result { // Does not support PID_FD now(which = 3) // https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/wait.h#L20 match which { - 0 => ProcessFilter::Any, - 1 => ProcessFilter::WithPid(id as Pid), - 2 => ProcessFilter::WithPgid(id as Pgid), - _ => panic!("Unknown id type"), + 0 => Ok(ProcessFilter::Any), + 1 => Ok(ProcessFilter::WithPid(id as Pid)), + 2 => Ok(ProcessFilter::WithPgid(id as Pgid)), + 3 => todo!(), + _ => return_errno_with_message!(Errno::EINVAL, "invalid which"), } } diff --git a/kernel/aster-nix/src/syscall/waitid.rs b/kernel/aster-nix/src/syscall/waitid.rs index ff85bfc92..f80a6dfe4 100644 --- a/kernel/aster-nix/src/syscall/waitid.rs +++ b/kernel/aster-nix/src/syscall/waitid.rs @@ -15,7 +15,7 @@ pub fn sys_waitid( _ctx: &Context, ) -> Result { // FIXME: what does infoq and rusage use for? - let process_filter = ProcessFilter::from_which_and_id(which, upid); + let process_filter = ProcessFilter::from_which_and_id(which, upid)?; let wait_options = WaitOptions::from_bits(options as u32).expect("Unknown wait options"); let waited_process = wait_child_exit(process_filter, wait_options)?; let pid = waited_process.map_or(0, |process| process.pid());