diff --git a/src/syscall/process.rs b/src/syscall/process.rs index 97776bfd1f0e98a5a9a39b7d04a01cae6f26573c..ce0aea213c5f0a4b17da7f16d825c1012957c22d 100644 --- a/src/syscall/process.rs +++ b/src/syscall/process.rs @@ -1050,7 +1050,7 @@ pub fn kill(pid: ContextId, sig: usize) -> Result<usize> { (context.ruid, context.euid, context.pgid) }; - if sig > 0 && sig < 0x7F { + if sig >= 0 && sig < 0x7F { let mut found = 0; let mut sent = 0; @@ -1062,11 +1062,15 @@ pub fn kill(pid: ContextId, sig: usize) -> Result<usize> { || euid == context.ruid || ruid == context.ruid { - context.pending.push_back(sig as u8); - // Convert stopped processes to blocked if sending SIGCONT - if sig == SIGCONT { - if let context::Status::Stopped(_sig) = context.status { - context.status = context::Status::Blocked; + // If sig = 0, test that process exists and can be + // signalled, but don't send any signal. + if sig != 0 { + context.pending.push_back(sig as u8); + // Convert stopped processes to blocked if sending SIGCONT + if sig == SIGCONT { + if let context::Status::Stopped(_sig) = context.status { + context.status = context::Status::Blocked; + } } } true