Handle memory allocation failures in devstat_getdevs(), devstat_selectdevs(),
and devstat_buildmatch(). PR: bin/83359 Reviewed by: ken
This commit is contained in:
parent
aa1808b71f
commit
a18e46160b
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=229735
@ -365,6 +365,12 @@ devstat_getdevs(kvm_t *kd, struct statinfo *stats)
|
|||||||
dssize = (dinfo->numdevs * sizeof(struct devstat)) +
|
dssize = (dinfo->numdevs * sizeof(struct devstat)) +
|
||||||
sizeof(long);
|
sizeof(long);
|
||||||
dinfo->mem_ptr = (u_int8_t *)malloc(dssize);
|
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
|
} else
|
||||||
dssize = (dinfo->numdevs * sizeof(struct devstat)) +
|
dssize = (dinfo->numdevs * sizeof(struct devstat)) +
|
||||||
sizeof(long);
|
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.
|
* either enlarge or reduce the size of the device selection list.
|
||||||
*/
|
*/
|
||||||
} else if (*num_selections != numdevs) {
|
} 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));
|
numdevs * sizeof(struct device_selection));
|
||||||
*select_generation = current_generation;
|
*select_generation = current_generation;
|
||||||
init_selections = 1;
|
init_selections = 1;
|
||||||
@ -581,6 +587,13 @@ devstat_selectdevs(struct device_selection **dev_select, int *num_selected,
|
|||||||
init_selections = 1;
|
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
|
* 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
|
* 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)){
|
|| (perf_select != 0)) && (changed == 0)){
|
||||||
old_dev_select = (struct device_selection *)malloc(
|
old_dev_select = (struct device_selection *)malloc(
|
||||||
*num_selections * sizeof(struct device_selection));
|
*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;
|
old_num_selections = *num_selections;
|
||||||
bcopy(*dev_select, old_dev_select,
|
bcopy(*dev_select, old_dev_select,
|
||||||
sizeof(struct device_selection) * *num_selections);
|
sizeof(struct device_selection) * *num_selections);
|
||||||
@ -1028,16 +1047,17 @@ devstat_buildmatch(char *match_str, struct devstat_match **matches,
|
|||||||
return(-1);
|
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)
|
if (*num_matches == 0)
|
||||||
*matches = (struct devstat_match *)malloc(
|
*matches = NULL;
|
||||||
sizeof(struct devstat_match));
|
|
||||||
else
|
*matches = (struct devstat_match *)reallocf(*matches,
|
||||||
*matches = (struct devstat_match *)realloc(*matches,
|
sizeof(struct devstat_match) * (*num_matches + 1));
|
||||||
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 */
|
/* Make sure the current entry is clear */
|
||||||
bzero(&matches[0][*num_matches], sizeof(struct devstat_match));
|
bzero(&matches[0][*num_matches], sizeof(struct devstat_match));
|
||||||
|
Loading…
Reference in New Issue
Block a user