Deleted Added
full compact
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