Submit #2574 ยป 0002-kernel-change-proc_token-by-per-process-token-to-pro.patch
| sys/kern/kern_prot.c | ||
|---|---|---|
|
/*
|
||
|
* Get process group ID; note that POSIX getpgrp takes no parameter
|
||
|
*
|
||
|
* MPSAFE XXX pgrp
|
||
|
* MPSAFE
|
||
|
*/
|
||
|
int
|
||
|
sys_getpgrp(struct getpgrp_args *uap)
|
||
|
{
|
||
|
struct proc *p = curproc;
|
||
|
/*
|
||
|
* hold p_token to protect p_pgrp, because p_pgrp can be NULL
|
||
|
* if we race setpgid
|
||
|
*/
|
||
|
lwkt_gettoken_shared(&p->p_token);
|
||
|
uap->sysmsg_result = p->p_pgrp->pg_id;
|
||
|
lwkt_reltoken(&p->p_token);
|
||
|
return (0);
|
||
|
}
|
||
| ... | ... | |
|
if (pt == NULL)
|
||
|
error = ESRCH;
|
||
|
}
|
||
|
/* XXX MPSAFE on pgrp? */
|
||
|
if (error == 0)
|
||
|
if (error == 0) {
|
||
|
lwkt_gettoken_shared(&pt->p_token);
|
||
|
uap->sysmsg_result = pt->p_pgrp->pg_id;
|
||
|
lwkt_reltoken(&pt->p_token);
|
||
|
}
|
||
|
if (pt)
|
||
|
PRELE(pt);
|
||
|
return (error);
|
||
| ... | ... | |
|
uid_t uid;
|
||
|
int error;
|
||
|
lwkt_gettoken(&proc_token);
|
||
|
lwkt_gettoken(&p->p_token);
|
||
|
cr = p->p_ucred;
|
||
|
/*
|
||
| ... | ... | |
|
}
|
||
|
error = 0;
|
||
|
done:
|
||
|
lwkt_reltoken(&proc_token);
|
||
|
lwkt_reltoken(&p->p_token);
|
||
|
return (error);
|
||
|
}
|
||
| ... | ... | |
|
uid_t euid;
|
||
|
int error;
|
||
|
lwkt_gettoken(&proc_token);
|
||
|
lwkt_gettoken(&p->p_token);
|
||
|
cr = p->p_ucred;
|
||
|
euid = uap->euid;
|
||
|
if (euid != cr->cr_ruid && /* allow seteuid(getuid()) */
|
||
| ... | ... | |
|
change_euid(euid);
|
||
|
setsugid();
|
||
|
}
|
||
|
lwkt_reltoken(&proc_token);
|
||
|
lwkt_reltoken(&p->p_token);
|
||
|
return (0);
|
||
|
}
|
||
| ... | ... | |
|
gid_t gid;
|
||
|
int error;
|
||
|
lwkt_gettoken(&proc_token);
|
||
|
lwkt_gettoken(&p->p_token);
|
||
|
cr = p->p_ucred;
|
||
|
/*
|
||
| ... | ... | |
|
}
|
||
|
error = 0;
|
||
|
done:
|
||
|
lwkt_reltoken(&proc_token);
|
||
|
lwkt_reltoken(&p->p_token);
|
||
|
return (error);
|
||
|
}
|
||
| ... | ... | |
|
gid_t egid;
|
||
|
int error;
|
||
|
lwkt_gettoken(&proc_token);
|
||
|
lwkt_gettoken(&p->p_token);
|
||
|
cr = p->p_ucred;
|
||
|
egid = uap->egid;
|
||
|
if (egid != cr->cr_rgid && /* allow setegid(getgid()) */
|
||
| ... | ... | |
|
}
|
||
|
error = 0;
|
||
|
done:
|
||
|
lwkt_reltoken(&proc_token);
|
||
|
lwkt_reltoken(&p->p_token);
|
||
|
return (error);
|
||
|
}
|
||
| ... | ... | |
|
u_int ngrp;
|
||
|
int error;
|
||
|
lwkt_gettoken(&proc_token);
|
||
|
lwkt_gettoken(&p->p_token);
|
||
|
cr = p->p_ucred;
|
||
|
if ((error = priv_check_cred(cr, PRIV_CRED_SETGROUPS, 0)))
|
||
| ... | ... | |
|
setsugid();
|
||
|
error = 0;
|
||
|
done:
|
||
|
lwkt_reltoken(&proc_token);
|
||
|
lwkt_reltoken(&p->p_token);
|
||
|
return (error);
|
||
|
}
|
||
| ... | ... | |
|
uid_t ruid, euid;
|
||
|
int error;
|
||
|
lwkt_gettoken(&proc_token);
|
||
|
lwkt_gettoken(&p->p_token);
|
||
|
cr = p->p_ucred;
|
||
|
ruid = uap->ruid;
|
||
| ... | ... | |
|
}
|
||
|
error = 0;
|
||
|
done:
|
||
|
lwkt_reltoken(&proc_token);
|
||
|
lwkt_reltoken(&p->p_token);
|
||
|
return (error);
|
||
|
}
|
||
| ... | ... | |
|
gid_t rgid, egid;
|
||
|
int error;
|
||
|
lwkt_gettoken(&proc_token);
|
||
|
lwkt_gettoken(&p->p_token);
|
||
|
cr = p->p_ucred;
|
||
|
rgid = uap->rgid;
|
||
| ... | ... | |
|
}
|
||
|
error = 0;
|
||
|
done:
|
||
|
lwkt_reltoken(&proc_token);
|
||
|
lwkt_reltoken(&p->p_token);
|
||
|
return (error);
|
||
|
}
|
||
| ... | ... | |
|
uid_t ruid, euid, suid;
|
||
|
int error;
|
||
|
lwkt_gettoken(&proc_token);
|
||
|
lwkt_gettoken(&p->p_token);
|
||
|
cr = p->p_ucred;
|
||
|
ruid = uap->ruid;
|
||
| ... | ... | |
|
}
|
||
|
error = 0;
|
||
|
done:
|
||
|
lwkt_reltoken(&proc_token);
|
||
|
lwkt_reltoken(&p->p_token);
|
||
|
return (error);
|
||
|
}
|
||
| ... | ... | |
|
gid_t rgid, egid, sgid;
|
||
|
int error;
|
||
|
lwkt_gettoken(&proc_token);
|
||
|
lwkt_gettoken(&p->p_token);
|
||
|
cr = p->p_ucred;
|
||
|
rgid = uap->rgid;
|
||
|
egid = uap->egid;
|
||
| ... | ... | |
|
}
|
||
|
error = 0;
|
||
|
done:
|
||
|
lwkt_reltoken(&proc_token);
|
||
|
lwkt_reltoken(&p->p_token);
|
||
|
return (error);
|
||
|
}
|
||
| ... | ... | |
|
struct proc *p = curproc;
|
||
|
struct ucred *cr;
|
||
|
int error1 = 0, error2 = 0, error3 = 0;
|
||
|
|
||
|
lwkt_gettoken_shared(&p->p_token);
|
||
|
cr = crhold(p->p_ucred);
|
||
|
lwkt_reltoken(&p->p_token);
|
||
|
lwkt_gettoken(&proc_token);
|
||
|
cr = p->p_ucred;
|
||
|
if (uap->ruid)
|
||
|
error1 = copyout((caddr_t)&cr->cr_ruid,
|
||
|
(caddr_t)uap->ruid, sizeof(cr->cr_ruid));
|
||
| ... | ... | |
|
if (uap->suid)
|
||
|
error3 = copyout((caddr_t)&cr->cr_svuid,
|
||
|
(caddr_t)uap->suid, sizeof(cr->cr_svuid));
|
||
|
lwkt_reltoken(&proc_token);
|
||
|
crfree(cr);
|
||
|
return error1 ? error1 : (error2 ? error2 : error3);
|
||
|
}
|
||
| ... | ... | |
|
sys_getresgid(struct getresgid_args *uap)
|
||
|
{
|
||
|
struct ucred *cr;
|
||
|
struct proc *p = curproc;
|
||
|
int error1 = 0, error2 = 0, error3 = 0;
|
||
|
cr = curthread->td_ucred;
|
||
|
lwkt_gettoken_shared(&p->p_token);
|
||
|
cr = p->p_ucred;
|
||
|
crhold(cr);
|
||
|
lwkt_reltoken(&p->p_token);
|
||
|
if (uap->rgid)
|
||
|
error1 = copyout(&cr->cr_rgid, uap->rgid,
|
||
|
sizeof(cr->cr_rgid));
|
||
| ... | ... | |
|
if (uap->sgid)
|
||
|
error3 = copyout(&cr->cr_svgid, uap->sgid,
|
||
|
sizeof(cr->cr_svgid));
|
||
|
crfree(cr);
|
||
|
return error1 ? error1 : (error2 ? error2 : error3);
|
||
|
}
|
||
| ... | ... | |
|
if (uap->namelen > MAXLOGNAME) /* namelen is unsigned */
|
||
|
uap->namelen = MAXLOGNAME;
|
||
|
bzero(buf, sizeof(buf));
|
||
|
lwkt_gettoken(&proc_token);
|
||
|
lwkt_gettoken_shared(&p->p_token);
|
||
|
bcopy(p->p_pgrp->pg_session->s_login, buf, uap->namelen);
|
||
|
lwkt_reltoken(&proc_token);
|
||
|
lwkt_reltoken(&p->p_token);
|
||
|
error = copyout(buf, uap->namebuf, uap->namelen);
|
||
|
return (error);
|
||
| ... | ... | |
|
int
|
||
|
sys_setlogin(struct setlogin_args *uap)
|
||
|
{
|
||
|
struct thread *td = curthread;
|
||
|
struct proc *p;
|
||
|
struct proc *p = curproc;
|
||
|
struct ucred *cred;
|
||
|
char buf[MAXLOGNAME];
|
||
|
int error;
|
||
|
cred = td->td_ucred;
|
||
|
p = td->td_proc;
|
||
|
lwkt_gettoken(&p->p_token);
|
||
|
cred = p->p_ucred;
|
||
|
if ((error = priv_check_cred(cred, PRIV_PROC_SETLOGIN, 0)))
|
||
|
return (error);
|
||
|
goto done;
|
||
|
bzero(buf, sizeof(buf));
|
||
|
error = copyinstr(uap->namebuf, buf, sizeof(buf), NULL);
|
||
|
if (error == ENAMETOOLONG)
|
||
|
error = EINVAL;
|
||
|
if (error == 0) {
|
||
|
lwkt_gettoken(&proc_token);
|
||
|
memcpy(p->p_pgrp->pg_session->s_login, buf, sizeof(buf));
|
||
|
lwkt_reltoken(&proc_token);
|
||
|
}
|
||
|
done:
|
||
|
lwkt_reltoken(&p->p_token);
|
||
|
return (error);
|
||
|
}
|
||
| ... | ... | |
|
*
|
||
|
* The per-uid process count for this process is transfered from
|
||
|
* the old uid to the new uid.
|
||
|
*
|
||
|
* Requires curproc->p_token to be held.
|
||
|
*/
|
||
|
struct ucred *
|
||
|
change_ruid(uid_t ruid)
|
||