xref: /original-bsd/lib/libkvm/kvm_proc.c (revision 2932bec8)
1 /*-
2  * Copyright (c) 1989 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  */
7 
8 #if defined(LIBC_SCCS) && !defined(lint)
9 static char sccsid[] = "@(#)kvm_proc.c	5.23 (Berkeley) 04/03/92";
10 #endif /* LIBC_SCCS and not lint */
11 
12 /*
13  * Proc traversal interface for kvm.  ps and w are (probably) the exclusive
14  * users of this code, so we've factored it out into a separate module.
15  * Thus, we keep this grunge out of the other kvm applications (i.e.,
16  * most other applications are interested only in open/close/read/nlist).
17  */
18 
19 #include <sys/param.h>
20 #include <sys/user.h>
21 #include <sys/proc.h>
22 #include <sys/exec.h>
23 #include <sys/stat.h>
24 #include <sys/ioctl.h>
25 #include <sys/tty.h>
26 #include <nlist.h>
27 #include <kvm.h>
28 
29 #include <vm/vm.h>
30 #include <vm/vm_param.h>
31 #include <vm/swap_pager.h>
32 
33 #include <sys/kinfo.h>
34 #include <sys/kinfo_proc.h>
35 
36 #include <limits.h>
37 #include <ndbm.h>
38 #include <paths.h>
39 
40 #include "kvm_private.h"
41 
42 static char *
43 kvm_readswap(kd, p, va, cnt)
44 	kvm_t *kd;
45 	const struct proc *p;
46 	u_long va;
47 	u_long *cnt;
48 {
49 	register int ix;
50 	register u_long addr, head;
51 	register u_long offset, pagestart, sbstart, pgoff;
52 	register off_t seekpoint;
53 	struct vm_map_entry vme;
54 	struct vm_object vmo;
55 	struct pager_struct pager;
56 	struct swpager swap;
57 	struct swblock swb;
58 	static char page[NBPG];
59 
60 	head = (u_long)&p->p_vmspace->vm_map.header;
61 	/*
62 	 * Look through the address map for the memory object
63 	 * that corresponds to the given virtual address.
64 	 * The header just has the entire valid range.
65 	 */
66 	addr = head;
67 	while (1) {
68 		if (kvm_read(kd, addr, (char *)&vme, sizeof(vme)) !=
69 		    sizeof(vme))
70 			return (0);
71 
72 		if (va >= vme.start && va <= vme.end &&
73 		    vme.object.vm_object != 0)
74 			break;
75 
76 		addr = (u_long)vme.next;
77 		if (addr == 0 || addr == head)
78 			return (0);
79 	}
80 	/*
81 	 * We found the right object -- follow shadow links.
82 	 */
83 	offset = va - vme.start + vme.offset;
84 	addr = (u_long)vme.object.vm_object;
85 	while (1) {
86 		if (kvm_read(kd, addr, (char *)&vmo, sizeof(vmo)) !=
87 		    sizeof(vmo))
88 			return (0);
89 		addr = (u_long)vmo.shadow;
90 		if (addr == 0)
91 			break;
92 		offset += vmo.shadow_offset;
93 	}
94 	if (vmo.pager == 0)
95 		return (0);
96 
97 	offset += vmo.paging_offset;
98 	/*
99 	 * Read in the pager info and make sure it's a swap device.
100 	 */
101 	addr = (u_long)vmo.pager;
102 	if (kvm_read(kd, addr, (char *)&pager, sizeof(pager)) != sizeof(pager)
103 	    || pager.pg_type != PG_SWAP)
104 		return (0);
105 
106 	/*
107 	 * Read in the swap_pager private data, and compute the
108 	 * swap offset.
109 	 */
110 	addr = (u_long)pager.pg_data;
111 	if (kvm_read(kd, addr, (char *)&swap, sizeof(swap)) != sizeof(swap))
112 		return (0);
113 	ix = offset / dbtob(swap.sw_bsize);
114 	if (swap.sw_blocks == 0 || ix >= swap.sw_nblocks)
115 		return (0);
116 
117 	addr = (u_long)&swap.sw_blocks[ix];
118 	if (kvm_read(kd, addr, (char *)&swb, sizeof(swb)) != sizeof(swb))
119 		return (0);
120 
121 	sbstart = (offset / dbtob(swap.sw_bsize)) * dbtob(swap.sw_bsize);
122 	sbstart /= NBPG;
123 	pagestart = offset / NBPG;
124 	pgoff = pagestart - sbstart;
125 
126 	if (swb.swb_block == 0 || (swb.swb_mask & (1 << pgoff)) == 0)
127 		return (0);
128 
129 	seekpoint = dbtob(swb.swb_block) + ctob(pgoff);
130 	errno = 0;
131 	if (lseek(kd->swfd, seekpoint, 0) == -1 && errno != 0)
132 		return (0);
133 	if (read(kd->swfd, page, sizeof(page)) != sizeof(page))
134 		return (0);
135 
136 	offset %= NBPG;
137 	*cnt = NBPG - offset;
138 	return (&page[offset]);
139 }
140 
141 #define KREAD(kd, addr, obj) \
142 	(kvm_read(kd, addr, (char *)(obj), sizeof(*obj)) != sizeof(*obj))
143 
144 /*
145  * Read proc's from memory file into buffer bp, which has space to hold
146  * at most maxcnt procs.
147  */
148 static int
149 kvm_proclist(kd, what, arg, p, bp, maxcnt)
150 	kvm_t *kd;
151 	int what, arg;
152 	struct proc *p;
153 	struct kinfo_proc *bp;
154 	int maxcnt;
155 {
156 	register int cnt = 0;
157 	struct eproc eproc;
158 	struct pgrp pgrp;
159 	struct session sess;
160 	struct tty tty;
161 	struct proc proc;
162 
163 	for (; cnt < maxcnt && p != 0; p = proc.p_nxt) {
164 		if (KREAD(kd, (u_long)p, &proc)) {
165 			_kvm_err(kd, kd->program, "can't read proc at %x", p);
166 			return (-1);
167 		}
168 		if (KREAD(kd, (u_long)proc.p_cred, &eproc.e_pcred) == 0)
169 			KREAD(kd, (u_long)eproc.e_pcred.pc_ucred,
170 			      &eproc.e_ucred);
171 
172 		switch(ki_op(what)) {
173 
174 		case KINFO_PROC_PID:
175 			if (proc.p_pid != (pid_t)arg)
176 				continue;
177 			break;
178 
179 		case KINFO_PROC_UID:
180 			if (eproc.e_ucred.cr_uid != (uid_t)arg)
181 				continue;
182 			break;
183 
184 		case KINFO_PROC_RUID:
185 			if (eproc.e_pcred.p_ruid != (uid_t)arg)
186 				continue;
187 			break;
188 		}
189 		/*
190 		 * We're going to add another proc to the set.  If this
191 		 * will overflow the buffer, assume the reason is because
192 		 * nprocs (or the proc list) is corrupt and declare an error.
193 		 */
194 		if (cnt >= maxcnt) {
195 			_kvm_err(kd, kd->program, "nprocs corrupt");
196 			return (-1);
197 		}
198 		/*
199 		 * gather eproc
200 		 */
201 		eproc.e_paddr = p;
202 		if (KREAD(kd, (u_long)proc.p_pgrp, &pgrp)) {
203 			_kvm_err(kd, kd->program, "can't read pgrp at %x",
204 				 proc.p_pgrp);
205 			return (-1);
206 		}
207 		eproc.e_sess = pgrp.pg_session;
208 		eproc.e_pgid = pgrp.pg_id;
209 		eproc.e_jobc = pgrp.pg_jobc;
210 		if (KREAD(kd, (u_long)pgrp.pg_session, &sess)) {
211 			_kvm_err(kd, kd->program, "can't read session at %x",
212 				pgrp.pg_session);
213 			return (-1);
214 		}
215 		if ((proc.p_flag & SCTTY) && sess.s_ttyp != NULL) {
216 			if (KREAD(kd, (u_long)sess.s_ttyp, &tty)) {
217 				_kvm_err(kd, kd->program,
218 					 "can't read tty at %x", sess.s_ttyp);
219 				return (-1);
220 			}
221 			eproc.e_tdev = tty.t_dev;
222 			eproc.e_tsess = tty.t_session;
223 			if (tty.t_pgrp != NULL) {
224 				if (KREAD(kd, (u_long)tty.t_pgrp, &pgrp)) {
225 					_kvm_err(kd, kd->program,
226 						 "can't read tpgrp at &x",
227 						tty.t_pgrp);
228 					return (-1);
229 				}
230 				eproc.e_tpgid = pgrp.pg_id;
231 			} else
232 				eproc.e_tpgid = -1;
233 		} else
234 			eproc.e_tdev = NODEV;
235 		eproc.e_flag = sess.s_ttyvp ? EPROC_CTTY : 0;
236 		if (sess.s_leader == p)
237 			eproc.e_flag |= EPROC_SLEADER;
238 		if (proc.p_wmesg)
239 			(void)kvm_read(kd, (u_long)proc.p_wmesg,
240 			    eproc.e_wmesg, WMESGLEN);
241 
242 #ifdef sparc
243 		(void)kvm_read(kd, (u_long)&proc.p_vmspace->vm_rssize,
244 		    (char *)&eproc.e_vm.vm_rssize,
245 		    sizeof(eproc.e_vm.vm_rssize));
246 		(void)kvm_read(kd, (u_long)&proc.p_vmspace->vm_tsize,
247 		    (char *)&eproc.e_vm.vm_tsize,
248 		    3 * sizeof(eproc.e_vm.vm_rssize));	/* XXX */
249 #else
250 		(void)kvm_read(kd, (u_long)proc.p_vmspace,
251 		    (char *)&eproc.e_vm, sizeof(eproc.e_vm));
252 #endif
253 		eproc.e_xsize = eproc.e_xrssize = 0;
254 		eproc.e_xccount = eproc.e_xswrss = 0;
255 
256 		switch (ki_op(what)) {
257 
258 		case KINFO_PROC_PGRP:
259 			if (eproc.e_pgid != (pid_t)arg)
260 				continue;
261 			break;
262 
263 		case KINFO_PROC_TTY:
264 			if ((proc.p_flag&SCTTY) == 0 ||
265 			     eproc.e_tdev != (dev_t)arg)
266 				continue;
267 			break;
268 		}
269 		bcopy((char *)&proc, (char *)&bp->kp_proc, sizeof(proc));
270 		bcopy((char *)&eproc, (char *)&bp->kp_eproc, sizeof(eproc));
271 		++bp;
272 		++cnt;
273 	}
274 	return (cnt);
275 }
276 
277 /*
278  * Build proc info array by reading in proc list from a crash dump.
279  * Return number of procs read.  maxcnt is the max we will read.
280  */
281 static int
282 kvm_deadprocs(kd, what, arg, a_allproc, a_zombproc, maxcnt)
283 	kvm_t *kd;
284 	int what, arg;
285 	u_long a_allproc;
286 	u_long a_zombproc;
287 	int maxcnt;
288 {
289 	register struct kinfo_proc *bp = kd->procbase;
290 	register int acnt, zcnt;
291 	struct proc *p;
292 
293 	if (KREAD(kd, a_allproc, &p)) {
294 		_kvm_err(kd, kd->program, "cannot read allproc");
295 		return (-1);
296 	}
297 	acnt = kvm_proclist(kd, what, arg, p, bp, maxcnt);
298 	if (acnt < 0)
299 		return (acnt);
300 
301 	if (KREAD(kd, a_zombproc, &p)) {
302 		_kvm_err(kd, kd->program, "cannot read zombproc");
303 		return (-1);
304 	}
305 	zcnt = kvm_proclist(kd, what, arg, p, bp + acnt, maxcnt - acnt);
306 	if (zcnt < 0)
307 		zcnt = 0;
308 
309 	return (acnt + zcnt);
310 }
311 
312 struct kinfo_proc *
313 kvm_getprocs(kd, op, arg, cnt)
314 	kvm_t *kd;
315 	int op, arg;
316 	int *cnt;
317 {
318 	int size, st, nprocs;
319 
320 	if (kd->procbase != 0) {
321 		free((void *)kd->procbase);
322 		/*
323 		 * Clear this pointer in case this call fails.  Otherwise,
324 		 * kvm_close() will free it again.
325 		 */
326 		kd->procbase = 0;
327 	}
328 	if (ISALIVE(kd)) {
329 		size = 0;
330 		st = getkerninfo(op, NULL, &size, arg);
331 		if (st < 0) {
332 			_kvm_syserr(kd, kd->program, "kvm_getprocs");
333 			return (0);
334 		}
335 		kd->procbase = (struct kinfo_proc *)_kvm_malloc(kd, st);
336 		if (kd->procbase == 0)
337 			return (0);
338 		size = st;
339 		st = getkerninfo(op, kd->procbase, &size, arg);
340 		if (st < 0) {
341 			_kvm_syserr(kd, kd->program, "kvm_getprocs");
342 			return (0);
343 		}
344 		if (size % sizeof(struct kinfo_proc) != 0) {
345 			_kvm_err(kd, kd->program,
346 				"proc size mismatch (%d total, %d chunks)",
347 				size, sizeof(struct kinfo_proc));
348 			return (0);
349 		}
350 		nprocs = size / sizeof(struct kinfo_proc);
351 	} else {
352 		struct nlist nl[4], *p;
353 
354 		nl[0].n_name = "_nprocs";
355 		nl[1].n_name = "_allproc";
356 		nl[2].n_name = "_zombproc";
357 		nl[3].n_name = 0;
358 
359 		if (kvm_nlist(kd, nl) != 0) {
360 			for (p = nl; p->n_type != 0; ++p)
361 				;
362 			_kvm_err(kd, kd->program,
363 				 "%s: no such symbol", p->n_name);
364 			return (0);
365 		}
366 		if (KREAD(kd, nl[0].n_value, &nprocs)) {
367 			_kvm_err(kd, kd->program, "can't read nprocs");
368 			return (0);
369 		}
370 		size = nprocs * sizeof(struct kinfo_proc);
371 		kd->procbase = (struct kinfo_proc *)_kvm_malloc(kd, size);
372 		if (kd->procbase == 0)
373 			return (0);
374 
375 		nprocs = kvm_deadprocs(kd, op, arg, nl[1].n_value,
376 				      nl[2].n_value, nprocs);
377 #ifdef notdef
378 		size = nprocs * sizeof(struct kinfo_proc);
379 		(void)realloc(kd->procbase, size);
380 #endif
381 	}
382 	*cnt = nprocs;
383 	return (kd->procbase);
384 }
385 
386 void
387 _kvm_freeprocs(kd)
388 	kvm_t *kd;
389 {
390 	if (kd->procbase) {
391 		free(kd->procbase);
392 		kd->procbase = 0;
393 	}
394 }
395 
396 static void *
397 _kvm_realloc(kd, p, n)
398 	kvm_t *kd;
399 	void *p;
400 	int n;
401 {
402 	void *np = (void *)realloc(p, n);
403 
404 	if (np == 0)
405 		_kvm_err(kd, kd->program, "out of memory");
406 	return (np);
407 }
408 
409 #ifndef MAX
410 #define MAX(a, b) ((a) > (b) ? (a) : (b))
411 #endif
412 
413 /*
414  * Read in an argument vector from the user address space of process p.
415  * addr if the user-space base address of narg null-terminated contiguous
416  * strings.  This is used to read in both the command arguments and
417  * environment strings.  Read at most maxcnt characters of strings.
418  */
419 static char **
420 kvm_argv(kd, p, addr, narg, maxcnt)
421 	kvm_t *kd;
422 	struct proc *p;
423 	register u_long addr;
424 	register int narg;
425 	register int maxcnt;
426 {
427 	register char *cp;
428 	register int len, cc;
429 	register char **argv;
430 
431 	/*
432 	 * Check that there aren't an unreasonable number of agruments,
433 	 * and that the address is in user space.
434 	 */
435 	if (narg > 512 || addr < VM_MIN_ADDRESS || addr >= VM_MAXUSER_ADDRESS)
436 		return (0);
437 
438 	if (kd->argv == 0) {
439 		/*
440 		 * Try to avoid reallocs.
441 		 */
442 		kd->argc = MAX(narg + 1, 32);
443 		kd->argv = (char **)_kvm_malloc(kd, kd->argc *
444 						sizeof(*kd->argv));
445 		if (kd->argv == 0)
446 			return (0);
447 	} else if (narg + 1 > kd->argc) {
448 		kd->argc = MAX(2 * kd->argc, narg + 1);
449 		kd->argv = (char **)_kvm_realloc(kd, kd->argv);
450 		if (kd->argv == 0)
451 			return (0);
452 	}
453 	if (kd->argspc == 0) {
454 		kd->argspc = (char *)_kvm_malloc(kd, NBPG);
455 		if (kd->argspc == 0)
456 			return (0);
457 		kd->arglen = NBPG;
458 	}
459 	cp = kd->argspc;
460 	argv = kd->argv;
461 	*argv = cp;
462 	len = 0;
463 	/*
464 	 * Loop over pages, filling in the argument vector.
465 	 */
466 	while (addr < VM_MAXUSER_ADDRESS) {
467 		cc = NBPG - (addr & PGOFSET);
468 		if (maxcnt > 0 && cc > maxcnt - len)
469 			cc = maxcnt - len;;
470 		if (len + cc > kd->arglen) {
471 			register int off;
472 			register char **pp;
473 			register char *op = kd->argspc;
474 
475 			kd->arglen *= 2;
476 			kd->argspc = (char *)_kvm_realloc(kd, kd->argspc,
477 							  kd->arglen);
478 			if (kd->argspc == 0)
479 				return (0);
480 			cp = &kd->argspc[len];
481 			/*
482 			 * Adjust argv pointers in case realloc moved
483 			 * the string space.
484 			 */
485 			off = kd->argspc - op;
486 			for (pp = kd->argv; pp < argv; ++pp)
487 				*pp += off;
488 		}
489 		if (kvm_uread(kd, p, addr, cp, cc) != cc)
490 			/* XXX */
491 			return (0);
492 		len += cc;
493 		addr += cc;
494 
495 		if (maxcnt == 0 && len > 16 * NBPG)
496 			/* sanity */
497 			return (0);
498 
499 		while (--cc >= 0) {
500 			if (*cp++ == 0) {
501 				if (--narg <= 0) {
502 					*++argv = 0;
503 					return (kd->argv);
504 				} else
505 					*++argv = cp;
506 			}
507 		}
508 		if (maxcnt > 0 && len >= maxcnt) {
509 			/*
510 			 * We're stopping prematurely.  Terminate the
511 			 * argv and current string.
512 			 */
513 			*++argv = 0;
514 			*cp = 0;
515 			return (kd->argv);
516 		}
517 	}
518 }
519 
520 static void
521 ps_str_a(p, addr, n)
522 	struct ps_strings *p;
523 	u_long *addr;
524 	int *n;
525 {
526 	*addr = (u_long)p->ps_argvstr;
527 	*n = p->ps_nargvstr;
528 }
529 
530 static void
531 ps_str_e(p, addr, n)
532 	struct ps_strings *p;
533 	u_long *addr;
534 	int *n;
535 {
536 	*addr = (u_long)p->ps_envstr;
537 	*n = p->ps_nenvstr;
538 }
539 
540 /*
541  * Determine if the proc indicated by p is still active.
542  * This test is not 100% foolproof in theory, but chances of
543  * being wrong are very low.
544  */
545 static int
546 proc_verify(kd, kernp, p)
547 	kvm_t *kd;
548 	u_long kernp;
549 	const struct proc *p;
550 {
551 	struct proc kernproc;
552 
553 	/*
554 	 * Just read in the whole proc.  It's not that big relative
555 	 * to the cost of the read system call.
556 	 */
557 	if (kvm_read(kd, kernp, (char *)&kernproc, sizeof(kernproc)) !=
558 	    sizeof(kernproc))
559 		return (0);
560 	return (p->p_pid == kernproc.p_pid &&
561 		(kernproc.p_stat != SZOMB || p->p_stat == SZOMB));
562 }
563 
564 static char **
565 kvm_doargv(kd, kp, nchr, info)
566 	kvm_t *kd;
567 	const struct kinfo_proc *kp;
568 	int nchr;
569 	int (*info)(struct ps_strings*, u_long *, int *);
570 {
571 	register const struct proc *p = &kp->kp_proc;
572 	register char **ap;
573 	u_long addr;
574 	int cnt;
575 	struct ps_strings arginfo;
576 
577 	/*
578 	 * Pointers are stored at the top of the user stack.
579 	 */
580 	if (p->p_stat == SZOMB ||
581 	    kvm_uread(kd, p, USRSTACK - sizeof(arginfo), (char *)&arginfo,
582 		      sizeof(arginfo)) != sizeof(arginfo))
583 		return (0);
584 
585 	(*info)(&arginfo, &addr, &cnt);
586 	ap = kvm_argv(kd, p, addr, cnt, nchr);
587 	/*
588 	 * For live kernels, make sure this process didn't go away.
589 	 */
590 	if (ap != 0 && ISALIVE(kd) &&
591 	    !proc_verify(kd, (u_long)kp->kp_eproc.e_paddr, p))
592 		ap = 0;
593 	return (ap);
594 }
595 
596 /*
597  * Get the command args.  This code is now machine independent.
598  */
599 char **
600 kvm_getargv(kd, kp, nchr)
601 	kvm_t *kd;
602 	const struct kinfo_proc *kp;
603 	int nchr;
604 {
605 	return (kvm_doargv(kd, kp, nchr, ps_str_a));
606 }
607 
608 char **
609 kvm_getenvv(kd, kp, nchr)
610 	kvm_t *kd;
611 	const struct kinfo_proc *kp;
612 	int nchr;
613 {
614 	return (kvm_doargv(kd, kp, nchr, ps_str_e));
615 }
616 
617 /*
618  * Read from user space.  The user context is given by p.
619  */
620 ssize_t
621 kvm_uread(kd, p, uva, buf, len)
622 	kvm_t *kd;
623 	register struct proc *p;
624 	register u_long uva;
625 	register char *buf;
626 	register size_t len;
627 {
628 	register char *cp;
629 
630 	cp = buf;
631 	while (len > 0) {
632 		u_long pa;
633 		register int cc;
634 
635 		cc = _kvm_uvatop(kd, p, uva, &pa);
636 		if (cc > 0) {
637 			if (cc > len)
638 				cc = len;
639 			errno = 0;
640 			if (lseek(kd->pmfd, (off_t)pa, 0) == -1 && errno != 0) {
641 				_kvm_err(kd, 0, "invalid address (%x)", uva);
642 				break;
643 			}
644 			cc = read(kd->pmfd, cp, cc);
645 			if (cc < 0) {
646 				_kvm_syserr(kd, 0, _PATH_MEM);
647 				break;
648 			} else if (cc < len) {
649 				_kvm_err(kd, kd->program, "short read");
650 				break;
651 			}
652 		} else if (ISALIVE(kd)) {
653 			/* try swap */
654 			register char *dp;
655 			int cnt;
656 
657 			dp = kvm_readswap(kd, p, uva, &cnt);
658 			if (dp == 0) {
659 				_kvm_err(kd, 0, "invalid address (%x)", uva);
660 				return (0);
661 			}
662 			cc = MIN(cnt, len);
663 			bcopy(dp, cp, cc);
664 		} else
665 			break;
666 		cp += cc;
667 		uva += cc;
668 		len -= cc;
669 	}
670 	return (ssize_t)(cp - buf);
671 }
672