? kvm.po ? kvm_cd9660.po ? kvm_file2.po ? kvm_getloadavg.po ? kvm_ntfs.po ? kvm_proc.po ? kvm_proc2.po ? kvm_sparc64.po ? kvm_udf.po ? libkvm.so.16.1 Index: kvm.c =================================================================== RCS file: /cvs/src/lib/libkvm/kvm.c,v retrieving revision 1.57 diff -u -p -r1.57 kvm.c --- kvm.c 4 Sep 2015 02:58:14 -0000 1.57 +++ kvm.c 5 Sep 2015 07:39:48 -0000 @@ -184,7 +184,7 @@ _kvm_open(kvm_t *kd, const char *uf, con kd->nlfd = -1; kd->alive = 0; kd->filebase = NULL; - kd->procbase = 0; + kd->procbase = NULL; kd->nbpg = getpagesize(); kd->swapspc = 0; kd->argspc = 0; @@ -654,8 +654,7 @@ kvm_close(kvm_t *kd) if (kd->kcore_hdr != NULL) free((void *)kd->kcore_hdr); free(kd->filebase); - if (kd->procbase != 0) - free((void *)kd->procbase); + free(kd->procbase); if (kd->swapspc != 0) free((void *)kd->swapspc); if (kd->argspc != 0) Index: kvm_proc2.c =================================================================== RCS file: /cvs/src/lib/libkvm/kvm_proc2.c,v retrieving revision 1.25 diff -u -p -r1.25 kvm_proc2.c --- kvm_proc2.c 15 Oct 2014 02:03:05 -0000 1.25 +++ kvm_proc2.c 5 Sep 2015 07:39:48 -0000 @@ -397,20 +397,12 @@ struct kinfo_proc * kvm_getprocs(kvm_t *kd, int op, int arg, size_t esize, int *cnt) { int mib[6], st, nthreads; + void *procbase; size_t size; if ((ssize_t)esize < 0) return (NULL); - if (kd->procbase != NULL) { - free(kd->procbase); - /* - * Clear this pointer in case this call fails. Otherwise, - * kvm_close() will free it again. - */ - kd->procbase = 0; - } - if (ISALIVE(kd)) { size = 0; mib[0] = CTL_KERN; @@ -418,22 +410,31 @@ kvm_getprocs(kvm_t *kd, int op, int arg, mib[2] = op; mib[3] = arg; mib[4] = esize; - mib[5] = 0; - st = sysctl(mib, 6, NULL, &size, NULL, 0); - if (st == -1) { - _kvm_syserr(kd, kd->program, "kvm_getprocs"); - return (NULL); - } - - mib[5] = size / esize; - kd->procbase = _kvm_malloc(kd, size); - if (kd->procbase == 0) - return (NULL); - st = sysctl(mib, 6, kd->procbase, &size, NULL, 0); - if (st == -1) { - _kvm_syserr(kd, kd->program, "kvm_getprocs"); - return (NULL); - } + + do { + mib[5] = 0; + st = sysctl(mib, 6, NULL, &size, NULL, 0); + if (st == -1) { + _kvm_syserr(kd, kd->program, "kvm_getprocs"); + return (NULL); + } + + size += size / 8; /* add ~10% */ + + procbase = _kvm_realloc(kd, kd->procbase, size); + if (procbase == NULL) + return (NULL); + + kd->procbase = procbase; + + mib[5] = size / esize; + st = sysctl(mib, 6, kd->procbase, &size, NULL, 0); + if (st == -1) { + _kvm_syserr(kd, kd->program, "kvm_getprocs"); + return (NULL); + } + } while (st == -1); + nthreads = size / esize; } else { struct nlist nl[5];