diff options
author | eadler <eadler@FreeBSD.org> | 2012-10-22 03:34:43 +0000 |
---|---|---|
committer | eadler <eadler@FreeBSD.org> | 2012-10-22 03:34:43 +0000 |
commit | f48bd672c6ce3205caee89a211bbf9e4dc081384 (patch) | |
tree | ca58d80237e63e97587bb433636e93d011a9094d /sys/kern/kern_sig.c | |
parent | 4bc19b04c5658de751c40ddf1399ab0dd1d895e7 (diff) | |
download | FreeBSD-src-f48bd672c6ce3205caee89a211bbf9e4dc081384.zip FreeBSD-src-f48bd672c6ce3205caee89a211bbf9e4dc081384.tar.gz |
Correct the killpg(2) return values:
Return EPERM if processes were found but they
were unable to be signaled.
Return the first error from p_cansignal if no signal was successful.
Reviewed by: jilles
Approved by: cperciva
MFC after: 1 week
Diffstat (limited to 'sys/kern/kern_sig.c')
-rw-r--r-- | sys/kern/kern_sig.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index 13848b6..ed2e0e9 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -1599,8 +1599,10 @@ killpg1(struct thread *td, int sig, int pgid, int all, ksiginfo_t *ksi) { struct proc *p; struct pgrp *pgrp; - int nfound = 0; + int err; + int ret; + ret = ESRCH; if (all) { /* * broadcast @@ -1613,11 +1615,14 @@ killpg1(struct thread *td, int sig, int pgid, int all, ksiginfo_t *ksi) PROC_UNLOCK(p); continue; } - if (p_cansignal(td, p, sig) == 0) { - nfound++; + err = p_cansignal(td, p, sig); + if (err == 0) { if (sig) pksignal(p, sig, ksi); + ret = err; } + else if (ret == ESRCH) + ret = err; PROC_UNLOCK(p); } sx_sunlock(&allproc_lock); @@ -1644,16 +1649,20 @@ killpg1(struct thread *td, int sig, int pgid, int all, ksiginfo_t *ksi) PROC_UNLOCK(p); continue; } - if (p_cansignal(td, p, sig) == 0) { - nfound++; + err = p_cansignal(td, p, sig); + if (err == 0) { if (sig) pksignal(p, sig, ksi); } + if (err == 0) + ret = err; + else if (ret == ESRCH) + ret = err; PROC_UNLOCK(p); } PGRP_UNLOCK(pgrp); } - return (nfound ? 0 : ESRCH); + return (ret); } #ifndef _SYS_SYSPROTO_H_ |