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
This commit is contained in:
parent
4bc19b04c5
commit
f48bd672c6
@ -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_
|
||||
|
Loading…
Reference in New Issue
Block a user