From: Karel Zak Date: Tue, 23 Jun 2026 09:07:30 +0000 (+0200) Subject: libsmartcols: fix memory leak in filter reset X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=27e262dee792363fd8395bcf427463d47e634f25;p=thirdparty%2Futil-linux.git libsmartcols: fix memory leak in filter reset When parsing fails, filter params allocated during parsing but never incorporated into the AST tree remain on the fltr->params list. The reset_filter() only freed the tree via fltr->root, leaving orphaned params leaked. Add filter_free_params() to drain any remaining params from the list during filter reset. Addresses: https://github.com/util-linux/util-linux/pull/4430 Signed-off-by: Karel Zak --- diff --git a/libsmartcols/src/filter-param.c b/libsmartcols/src/filter-param.c index d83977bcf..9cec0d39d 100644 --- a/libsmartcols/src/filter-param.c +++ b/libsmartcols/src/filter-param.c @@ -199,6 +199,16 @@ void filter_free_param(struct filter_param *n) free(n); } +void filter_free_params(struct libscols_filter *fltr) +{ + while (!list_empty(&fltr->params)) { + struct filter_param *n = list_entry(fltr->params.next, + struct filter_param, pr_params); + filter_unref_node((struct filter_node *) n); + } + INIT_LIST_HEAD(&fltr->params); +} + int filter_param_get_datatype(struct filter_param *n) { return n ? n->type : SCOLS_DATA_NONE; diff --git a/libsmartcols/src/filter.c b/libsmartcols/src/filter.c index 011b21c22..125e0246f 100644 --- a/libsmartcols/src/filter.c +++ b/libsmartcols/src/filter.c @@ -76,6 +76,8 @@ static void reset_filter(struct libscols_filter *fltr) filter_unref_node(fltr->root); fltr->root = NULL; + filter_free_params(fltr); + if (fltr->src) fclose(fltr->src); fltr->src = NULL; diff --git a/libsmartcols/src/smartcolsP.h b/libsmartcols/src/smartcolsP.h index 3df44bc2e..ac6923693 100644 --- a/libsmartcols/src/smartcolsP.h +++ b/libsmartcols/src/smartcolsP.h @@ -574,6 +574,7 @@ void filter_dump_param(struct ul_jsonwrt *json, struct filter_param *n); int filter_eval_param(struct libscols_filter *fltr, struct libscols_line *ln, struct filter_param *n, int *status); void filter_free_param(struct filter_param *n); +void filter_free_params(struct libscols_filter *fltr); int filter_param_reset_holder(struct filter_param *n); int filter_param_get_datatype(struct filter_param *n);