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 <kzak@redhat.com>
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;
filter_unref_node(fltr->root);
fltr->root = NULL;
+ filter_free_params(fltr);
+
if (fltr->src)
fclose(fltr->src);
fltr->src = NULL;
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);