log: Correct missing free() on error in log_add_filter()

If there is a problem with the parameters to log_add_filter(), the memory
allocated is currently not freed. Fix this.

Reported-by: Coverity (CID: 171962)

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2018-04-02 02:42:39 -06:00 committed by Tom Rini
parent 004d00914a
commit 45fac9fc18

View file

@ -224,6 +224,7 @@ int log_add_filter(const char *drv_name, enum log_category_t cat_list[],
{ {
struct log_filter *filt; struct log_filter *filt;
struct log_device *ldev; struct log_device *ldev;
int ret;
int i; int i;
ldev = log_device_find_by_name(drv_name); ldev = log_device_find_by_name(drv_name);
@ -236,8 +237,10 @@ int log_add_filter(const char *drv_name, enum log_category_t cat_list[],
if (cat_list) { if (cat_list) {
filt->flags |= LOGFF_HAS_CAT; filt->flags |= LOGFF_HAS_CAT;
for (i = 0; ; i++) { for (i = 0; ; i++) {
if (i == ARRAY_SIZE(filt->cat_list)) if (i == ARRAY_SIZE(filt->cat_list)) {
return -ENOSPC; ret = -ENOSPC;
goto err;
}
filt->cat_list[i] = cat_list[i]; filt->cat_list[i] = cat_list[i];
if (cat_list[i] == LOGC_END) if (cat_list[i] == LOGC_END)
break; break;
@ -246,17 +249,19 @@ int log_add_filter(const char *drv_name, enum log_category_t cat_list[],
filt->max_level = max_level; filt->max_level = max_level;
if (file_list) { if (file_list) {
filt->file_list = strdup(file_list); filt->file_list = strdup(file_list);
if (!filt->file_list) if (!filt->file_list) {
goto nomem; ret = ENOMEM;
goto err;
}
} }
filt->filter_num = ldev->next_filter_num++; filt->filter_num = ldev->next_filter_num++;
list_add_tail(&filt->sibling_node, &ldev->filter_head); list_add_tail(&filt->sibling_node, &ldev->filter_head);
return filt->filter_num; return filt->filter_num;
nomem: err:
free(filt); free(filt);
return -ENOMEM; return ret;
} }
int log_remove_filter(const char *drv_name, int filter_num) int log_remove_filter(const char *drv_name, int filter_num)