? 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.55 diff -u -p -r1.55 kvm.c --- kvm.c 11 May 2015 00:42:54 -0000 1.55 +++ kvm.c 2 Sep 2015 01:50:58 -0000 @@ -163,6 +163,14 @@ _kvm_malloc(kvm_t *kd, size_t n) return (p); } +void * +_kvm_realloc(kvm_t *kd, void *p, size_t n) +{ + if ((p = realloc(p, n)) == NULL) + _kvm_err(kd, kd->program, "%s", strerror(errno)); + return (p); +} + static kvm_t * _kvm_open(kvm_t *kd, const char *uf, const char *mf, const char *sf, int flag, char *errout) @@ -175,7 +183,7 @@ _kvm_open(kvm_t *kd, const char *uf, con kd->swfd = -1; kd->nlfd = -1; kd->alive = 0; - kd->filebase = 0; + kd->filebase = NULL; kd->procbase = 0; kd->nbpg = getpagesize(); kd->swapspc = 0; @@ -645,8 +653,7 @@ kvm_close(kvm_t *kd) free((void *)kd->cpu_data); if (kd->kcore_hdr != NULL) free((void *)kd->kcore_hdr); - if (kd->filebase != 0) - free((void *)kd->filebase); + free(kd->filebase); if (kd->procbase != 0) free((void *)kd->procbase); if (kd->swapspc != 0) Index: kvm_file2.c =================================================================== RCS file: /cvs/src/lib/libkvm/kvm_file2.c,v retrieving revision 1.46 diff -u -p -r1.46 kvm_file2.c --- kvm_file2.c 28 Aug 2015 04:38:47 -0000 1.46 +++ kvm_file2.c 2 Sep 2015 01:50:58 -0000 @@ -114,6 +114,7 @@ #include #include #include +#include #include "kvm_private.h" #include "kvm_file.h" @@ -132,44 +133,46 @@ struct kinfo_file * kvm_getfiles(kvm_t *kd, int op, int arg, size_t esize, int *cnt) { int mib[6], rv; + void *filebase; size_t size; - if (kd->filebase != NULL) { - free(kd->filebase); - /* - * Clear this pointer in case this call fails. Otherwise, - * kvm_close() will free it again. - */ - kd->filebase = 0; - } - if (ISALIVE(kd)) { mib[0] = CTL_KERN; mib[1] = KERN_FILE; mib[2] = op; mib[3] = arg; mib[4] = esize; - mib[5] = 0; - /* find size and alloc buffer */ - rv = sysctl(mib, 6, NULL, &size, NULL, 0); - if (rv == -1) { - if (kd->vmfd != -1) - goto deadway; - _kvm_syserr(kd, kd->program, "kvm_getfiles"); - return (NULL); - } - kd->filebase = _kvm_malloc(kd, size); - if (kd->filebase == NULL) - return (NULL); + do { + mib[5] = 0; + + /* find size and alloc buffer */ + rv = sysctl(mib, 6, NULL, &size, NULL, 0); + if (rv == -1) { + if (kd->vmfd != -1) + goto deadway; + _kvm_syserr(kd, kd->program, "kvm_getfiles"); + return (NULL); + } + + size += size >> 3; /* add ~10% */ + + filebase = _kvm_realloc(kd, kd->filebase, size); + if (filebase == NULL) + return (NULL); + + kd->filebase = filebase; + + /* get actual data */ + mib[5] = size / esize; + rv = sysctl(mib, 6, kd->filebase, &size, NULL, 0); + if (rv == -1 && errno != ENOMEM) { + _kvm_syserr(kd, kd->program, + "kvm_getfiles"); + return (NULL); + } + } while (rv == -1); - /* get actual data */ - mib[5] = size / esize; - rv = sysctl(mib, 6, kd->filebase, &size, NULL, 0); - if (rv == -1) { - _kvm_syserr(kd, kd->program, "kvm_getfiles"); - return (NULL); - } *cnt = size / esize; return (kd->filebase); } else { @@ -224,10 +227,11 @@ kvm_deadfile_byfile(kvm_t *kd, int op, i _kvm_err(kd, kd->program, "can't read nfiles"); return (NULL); } - where = _kvm_reallocarray(kd, NULL, nfiles, esize); - kd->filebase = (void *)where; - if (kd->filebase == NULL) + where = _kvm_reallocarray(kd, kd->filebase, nfiles, esize); + if (where == NULL) return (NULL); + + kd->filebase = (void *)where; buflen = nfiles * esize; for (fp = LIST_FIRST(&filehead); @@ -301,10 +305,11 @@ kvm_deadfile_byid(kvm_t *kd, int op, int return (NULL); } /* this may be more room than we need but counting is expensive */ - where = _kvm_reallocarray(kd, NULL, nfiles + 10, esize); - kd->filebase = (void *)where; - if (kd->filebase == NULL) + where = _kvm_reallocarray(kd, kd->filebase, nfiles + 10, esize); + if (where == NULL) return (NULL); + + kd->filebase = (void *)where; buflen = (nfiles + 10) * esize; for (pr = LIST_FIRST(&allprocess); Index: kvm_private.h =================================================================== RCS file: /cvs/src/lib/libkvm/kvm_private.h,v retrieving revision 1.23 diff -u -p -r1.23 kvm_private.h --- kvm_private.h 15 Oct 2014 02:03:05 -0000 1.23 +++ kvm_private.h 2 Sep 2015 01:50:58 -0000 @@ -98,6 +98,7 @@ void _kvm_freevtop(kvm_t *); int _kvm_initvtop(kvm_t *); int _kvm_kvatop(kvm_t *, u_long, paddr_t *); void *_kvm_malloc(kvm_t *kd, size_t); +void *_kvm_realloc(kvm_t *kd, void *, size_t); off_t _kvm_pa2off(kvm_t *, paddr_t); void *_kvm_reallocarray(kvm_t *kd, void *, size_t, size_t); void _kvm_syserr(kvm_t *kd, const char *program, const char *fmt, ...)