version 1.100.6.3, 2006/06/01 22:38:07 |
version 1.101, 2006/03/01 12:38:21 |
Line 51 __KERNEL_RCSID(0, "$NetBSD$"); |
|
Line 51 __KERNEL_RCSID(0, "$NetBSD$"); |
|
#include <sys/filedesc.h> |
#include <sys/filedesc.h> |
#include <sys/ioctl.h> |
#include <sys/ioctl.h> |
#include <sys/callout.h> |
#include <sys/callout.h> |
#include <sys/kauth.h> |
|
|
|
#include <sys/mount.h> |
#include <sys/mount.h> |
#include <sys/sa.h> |
#include <sys/sa.h> |
Line 233 ktraddentry(struct lwp *l, struct ktrace |
|
Line 232 ktraddentry(struct lwp *l, struct ktrace |
|
struct proc *p = l->l_proc; |
struct proc *p = l->l_proc; |
struct ktr_desc *ktd; |
struct ktr_desc *ktd; |
#ifdef DEBUG |
#ifdef DEBUG |
struct timeval t1, t2; |
struct timeval t; |
|
int s; |
#endif |
#endif |
|
|
if (p->p_traceflag & KTRFAC_TRC_EMUL) { |
if (p->p_traceflag & KTRFAC_TRC_EMUL) { |
Line 281 ktraddentry(struct lwp *l, struct ktrace |
|
Line 281 ktraddentry(struct lwp *l, struct ktrace |
|
ktd->ktd_flags |= KTDF_WAIT; |
ktd->ktd_flags |= KTDF_WAIT; |
ktd_wakeup(ktd); |
ktd_wakeup(ktd); |
#ifdef DEBUG |
#ifdef DEBUG |
getmicrouptime(&t1); |
s = splclock(); |
|
t = mono_time; |
|
splx(s); |
#endif |
#endif |
if (ltsleep(&ktd->ktd_flags, PWAIT, "ktrsync", |
if (ltsleep(&ktd->ktd_flags, PWAIT, "ktrsync", |
ktd_timeout * hz, &ktd->ktd_slock) != 0) { |
ktd_timeout * hz, &ktd->ktd_slock) != 0) { |
Line 295 ktraddentry(struct lwp *l, struct ktrace |
|
Line 297 ktraddentry(struct lwp *l, struct ktrace |
|
break; |
break; |
} |
} |
#ifdef DEBUG |
#ifdef DEBUG |
getmicrouptime(&t2); |
s = splclock(); |
timersub(&t2, &t1, &t2); |
timersub(&mono_time, &t, &t); |
if (t2.tv_sec > 0) |
splx(s); |
|
if (t.tv_sec > 0) |
log(LOG_NOTICE, |
log(LOG_NOTICE, |
"ktrace long wait: %ld.%06ld\n", |
"ktrace long wait: %ld.%06ld\n", |
t2.tv_sec, t2.tv_usec); |
t.tv_sec, t.tv_usec); |
#endif |
#endif |
} while (p->p_tracep == ktd && |
} while (p->p_tracep == ktd && |
(ktd->ktd_flags & (KTDF_WAIT | KTDF_DONE)) == KTDF_WAIT); |
(ktd->ktd_flags & (KTDF_WAIT | KTDF_DONE)) == KTDF_WAIT); |
Line 964 sys_ktrace(struct lwp *l, void *v, regis |
|
Line 967 sys_ktrace(struct lwp *l, void *v, regis |
|
struct proc *curp = l->l_proc; |
struct proc *curp = l->l_proc; |
struct vnode *vp = NULL; |
struct vnode *vp = NULL; |
struct file *fp = NULL; |
struct file *fp = NULL; |
|
int ops = SCARG(uap, ops); |
struct nameidata nd; |
struct nameidata nd; |
int error = 0; |
int error = 0; |
int fd; |
int fd; |
|
|
|
ops = KTROP(ops) | (ops & KTRFLAG_DESCEND); |
|
|
curp->p_traceflag |= KTRFAC_ACTIVE; |
curp->p_traceflag |= KTRFAC_ACTIVE; |
if (KTROP(SCARG(uap, ops)) != KTROP_CLEAR) { |
if ((ops & KTROP_CLEAR) == 0) { |
/* |
/* |
* an operation which requires a file argument. |
* an operation which requires a file argument. |
*/ |
*/ |
Line 982 sys_ktrace(struct lwp *l, void *v, regis |
|
Line 988 sys_ktrace(struct lwp *l, void *v, regis |
|
vp = nd.ni_vp; |
vp = nd.ni_vp; |
VOP_UNLOCK(vp, 0); |
VOP_UNLOCK(vp, 0); |
if (vp->v_type != VREG) { |
if (vp->v_type != VREG) { |
(void) vn_close(vp, FREAD|FWRITE, curp->p_cred, l); |
(void) vn_close(vp, FREAD|FWRITE, curp->p_ucred, l); |
curp->p_traceflag &= ~KTRFAC_ACTIVE; |
curp->p_traceflag &= ~KTRFAC_ACTIVE; |
return (EACCES); |
return (EACCES); |
} |
} |
Line 1011 sys_ktrace(struct lwp *l, void *v, regis |
|
Line 1017 sys_ktrace(struct lwp *l, void *v, regis |
|
SCARG(uap, pid), fp); |
SCARG(uap, pid), fp); |
done: |
done: |
if (vp != NULL) |
if (vp != NULL) |
(void) vn_close(vp, FWRITE, curp->p_cred, l); |
(void) vn_close(vp, FWRITE, curp->p_ucred, l); |
if (fp != NULL) { |
if (fp != NULL) { |
FILE_UNUSE(fp, l); /* release file */ |
FILE_UNUSE(fp, l); /* release file */ |
fdrelease(l, fd); /* release fd table slot */ |
fdrelease(l, fd); /* release fd table slot */ |
Line 1047 ktrops(struct proc *curp, struct proc *p |
|
Line 1053 ktrops(struct proc *curp, struct proc *p |
|
ktradref(p); |
ktradref(p); |
} |
} |
p->p_traceflag |= facs; |
p->p_traceflag |= facs; |
if (kauth_cred_geteuid(curp->p_cred) == 0) |
if (curp->p_ucred->cr_uid == 0) |
p->p_traceflag |= KTRFAC_ROOT; |
p->p_traceflag |= KTRFAC_ROOT; |
} else { |
} else { |
/* KTROP_CLEAR */ |
/* KTROP_CLEAR */ |
Line 1260 ktrace_thread(void *arg) |
|
Line 1266 ktrace_thread(void *arg) |
|
int |
int |
ktrcanset(struct proc *callp, struct proc *targetp) |
ktrcanset(struct proc *callp, struct proc *targetp) |
{ |
{ |
kauth_cred_t caller = callp->p_cred; |
struct pcred *caller = callp->p_cred; |
kauth_cred_t target = targetp->p_cred; |
struct pcred *target = targetp->p_cred; |
|
|
if ((kauth_cred_geteuid(caller) == kauth_cred_getuid(target) && |
if ((caller->pc_ucred->cr_uid == target->p_ruid && |
kauth_cred_getuid(target) == kauth_cred_getsvuid(target) && |
target->p_ruid == target->p_svuid && |
kauth_cred_getgid(caller) == kauth_cred_getgid(target) && /* XXX */ |
caller->p_rgid == target->p_rgid && /* XXX */ |
kauth_cred_getgid(target) == kauth_cred_getsvgid(target) && |
target->p_rgid == target->p_svgid && |
(targetp->p_traceflag & KTRFAC_ROOT) == 0 && |
(targetp->p_traceflag & KTRFAC_ROOT) == 0 && |
(targetp->p_flag & P_SUGID) == 0) || |
(targetp->p_flag & P_SUGID) == 0) || |
kauth_cred_geteuid(caller) == 0) |
caller->pc_ucred->cr_uid == 0) |
return (1); |
return (1); |
|
|
return (0); |
return (0); |