]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
kallsyms/ftrace: set module buildid in ftrace_mod_address_lookup()
authorPetr Mladek <pmladek@suse.com>
Fri, 28 Nov 2025 13:59:19 +0000 (14:59 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 21 Jan 2026 03:44:22 +0000 (19:44 -0800)
__sprint_symbol() might access an invalid pointer when
kallsyms_lookup_buildid() returns a symbol found by
ftrace_mod_address_lookup().

The ftrace lookup function must set both @modname and @modbuildid the same
way as module_address_lookup().

Link: https://lkml.kernel.org/r/20251128135920.217303-7-pmladek@suse.com
Fixes: 9294523e3768 ("module: add printk formats to add module build ID to stacktraces")
Signed-off-by: Petr Mladek <pmladek@suse.com>
Reviewed-by: Aaron Tomlin <atomlin@atomlin.com>
Acked-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Daniel Borkman <daniel@iogearbox.net>
Cc: Daniel Gomez <da.gomez@samsung.com>
Cc: John Fastabend <john.fastabend@gmail.com>
Cc: Kees Cook <kees@kernel.org>
Cc: Luis Chamberalin <mcgrof@kernel.org>
Cc: Marc Rutland <mark.rutland@arm.com>
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org>
Cc: Petr Pavlu <petr.pavlu@suse.com>
Cc: Sami Tolvanen <samitolvanen@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/ftrace.h
kernel/kallsyms.c
kernel/trace/ftrace.c

index a3a8989e3268da477e5d77fab7aec12ed34eaa2c..dc844d7e693d7c2bc7eec5d1cf81417ae5472855 100644 (file)
@@ -87,11 +87,13 @@ struct ftrace_hash;
        defined(CONFIG_DYNAMIC_FTRACE)
 int
 ftrace_mod_address_lookup(unsigned long addr, unsigned long *size,
-                  unsigned long *off, char **modname, char *sym);
+                         unsigned long *off, char **modname,
+                         const unsigned char **modbuildid, char *sym);
 #else
 static inline int
 ftrace_mod_address_lookup(unsigned long addr, unsigned long *size,
-                  unsigned long *off, char **modname, char *sym)
+                         unsigned long *off, char **modname,
+                         const unsigned char **modbuildid, char *sym)
 {
        return 0;
 }
index a37cafdf52cab5e691e4eb2382dafaecef20ce80..0f639c907336383041e752d491a24741227666df 100644 (file)
@@ -389,8 +389,8 @@ static int kallsyms_lookup_buildid(unsigned long addr,
                ret = bpf_address_lookup(addr, symbolsize, offset, namebuf);
 
        if (!ret)
-               ret = ftrace_mod_address_lookup(addr, symbolsize,
-                                               offset, modname, namebuf);
+               ret = ftrace_mod_address_lookup(addr, symbolsize, offset,
+                                               modname, modbuildid, namebuf);
 
        return ret;
 }
index aa758efc373149af0302485c567961459004e719..304505c116868f895617aab108b77e80bc1ea21c 100644 (file)
@@ -7753,7 +7753,8 @@ ftrace_func_address_lookup(struct ftrace_mod_map *mod_map,
 
 int
 ftrace_mod_address_lookup(unsigned long addr, unsigned long *size,
-                  unsigned long *off, char **modname, char *sym)
+                         unsigned long *off, char **modname,
+                         const unsigned char **modbuildid, char *sym)
 {
        struct ftrace_mod_map *mod_map;
        int ret = 0;
@@ -7765,6 +7766,8 @@ ftrace_mod_address_lookup(unsigned long addr, unsigned long *size,
                if (ret) {
                        if (modname)
                                *modname = mod_map->mod->name;
+                       if (modbuildid)
+                               *modbuildid = module_buildid(mod_map->mod);
                        break;
                }
        }