Hi all.
The "p = realloc(p, size)" idiom is obviously wrong. Since both
places to be fixed were similar, I went further and unified the code
as well.
Note that "argv" is later initialized from kd->argv, so there is
no problem in reusing it here.
The amd64 is happy. Okay?
--
WBR,
Vadim Zhukov
Index: kvm_proc.c
===================================================================
RCS file: /cvs/src/lib/libkvm/kvm_proc.c,v
retrieving revision 1.58
diff -u -p -r1.58 kvm_proc.c
--- kvm_proc.c 7 Nov 2016 00:26:33 -0000 1.58
+++ kvm_proc.c 1 May 2018 18:41:59 -0000
@@ -262,6 +262,7 @@ kvm_argv(kvm_t *kd, const struct kinfo_p
char *np, *cp, *ep, *ap, **argv;
u_long oaddr = -1;
int len, cc;
+ size_t argc;
/*
* Check that there aren't an unreasonable number of arguments,
@@ -270,22 +271,19 @@ kvm_argv(kvm_t *kd, const struct kinfo_p
if (narg > ARG_MAX || addr < VM_MIN_ADDRESS || addr >=
VM_MAXUSER_ADDRESS)
return (0);
- if (kd->argv == 0) {
- /*
- * Try to avoid reallocs.
- */
- kd->argc = MAX(narg + 1, 32);
- 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_reallocarray(kd, kd->argv, kd->argc,
- sizeof(*kd->argv));
- if (kd->argv == 0)
- return (0);
- }
+ if (kd->argv == 0)
+ argc = MAX(narg + 1, 32);
+ else if (narg + 1 > kd->argc)
+ argc = MAX(2 * kd->argc, narg + 1);
+ else
+ goto argv_allocated;
+ argv = _kvm_reallocarray(kd, kd->argv, argc, sizeof(*kd->argv));
+ if (argv == 0)
+ return (0);
+ kd->argv = argv;
+ kd->argc = argc;
+
+argv_allocated:
if (kd->argspc == 0) {
kd->argspc = _kvm_malloc(kd, kd->nbpg);
if (kd->argspc == 0)