diff options
author | 2014-10-15 02:03:05 +0000 | |
---|---|---|
committer | 2014-10-15 02:03:05 +0000 | |
commit | f4ccacb317d6bfa5aefc0d618104deeaf2b34bfa (patch) | |
tree | 706110ccd90acf35732283e3a420e1732e114424 /lib/libkvm | |
parent | create a REALLOCARRAY macro, and use it where it gives us overflow (diff) | |
download | wireguard-openbsd-f4ccacb317d6bfa5aefc0d618104deeaf2b34bfa.tar.xz wireguard-openbsd-f4ccacb317d6bfa5aefc0d618104deeaf2b34bfa.zip |
Apply reallocarray() idiom.
ok guenther
Diffstat (limited to 'lib/libkvm')
-rw-r--r-- | lib/libkvm/kvm_file2.c | 16 | ||||
-rw-r--r-- | lib/libkvm/kvm_private.h | 4 | ||||
-rw-r--r-- | lib/libkvm/kvm_proc.c | 20 | ||||
-rw-r--r-- | lib/libkvm/kvm_proc2.c | 4 |
4 files changed, 23 insertions, 21 deletions
diff --git a/lib/libkvm/kvm_file2.c b/lib/libkvm/kvm_file2.c index 0930a13048a..294b426901f 100644 --- a/lib/libkvm/kvm_file2.c +++ b/lib/libkvm/kvm_file2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kvm_file2.c,v 1.36 2014/07/04 05:58:31 guenther Exp $ */ +/* $OpenBSD: kvm_file2.c,v 1.37 2014/10/15 02:03:05 deraadt Exp $ */ /* * Copyright (c) 2009 Todd C. Miller <Todd.Miller@courtesan.com> @@ -227,11 +227,11 @@ kvm_deadfile_byfile(kvm_t *kd, int op, int arg, size_t esize, int *cnt) _kvm_err(kd, kd->program, "can't read nfiles"); return (NULL); } - buflen = nfiles * esize; - where = _kvm_malloc(kd, buflen); + where = _kvm_reallocarray(kd, NULL, nfiles, esize); kd->filebase = (void *)where; if (kd->filebase == NULL) return (NULL); + buflen = nfiles * esize; for (fp = LIST_FIRST(&filehead); fp != NULL && esize <= buflen; @@ -300,11 +300,11 @@ kvm_deadfile_byid(kvm_t *kd, int op, int arg, size_t esize, int *cnt) return (NULL); } /* this may be more room than we need but counting is expensive */ - buflen = (nfiles + 10) * esize; - where = _kvm_malloc(kd, buflen); + where = _kvm_reallocarray(kd, NULL, nfiles + 10, esize); kd->filebase = (void *)where; if (kd->filebase == NULL) return (NULL); + buflen = (nfiles + 10) * esize; for (pr = LIST_FIRST(&allprocess); pr != NULL; @@ -358,9 +358,11 @@ kvm_deadfile_byid(kvm_t *kd, int op, int arg, size_t esize, int *cnt) filed.fd_ofiles = filed0.fd_dfiles; filed.fd_ofileflags = filed0.fd_dfileflags; } else { - size_t fsize = filed.fd_nfiles * OFILESIZE; - char *tmp = realloc(filebuf, fsize); + size_t fsize; + char *tmp = reallocarray(filebuf, + filed.fd_nfiles, OFILESIZE); + fsize = filed.fd_nfiles * OFILESIZE; if (tmp == NULL) { _kvm_syserr(kd, kd->program, "realloc ofiles"); goto cleanup; diff --git a/lib/libkvm/kvm_private.h b/lib/libkvm/kvm_private.h index 967f4e5cb9b..e11501aaf7b 100644 --- a/lib/libkvm/kvm_private.h +++ b/lib/libkvm/kvm_private.h @@ -1,4 +1,4 @@ -/* $OpenBSD: kvm_private.h,v 1.22 2013/11/17 20:27:14 guenther Exp $ */ +/* $OpenBSD: kvm_private.h,v 1.23 2014/10/15 02:03:05 deraadt Exp $ */ /* $NetBSD: kvm_private.h,v 1.7 1996/05/05 04:32:15 gwr Exp $ */ /*- @@ -99,7 +99,7 @@ int _kvm_initvtop(kvm_t *); int _kvm_kvatop(kvm_t *, u_long, paddr_t *); void *_kvm_malloc(kvm_t *kd, size_t); off_t _kvm_pa2off(kvm_t *, paddr_t); -void *_kvm_realloc(kvm_t *kd, void *, size_t); +void *_kvm_reallocarray(kvm_t *kd, void *, size_t, size_t); void _kvm_syserr(kvm_t *kd, const char *program, const char *fmt, ...) __attribute__((__format__ (printf, 3, 4))); ssize_t _kvm_pread(kvm_t *, int, void *, size_t, off_t); diff --git a/lib/libkvm/kvm_proc.c b/lib/libkvm/kvm_proc.c index 66dc14d2746..fa1858211d4 100644 --- a/lib/libkvm/kvm_proc.c +++ b/lib/libkvm/kvm_proc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kvm_proc.c,v 1.50 2014/07/04 05:58:31 guenther Exp $ */ +/* $OpenBSD: kvm_proc.c,v 1.51 2014/10/15 02:03:05 deraadt Exp $ */ /* $NetBSD: kvm_proc.c,v 1.30 1999/03/24 05:50:50 mrg Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -194,9 +194,9 @@ _kvm_ureadm(kvm_t *kd, const struct kinfo_proc *p, u_long va, u_long *cnt) } void * -_kvm_realloc(kvm_t *kd, void *p, size_t n) +_kvm_reallocarray(kvm_t *kd, void *p, size_t i, size_t n) { - void *np = (void *)realloc(p, n); + void *np = reallocarray(p, i, n); if (np == 0) _kvm_err(kd, kd->program, "out of memory"); @@ -229,13 +229,13 @@ kvm_argv(kvm_t *kd, const struct kinfo_proc *p, u_long addr, int narg, * Try to avoid reallocs. */ kd->argc = MAX(narg + 1, 32); - kd->argv = _kvm_malloc(kd, kd->argc * + kd->argv = _kvm_reallocarray(kd, NULL, kd->argc, sizeof(*kd->argv)); if (kd->argv == 0) return (0); } else if (narg + 1 > kd->argc) { kd->argc = MAX(2 * kd->argc, narg + 1); - kd->argv = (char **)_kvm_realloc(kd, kd->argv, kd->argc * + kd->argv = (char **)_kvm_reallocarray(kd, kd->argv, kd->argc, sizeof(*kd->argv)); if (kd->argv == 0) return (0); @@ -282,11 +282,11 @@ kvm_argv(kvm_t *kd, const struct kinfo_proc *p, u_long addr, int narg, char **pp; char *op = kd->argspc; - kd->arglen *= 2; - kd->argspc = (char *)_kvm_realloc(kd, kd->argspc, - kd->arglen); + kd->argspc = _kvm_reallocarray(kd, kd->argspc, + kd->arglen, 2); if (kd->argspc == 0) return (0); + kd->arglen *= 2; /* * Adjust argv pointers in case realloc moved * the string space. @@ -426,10 +426,10 @@ again: len = orglen; ret = (sysctl(mib, 4, kd->argbuf, &len, NULL, 0) < 0); if (ret && errno == ENOMEM) { - orglen *= 2; - buf = _kvm_realloc(kd, kd->argbuf, orglen); + buf = _kvm_reallocarray(kd, kd->argbuf, orglen, 2); if (buf == NULL) return (NULL); + orglen *= 2; kd->argbuf = buf; goto again; } diff --git a/lib/libkvm/kvm_proc2.c b/lib/libkvm/kvm_proc2.c index 04270782b93..50e5521631f 100644 --- a/lib/libkvm/kvm_proc2.c +++ b/lib/libkvm/kvm_proc2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kvm_proc2.c,v 1.24 2014/07/08 23:31:22 deraadt Exp $ */ +/* $OpenBSD: kvm_proc2.c,v 1.25 2014/10/15 02:03:05 deraadt Exp $ */ /* $NetBSD: kvm_proc.c,v 1.30 1999/03/24 05:50:50 mrg Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -471,7 +471,7 @@ kvm_getprocs(kvm_t *kd, int op, int arg, size_t esize, int *cnt) } maxthread += maxprocess; - kd->procbase = _kvm_malloc(kd, maxthread * esize); + kd->procbase = _kvm_reallocarray(kd, NULL, maxthread, esize); if (kd->procbase == 0) return (NULL); bp = (char *)kd->procbase; |