summaryrefslogtreecommitdiffstats
path: root/lib/libkvm/kvm_proc.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>2001-08-24 09:43:44 +0000
committerpeter <peter@FreeBSD.org>2001-08-24 09:43:44 +0000
commit3d8ba935196e04a08362c17ab3a844795188cb2e (patch)
tree38fef53484c5f50dcf42dacca912eae514d651fe /lib/libkvm/kvm_proc.c
parent33e9a790f5a785742b1c550da5e7e0c48ac96032 (diff)
downloadFreeBSD-src-3d8ba935196e04a08362c17ab3a844795188cb2e.zip
FreeBSD-src-3d8ba935196e04a08362c17ab3a844795188cb2e.tar.gz
Make ps -M corefile work again. This has been broken for quite some time.
kvm_proclist() was aborting when it saw the ithreads with no pgrp.
Diffstat (limited to 'lib/libkvm/kvm_proc.c')
-rw-r--r--lib/libkvm/kvm_proc.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/lib/libkvm/kvm_proc.c b/lib/libkvm/kvm_proc.c
index b45aec2..b779284 100644
--- a/lib/libkvm/kvm_proc.c
+++ b/lib/libkvm/kvm_proc.c
@@ -122,6 +122,7 @@ kvm_proclist(kd, what, arg, p, bp, maxcnt)
kp = &kinfo_proc;
kp->ki_structsize = sizeof(kinfo_proc);
for (; cnt < maxcnt && p != NULL; p = LIST_NEXT(&proc, p_list)) {
+ memset(kp, 0, sizeof *kp);
if (KREAD(kd, (u_long)p, &proc)) {
_kvm_err(kd, kd->program, "can't read proc at %x", p);
return (-1);
@@ -196,11 +197,6 @@ kvm_proclist(kd, what, arg, p, bp, maxcnt)
pstats.p_cru.ru_utime.tv_usec +
pstats.p_cru.ru_stime.tv_usec;
}
- if (KREAD(kd, (u_long)proc.p_pgrp, &pgrp)) {
- _kvm_err(kd, kd->program, "can't read pgrp at %x",
- proc.p_pgrp);
- return (-1);
- }
if (proc.p_oppid)
kp->ki_ppid = proc.p_oppid;
else if (proc.p_pptr) {
@@ -212,6 +208,13 @@ kvm_proclist(kd, what, arg, p, bp, maxcnt)
kp->ki_ppid = pproc.p_pid;
} else
kp->ki_ppid = 0;
+ if (proc.p_pgrp == NULL)
+ goto nopgrp;
+ if (KREAD(kd, (u_long)proc.p_pgrp, &pgrp)) {
+ _kvm_err(kd, kd->program, "can't read pgrp at %x",
+ proc.p_pgrp);
+ return (-1);
+ }
kp->ki_pgid = pgrp.pg_id;
kp->ki_jobc = pgrp.pg_jobc;
if (KREAD(kd, (u_long)pgrp.pg_session, &sess)) {
@@ -251,8 +254,10 @@ kvm_proclist(kd, what, arg, p, bp, maxcnt)
}
kp->ki_tsid = sess.s_sid;
}
- } else
+ } else {
+nopgrp:
kp->ki_tdev = NODEV;
+ }
if (proc.p_wmesg)
(void)kvm_read(kd, (u_long)proc.p_wmesg,
kp->ki_wmesg, WMESGLEN);
OpenPOWER on IntegriCloud