]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
tracing: Do not call map->ops->elt_free() if elt_alloc() fails
authorMasami Hiramatsu (Google) <mhiramat@kernel.org>
Thu, 21 May 2026 04:49:14 +0000 (13:49 +0900)
committerSteven Rostedt <rostedt@goodmis.org>
Thu, 21 May 2026 15:29:03 +0000 (11:29 -0400)
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.

Link: https://sashiko.dev/#/patchset/20260520223101.34710-1-rosenp%40gmail.com
Cc: stable@vger.kernel.org
Cc: Tom Zanussi <tom.zanussi@linux.intel.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Rosen Penev <rosenp@gmail.com>
Reported-by: Sashiko <sashiko-bot@kernel.org>
Fixes: 2734b629525a ("tracing: Add per-element variable support to tracing_map")
Link: https://patch.msgid.link/177933895460.108746.5396070821443932634.stgit@devnote2
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
kernel/trace/tracing_map.c

index bf1a507695b6d6e97eeec8b90edeaa49bd4b42c5..0dd7927df22ac492f775d1fa299b3539334afbc4 100644 (file)
@@ -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);
 }