mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-11-27 09:12:44 +00:00
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:
parent
f8484a99b0
commit
004a4859b2
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/stable/10/; revision=299651
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user