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)

Reply via email to