Created
March 15, 2014 13:37
-
-
Save tuxillo/9567392 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/lib/libkvm/kvm_proc.c b/lib/libkvm/kvm_proc.c | |
index 6b64ea1..3c22bd8 100644 | |
--- a/lib/libkvm/kvm_proc.c | |
+++ b/lib/libkvm/kvm_proc.c | |
@@ -423,35 +423,52 @@ kvm_proclist(kvm_t *kd, int what, int arg, struct proc *p, | |
*/ | |
static int | |
kvm_deadprocs(kvm_t *kd, int what, int arg, u_long a_allproc, | |
- u_long a_zombproc) | |
+ int allproc_hsize) | |
{ | |
- struct kinfo_proc *bp = kd->procbase; | |
- int acnt, zcnt; | |
+ struct kinfo_proc *bp; | |
struct proc *p; | |
+ struct proclist **pl; | |
+ int cnt, partcnt, n; | |
+ u_long nextoff; | |
- if (KREAD(kd, a_allproc, &p)) { | |
- _kvm_err(kd, kd->program, "cannot read allproc"); | |
- return (-1); | |
- } | |
- acnt = kvm_proclist(kd, what, arg, p, bp); | |
- if (acnt < 0) | |
- return (acnt); | |
+ cnt = partcnt = 0; | |
+ nextoff = 0; | |
+ | |
+ /* | |
+ * Dynamically allocate space for all the elements of the | |
+ * allprocs array and KREAD() them. | |
+ */ | |
+ pl = _kvm_malloc(kd, allproc_hsize * sizeof(struct proclist *)); | |
+ for (n = 0; n < allproc_hsize; n++) { | |
+ pl[n] = _kvm_malloc(kd, sizeof(struct proclist)); | |
+ nextoff = a_allproc + (n * sizeof(struct proclist)); | |
+ if (KREAD(kd, (u_long)nextoff, pl[n])) { | |
+ _kvm_err(kd, kd->program, "can't read proclist at 0x%lx", | |
+ a_allproc); | |
+ return (-1); | |
+ } | |
+ | |
+ /* Ignore empty proclists */ | |
+ if (LIST_EMPTY(pl[n])) | |
+ continue; | |
+ | |
+ bp = kd->procbase + cnt; | |
+ p = pl[n]->lh_first; | |
+ partcnt = kvm_proclist(kd, what, arg, p, bp); | |
+ if (partcnt < 0) | |
+ return (partcnt); | |
- if (KREAD(kd, a_zombproc, &p)) { | |
- _kvm_err(kd, kd->program, "cannot read zombproc"); | |
- return (-1); | |
+ cnt += partcnt; | |
+ free(pl[n]); | |
} | |
- zcnt = kvm_proclist(kd, what, arg, p, bp + acnt); | |
- if (zcnt < 0) | |
- zcnt = 0; | |
- return (acnt + zcnt); | |
+ return (cnt); | |
} | |
struct kinfo_proc * | |
kvm_getprocs(kvm_t *kd, int op, int arg, int *cnt) | |
{ | |
- int mib[4], st, nprocs; | |
+ int mib[4], st, nprocs, allproc_hsize; | |
int miblen = ((op & ~KERN_PROC_FLAGMASK) == KERN_PROC_ALL) ? 3 : 4; | |
size_t size; | |
@@ -497,9 +514,9 @@ kvm_getprocs(kvm_t *kd, int op, int arg, int *cnt) | |
struct nlist nl[4], *p; | |
nl[0].n_name = "_nprocs"; | |
- nl[1].n_name = "_allproc"; | |
- nl[2].n_name = "_zombproc"; | |
- nl[3].n_name = 0; | |
+ nl[1].n_name = "_allprocs"; | |
+ nl[2].n_name = "_allproc_hsize"; | |
+ nl[2].n_name = 0; | |
if (kvm_nlist(kd, nl) != 0) { | |
for (p = nl; p->n_type != 0; ++p) | |
@@ -512,8 +529,12 @@ kvm_getprocs(kvm_t *kd, int op, int arg, int *cnt) | |
_kvm_err(kd, kd->program, "can't read nprocs"); | |
return (0); | |
} | |
+ if (KREAD(kd, nl[2].n_value, &allproc_hsize)) { | |
+ _kvm_err(kd, kd->program, "can't read allproc_hsize"); | |
+ return (0); | |
+ } | |
nprocs = kvm_deadprocs(kd, op, arg, nl[1].n_value, | |
- nl[2].n_value); | |
+ allproc_hsize); | |
#ifdef notdef | |
size = nprocs * sizeof(struct kinfo_proc); | |
(void)realloc(kd->procbase, size); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment