Handle memory allocation failures in devstat_getdevs(), devstat_selectdevs(),

and devstat_buildmatch().

PR:		bin/83359
Reviewed by:	ken
This commit is contained in:
Guy Helmer 2012-01-06 21:28:29 +00:00
parent aa1808b71f
commit a18e46160b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=229735

View File

@ -365,6 +365,12 @@ devstat_getdevs(kvm_t *kd, struct statinfo *stats)
dssize = (dinfo->numdevs * sizeof(struct devstat)) +
sizeof(long);
dinfo->mem_ptr = (u_int8_t *)malloc(dssize);
if (dinfo->mem_ptr == NULL) {
snprintf(devstat_errbuf, sizeof(devstat_errbuf),
"%s: Cannot allocate memory for mem_ptr element",
__func__);
return(-1);
}
} else
dssize = (dinfo->numdevs * sizeof(struct devstat)) +
sizeof(long);
@ -567,7 +573,7 @@ devstat_selectdevs(struct device_selection **dev_select, int *num_selected,
* either enlarge or reduce the size of the device selection list.
*/
} else if (*num_selections != numdevs) {
*dev_select = (struct device_selection *)realloc(*dev_select,
*dev_select = (struct device_selection *)reallocf(*dev_select,
numdevs * sizeof(struct device_selection));
*select_generation = current_generation;
init_selections = 1;
@ -581,6 +587,13 @@ devstat_selectdevs(struct device_selection **dev_select, int *num_selected,
init_selections = 1;
}
if (*dev_select == NULL) {
snprintf(devstat_errbuf, sizeof(devstat_errbuf),
"%s: Cannot (re)allocate memory for dev_select argument",
__func__);
return(-1);
}
/*
* If we're in "only" mode, we want to clear out the selected
* variable since we're going to select exactly what the user wants
@ -608,6 +621,12 @@ devstat_selectdevs(struct device_selection **dev_select, int *num_selected,
|| (perf_select != 0)) && (changed == 0)){
old_dev_select = (struct device_selection *)malloc(
*num_selections * sizeof(struct device_selection));
if (old_dev_select == NULL) {
snprintf(devstat_errbuf, sizeof(devstat_errbuf),
"%s: Cannot allocate memory for selection list backup",
__func__);
return(-1);
}
old_num_selections = *num_selections;
bcopy(*dev_select, old_dev_select,
sizeof(struct device_selection) * *num_selections);
@ -1028,16 +1047,17 @@ devstat_buildmatch(char *match_str, struct devstat_match **matches,
return(-1);
}
/*
* Since you can't realloc a pointer that hasn't been malloced
* first, we malloc first and then realloc.
*/
if (*num_matches == 0)
*matches = (struct devstat_match *)malloc(
sizeof(struct devstat_match));
else
*matches = (struct devstat_match *)realloc(*matches,
sizeof(struct devstat_match) * (*num_matches + 1));
*matches = NULL;
*matches = (struct devstat_match *)reallocf(*matches,
sizeof(struct devstat_match) * (*num_matches + 1));
if (*matches == NULL) {
snprintf(devstat_errbuf, sizeof(devstat_errbuf),
"%s: Cannot allocate memory for matches list", __func__);
return(-1);
}
/* Make sure the current entry is clear */
bzero(&matches[0][*num_matches], sizeof(struct devstat_match));