[BACK]Return to kern_ktrace.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / kern

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/kern/kern_ktrace.c between version 1.100.6.3 and 1.101

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);

Legend:
Removed from v.1.100.6.3  
changed lines
  Added in v.1.101

CVSweb <webmaster@jp.NetBSD.org>