diff options
author | peter <peter@FreeBSD.org> | 2001-08-24 09:43:44 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 2001-08-24 09:43:44 +0000 |
commit | 3d8ba935196e04a08362c17ab3a844795188cb2e (patch) | |
tree | 38fef53484c5f50dcf42dacca912eae514d651fe /lib | |
parent | 33e9a790f5a785742b1c550da5e7e0c48ac96032 (diff) | |
download | FreeBSD-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')
-rw-r--r-- | lib/libkvm/kvm_proc.c | 17 |
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); |