From: Masami Hiramatsu (Google) <[email protected]>

In paths where tracing_map_elt_alloc() failed to allocate objects,
the map->ops->elt_alloc() call was never successful. In this case,
map->ops->elt_free() should not be called.

This bug was found by Sashiko.
Link: https://sashiko.dev/#/patchset/20260520223101.34710-1-rosenp%40gmail.com

Fixes: 2734b629525a ("tracing: Add per-element variable support to tracing_map")
Signed-off-by: Masami Hiramatsu (Google) <[email protected]>
Cc: [email protected]
---
 kernel/trace/tracing_map.c |   17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/kernel/trace/tracing_map.c b/kernel/trace/tracing_map.c
index bf1a507695b6..0dd7927df22a 100644
--- a/kernel/trace/tracing_map.c
+++ b/kernel/trace/tracing_map.c
@@ -386,13 +386,11 @@ static void tracing_map_elt_init_fields(struct 
tracing_map_elt *elt)
        }
 }
 
-static void tracing_map_elt_free(struct tracing_map_elt *elt)
+static void __tracing_map_elt_free(struct tracing_map_elt *elt)
 {
        if (!elt)
                return;
 
-       if (elt->map->ops && elt->map->ops->elt_free)
-               elt->map->ops->elt_free(elt);
        kfree(elt->fields);
        kfree(elt->vars);
        kfree(elt->var_set);
@@ -400,6 +398,17 @@ static void tracing_map_elt_free(struct tracing_map_elt 
*elt)
        kfree(elt);
 }
 
+static void tracing_map_elt_free(struct tracing_map_elt *elt)
+{
+       if (!elt)
+               return;
+
+       /* Only objects initialized with alloc_elt() should be passed to 
free_elt().*/
+       if (elt->map->ops && elt->map->ops->elt_free)
+               elt->map->ops->elt_free(elt);
+       __tracing_map_elt_free(elt);
+}
+
 static struct tracing_map_elt *tracing_map_elt_alloc(struct tracing_map *map)
 {
        struct tracing_map_elt *elt;
@@ -444,7 +453,7 @@ static struct tracing_map_elt *tracing_map_elt_alloc(struct 
tracing_map *map)
        }
        return elt;
  free:
-       tracing_map_elt_free(elt);
+       __tracing_map_elt_free(elt);
 
        return ERR_PTR(err);
 }


Reply via email to