MFC r298839:

Fix memory allocation edgecases in kvm_argv(..)

- Don't leak nbufp on realloc failure in kvm_argv
- Catch malloc errors with bufp
- Set buflen last in the "buflen == 0" case to ensure that
  bufp/nbufp is properly reallocated on the next go around
This commit is contained in:
Enji Cooper 2016-05-13 09:52:39 +00:00
parent f8484a99b0
commit 004a4859b2
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/stable/10/; revision=299651

View File

@ -642,6 +642,7 @@ kvm_argv(kvm_t *kd, const struct kinfo_proc *kp, int env, int nchr)
static char *buf, *p;
static char **bufp;
static int argc;
char **nbufp;
if (!ISALIVE(kd)) {
_kvm_err(kd, kd->program,
@ -657,9 +658,15 @@ kvm_argv(kvm_t *kd, const struct kinfo_proc *kp, int env, int nchr)
_kvm_err(kd, kd->program, "cannot allocate memory");
return (0);
}
buflen = nchr;
argc = 32;
bufp = malloc(sizeof(char *) * argc);
if (bufp == NULL) {
free(buf);
buf = NULL;
_kvm_err(kd, kd->program, "cannot allocate memory");
return (NULL);
}
buflen = nchr;
} else if (nchr > buflen) {
p = realloc(buf, nchr);
if (p != NULL) {
@ -693,8 +700,10 @@ kvm_argv(kvm_t *kd, const struct kinfo_proc *kp, int env, int nchr)
p += strlen(p) + 1;
if (i >= argc) {
argc += argc;
bufp = realloc(bufp,
sizeof(char *) * argc);
nbufp = realloc(bufp, sizeof(char *) * argc);
if (nbufp == NULL)
return (NULL);
bufp = nbufp;
}
} while (p < buf + bufsz);
bufp[i++] = 0;