]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libsmartcols: fix memory leak in filter reset
authorKarel Zak <kzak@redhat.com>
Tue, 23 Jun 2026 09:07:30 +0000 (11:07 +0200)
committerKarel Zak <kzak@redhat.com>
Wed, 24 Jun 2026 09:20:15 +0000 (11:20 +0200)
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>
libsmartcols/src/filter-param.c
libsmartcols/src/filter.c
libsmartcols/src/smartcolsP.h

index d83977bcf8b51f0674e45ffc028c50c4d4b3736b..9cec0d39dafa44426b02dbbae05a6b2236771b27 100644 (file)
@@ -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;
index 011b21c22c3938f40fc3b96186251d29d0490e78..125e0246f5b3c70b20b8ab5b305731ba80e7dd26 100644 (file)
@@ -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;
index 3df44bc2eb80957d562f18af72176b174767da06..ac6923693094580f7fcd5eff6d788dc89c5c8444 100644 (file)
@@ -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);