perf metricgroups: Use zfree() to reduce chances of use after free
authorArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 12 Apr 2023 12:50:08 +0000 (09:50 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 12 Apr 2023 13:17:58 +0000 (10:17 -0300)
Do defensive programming by using zfree() to initialize freed pointers
to NULL, so that eventual use after free result in a NULL pointer deref
instead of more subtle behaviour.

This file already used zfree() in other places, so this just plugs some
leftovers.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/metricgroup.c

index 5783f4c2d1eff799a713a506d5e88274d030055b..4b9a16291b96a6cf073ed8f8c3ed5a9b545898f8 100644 (file)
@@ -90,9 +90,9 @@ static void metric_event_delete(struct rblist *rblist __maybe_unused,
        struct metric_expr *expr, *tmp;
 
        list_for_each_entry_safe(expr, tmp, &me->head, nd) {
-               free((char *)expr->metric_name);
-               free(expr->metric_refs);
-               free(expr->metric_events);
+               zfree(&expr->metric_name);
+               zfree(&expr->metric_refs);
+               zfree(&expr->metric_events);
                free(expr);
        }
 
@@ -192,9 +192,9 @@ static void metric__free(struct metric *m)
        if (!m)
                return;
 
-       free(m->metric_refs);
+       zfree(&m->metric_refs);
        expr__ctx_free(m->pctx);
-       free((char *)m->modifier);
+       zfree(&m->modifier);
        evlist__delete(m->evlist);
        free(m);
 }
@@ -617,7 +617,7 @@ static int decode_all_metric_ids(struct evlist *perf_evlist, const char *modifie
                if (strstr(ev->name, "metric-id=")) {
                        bool has_slash = false;
 
-                       free(ev->name);
+                       zfree(&ev->name);
                        for (cur = strchr(sb.buf, '@') ; cur; cur = strchr(++cur, '@')) {
                                *cur = '/';
                                has_slash = true;
@@ -1760,7 +1760,7 @@ int metricgroup__copy_metric_events(struct evlist *evlist, struct cgroup *cgrp,
                        alloc_size = sizeof(*new_expr->metric_events);
                        new_expr->metric_events = calloc(nr + 1, alloc_size);
                        if (!new_expr->metric_events) {
-                               free(new_expr->metric_refs);
+                               zfree(&new_expr->metric_refs);
                                free(new_expr);
                                return -ENOMEM;
                        }
@@ -1770,8 +1770,8 @@ int metricgroup__copy_metric_events(struct evlist *evlist, struct cgroup *cgrp,
                                evsel = old_expr->metric_events[idx];
                                evsel = evlist__find_evsel(evlist, evsel->core.idx);
                                if (evsel == NULL) {
-                                       free(new_expr->metric_events);
-                                       free(new_expr->metric_refs);
+                                       zfree(&new_expr->metric_events);
+                                       zfree(&new_expr->metric_refs);
                                        free(new_expr);
                                        return -EINVAL;
                                }