Project

General

Profile

Submit #2574 ยป 0002-kernel-change-proc_token-by-per-process-token-to-pro.patch

jorisgio, 07/31/2013 05:54 AM

View differences:

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)
    (1-1/1)