kern_ktrace.c (1542) | kern_ktrace.c (1549) |
---|---|
1/* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 30 unchanged lines hidden (view full) --- 39#include <sys/proc.h> 40#include <sys/file.h> 41#include <sys/namei.h> 42#include <sys/vnode.h> 43#include <sys/ktrace.h> 44#include <sys/malloc.h> 45#include <sys/syslog.h> 46 | 1/* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 30 unchanged lines hidden (view full) --- 39#include <sys/proc.h> 40#include <sys/file.h> 41#include <sys/namei.h> 42#include <sys/vnode.h> 43#include <sys/ktrace.h> 44#include <sys/malloc.h> 45#include <sys/syslog.h> 46 |
47void ktrwrite __P((struct vnode *, struct ktr_header *)); 48 |
|
47struct ktr_header * 48ktrgetheader(type) 49 int type; 50{ 51 register struct ktr_header *kth; 52 struct proc *p = curproc; /* XXX */ 53 54 MALLOC(kth, struct ktr_header *, sizeof (struct ktr_header), 55 M_TEMP, M_WAITOK); 56 kth->ktr_type = type; 57 microtime(&kth->ktr_time); 58 kth->ktr_pid = p->p_pid; 59 bcopy(p->p_comm, kth->ktr_comm, MAXCOMLEN); 60 return (kth); 61} 62 | 49struct ktr_header * 50ktrgetheader(type) 51 int type; 52{ 53 register struct ktr_header *kth; 54 struct proc *p = curproc; /* XXX */ 55 56 MALLOC(kth, struct ktr_header *, sizeof (struct ktr_header), 57 M_TEMP, M_WAITOK); 58 kth->ktr_type = type; 59 microtime(&kth->ktr_time); 60 kth->ktr_pid = p->p_pid; 61 bcopy(p->p_comm, kth->ktr_comm, MAXCOMLEN); 62 return (kth); 63} 64 |
65void |
|
63ktrsyscall(vp, code, narg, args) 64 struct vnode *vp; 65 int code, narg, args[]; 66{ 67 struct ktr_header *kth; 68 struct ktr_syscall *ktp; 69 register len = sizeof(struct ktr_syscall) + (narg * sizeof(int)); 70 struct proc *p = curproc; /* XXX */ --- 10 unchanged lines hidden (view full) --- 81 kth->ktr_buf = (caddr_t)ktp; 82 kth->ktr_len = len; 83 ktrwrite(vp, kth); 84 FREE(ktp, M_TEMP); 85 FREE(kth, M_TEMP); 86 p->p_traceflag &= ~KTRFAC_ACTIVE; 87} 88 | 66ktrsyscall(vp, code, narg, args) 67 struct vnode *vp; 68 int code, narg, args[]; 69{ 70 struct ktr_header *kth; 71 struct ktr_syscall *ktp; 72 register len = sizeof(struct ktr_syscall) + (narg * sizeof(int)); 73 struct proc *p = curproc; /* XXX */ --- 10 unchanged lines hidden (view full) --- 84 kth->ktr_buf = (caddr_t)ktp; 85 kth->ktr_len = len; 86 ktrwrite(vp, kth); 87 FREE(ktp, M_TEMP); 88 FREE(kth, M_TEMP); 89 p->p_traceflag &= ~KTRFAC_ACTIVE; 90} 91 |
92void |
|
89ktrsysret(vp, code, error, retval) 90 struct vnode *vp; 91 int code, error, retval; 92{ 93 struct ktr_header *kth; 94 struct ktr_sysret ktp; 95 struct proc *p = curproc; /* XXX */ 96 --- 6 unchanged lines hidden (view full) --- 103 kth->ktr_buf = (caddr_t)&ktp; 104 kth->ktr_len = sizeof(struct ktr_sysret); 105 106 ktrwrite(vp, kth); 107 FREE(kth, M_TEMP); 108 p->p_traceflag &= ~KTRFAC_ACTIVE; 109} 110 | 93ktrsysret(vp, code, error, retval) 94 struct vnode *vp; 95 int code, error, retval; 96{ 97 struct ktr_header *kth; 98 struct ktr_sysret ktp; 99 struct proc *p = curproc; /* XXX */ 100 --- 6 unchanged lines hidden (view full) --- 107 kth->ktr_buf = (caddr_t)&ktp; 108 kth->ktr_len = sizeof(struct ktr_sysret); 109 110 ktrwrite(vp, kth); 111 FREE(kth, M_TEMP); 112 p->p_traceflag &= ~KTRFAC_ACTIVE; 113} 114 |
115void |
|
111ktrnamei(vp, path) 112 struct vnode *vp; 113 char *path; 114{ 115 struct ktr_header *kth; 116 struct proc *p = curproc; /* XXX */ 117 118 p->p_traceflag |= KTRFAC_ACTIVE; 119 kth = ktrgetheader(KTR_NAMEI); 120 kth->ktr_len = strlen(path); 121 kth->ktr_buf = path; 122 123 ktrwrite(vp, kth); 124 FREE(kth, M_TEMP); 125 p->p_traceflag &= ~KTRFAC_ACTIVE; 126} 127 | 116ktrnamei(vp, path) 117 struct vnode *vp; 118 char *path; 119{ 120 struct ktr_header *kth; 121 struct proc *p = curproc; /* XXX */ 122 123 p->p_traceflag |= KTRFAC_ACTIVE; 124 kth = ktrgetheader(KTR_NAMEI); 125 kth->ktr_len = strlen(path); 126 kth->ktr_buf = path; 127 128 ktrwrite(vp, kth); 129 FREE(kth, M_TEMP); 130 p->p_traceflag &= ~KTRFAC_ACTIVE; 131} 132 |
133void |
|
128ktrgenio(vp, fd, rw, iov, len, error) 129 struct vnode *vp; 130 int fd; 131 enum uio_rw rw; 132 register struct iovec *iov; 133 int len, error; 134{ 135 struct ktr_header *kth; --- 25 unchanged lines hidden (view full) --- 161 162 ktrwrite(vp, kth); 163done: 164 FREE(kth, M_TEMP); 165 FREE(ktp, M_TEMP); 166 p->p_traceflag &= ~KTRFAC_ACTIVE; 167} 168 | 134ktrgenio(vp, fd, rw, iov, len, error) 135 struct vnode *vp; 136 int fd; 137 enum uio_rw rw; 138 register struct iovec *iov; 139 int len, error; 140{ 141 struct ktr_header *kth; --- 25 unchanged lines hidden (view full) --- 167 168 ktrwrite(vp, kth); 169done: 170 FREE(kth, M_TEMP); 171 FREE(ktp, M_TEMP); 172 p->p_traceflag &= ~KTRFAC_ACTIVE; 173} 174 |
175void |
|
169ktrpsig(vp, sig, action, mask, code) 170 struct vnode *vp; 171 int sig; 172 sig_t action; 173 int mask, code; 174{ 175 struct ktr_header *kth; 176 struct ktr_psig kp; --- 8 unchanged lines hidden (view full) --- 185 kth->ktr_buf = (caddr_t)&kp; 186 kth->ktr_len = sizeof (struct ktr_psig); 187 188 ktrwrite(vp, kth); 189 FREE(kth, M_TEMP); 190 p->p_traceflag &= ~KTRFAC_ACTIVE; 191} 192 | 176ktrpsig(vp, sig, action, mask, code) 177 struct vnode *vp; 178 int sig; 179 sig_t action; 180 int mask, code; 181{ 182 struct ktr_header *kth; 183 struct ktr_psig kp; --- 8 unchanged lines hidden (view full) --- 192 kth->ktr_buf = (caddr_t)&kp; 193 kth->ktr_len = sizeof (struct ktr_psig); 194 195 ktrwrite(vp, kth); 196 FREE(kth, M_TEMP); 197 p->p_traceflag &= ~KTRFAC_ACTIVE; 198} 199 |
200void |
|
193ktrcsw(vp, out, user) 194 struct vnode *vp; 195 int out, user; 196{ 197 struct ktr_header *kth; 198 struct ktr_csw kc; 199 struct proc *p = curproc; /* XXX */ 200 --- 16 unchanged lines hidden (view full) --- 217 */ 218struct ktrace_args { 219 char *fname; 220 int ops; 221 int facs; 222 int pid; 223}; 224/* ARGSUSED */ | 201ktrcsw(vp, out, user) 202 struct vnode *vp; 203 int out, user; 204{ 205 struct ktr_header *kth; 206 struct ktr_csw kc; 207 struct proc *p = curproc; /* XXX */ 208 --- 16 unchanged lines hidden (view full) --- 225 */ 226struct ktrace_args { 227 char *fname; 228 int ops; 229 int facs; 230 int pid; 231}; 232/* ARGSUSED */ |
233int |
|
225ktrace(curp, uap, retval) 226 struct proc *curp; 227 register struct ktrace_args *uap; 228 int *retval; 229{ 230 register struct vnode *vp = NULL; 231 register struct proc *p; 232 struct pgrp *pg; --- 119 unchanged lines hidden (view full) --- 352 p->p_tracep = NULL; 353 } 354 } 355 } 356 357 return (1); 358} 359 | 234ktrace(curp, uap, retval) 235 struct proc *curp; 236 register struct ktrace_args *uap; 237 int *retval; 238{ 239 register struct vnode *vp = NULL; 240 register struct proc *p; 241 struct pgrp *pg; --- 119 unchanged lines hidden (view full) --- 361 p->p_tracep = NULL; 362 } 363 } 364 } 365 366 return (1); 367} 368 |
369int |
|
360ktrsetchildren(curp, top, ops, facs, vp) 361 struct proc *curp, *top; 362 int ops, facs; 363 struct vnode *vp; 364{ 365 register struct proc *p; 366 register int ret = 0; 367 --- 19 unchanged lines hidden (view full) --- 387 p = p->p_osptr; 388 break; 389 } 390 } 391 } 392 /*NOTREACHED*/ 393} 394 | 370ktrsetchildren(curp, top, ops, facs, vp) 371 struct proc *curp, *top; 372 int ops, facs; 373 struct vnode *vp; 374{ 375 register struct proc *p; 376 register int ret = 0; 377 --- 19 unchanged lines hidden (view full) --- 397 p = p->p_osptr; 398 break; 399 } 400 } 401 } 402 /*NOTREACHED*/ 403} 404 |
405void |
|
395ktrwrite(vp, kth) 396 struct vnode *vp; 397 register struct ktr_header *kth; 398{ 399 struct uio auio; 400 struct iovec aiov[2]; 401 register struct proc *p = curproc; /* XXX */ 402 int error; --- 38 unchanged lines hidden (view full) --- 441 * Return true if caller has permission to set the ktracing state 442 * of target. Essentially, the target can't possess any 443 * more permissions than the caller. KTRFAC_ROOT signifies that 444 * root previously set the tracing status on the target process, and 445 * so, only root may further change it. 446 * 447 * TODO: check groups. use caller effective gid. 448 */ | 406ktrwrite(vp, kth) 407 struct vnode *vp; 408 register struct ktr_header *kth; 409{ 410 struct uio auio; 411 struct iovec aiov[2]; 412 register struct proc *p = curproc; /* XXX */ 413 int error; --- 38 unchanged lines hidden (view full) --- 452 * Return true if caller has permission to set the ktracing state 453 * of target. Essentially, the target can't possess any 454 * more permissions than the caller. KTRFAC_ROOT signifies that 455 * root previously set the tracing status on the target process, and 456 * so, only root may further change it. 457 * 458 * TODO: check groups. use caller effective gid. 459 */ |
460int |
|
449ktrcanset(callp, targetp) 450 struct proc *callp, *targetp; 451{ 452 register struct pcred *caller = callp->p_cred; 453 register struct pcred *target = targetp->p_cred; 454 455 if ((caller->pc_ucred->cr_uid == target->p_ruid && 456 target->p_ruid == target->p_svuid && 457 caller->p_rgid == target->p_rgid && /* XXX */ 458 target->p_rgid == target->p_svgid && 459 (targetp->p_traceflag & KTRFAC_ROOT) == 0) || 460 caller->pc_ucred->cr_uid == 0) 461 return (1); 462 463 return (0); 464} 465 466#endif | 461ktrcanset(callp, targetp) 462 struct proc *callp, *targetp; 463{ 464 register struct pcred *caller = callp->p_cred; 465 register struct pcred *target = targetp->p_cred; 466 467 if ((caller->pc_ucred->cr_uid == target->p_ruid && 468 target->p_ruid == target->p_svuid && 469 caller->p_rgid == target->p_rgid && /* XXX */ 470 target->p_rgid == target->p_svgid && 471 (targetp->p_traceflag & KTRFAC_ROOT) == 0) || 472 caller->pc_ucred->cr_uid == 0) 473 return (1); 474 475 return (0); 476} 477 478#endif |