summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_sig.c
diff options
context:
space:
mode:
authoreadler <eadler@FreeBSD.org>2012-10-22 03:34:43 +0000
committereadler <eadler@FreeBSD.org>2012-10-22 03:34:43 +0000
commitf48bd672c6ce3205caee89a211bbf9e4dc081384 (patch)
treeca58d80237e63e97587bb433636e93d011a9094d /sys/kern/kern_sig.c
parent4bc19b04c5658de751c40ddf1399ab0dd1d895e7 (diff)
downloadFreeBSD-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.c21
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_
OpenPOWER on IntegriCloud