]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
fprobe: Fix module reference count leak on error in register_fprobe()
authorMasami Hiramatsu (Google) <mhiramat@kernel.org>
Tue, 28 Jul 2026 23:27:33 +0000 (08:27 +0900)
committerMasami Hiramatsu (Google) <mhiramat@kernel.org>
Wed, 29 Jul 2026 13:50:02 +0000 (22:50 +0900)
In register_fprobe(), get_ips_from_filter() resolves target function
addresses and increments module reference counts via try_module_get() for
symbols in kernel modules. If get_ips_from_filter() fails on the second
pass and returns an error, register_fprobe() returned directly without
releasing module references acquired up to that point.

Fix this by ensuring the cleanup loop executing module_put() runs even when
get_ips_from_filter() returns a negative error.

Link: https://lore.kernel.org/all/178528125360.101985.4144133640239273153.stgit@devnote2/
Fixes: d24fa977eec5 ("tracing: fprobe: Fix to lock module while registering fprobe")
Assisted-by: Antigravity:gemini-3.6-flash
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
kernel/trace/fprobe.c

index f215990b90613d2eed50e0cc88fe43e9f86d6e18..f681015413b83e808722626756d4fc72abaa1dbe 100644 (file)
@@ -961,10 +961,8 @@ int register_fprobe(struct fprobe *fp, const char *filter, const char *notfilter
                return -ENOMEM;
 
        ret = get_ips_from_filter(filter, notfilter, addrs, mods, num);
-       if (ret < 0)
-               return ret;
-
-       ret = register_fprobe_ips(fp, addrs, ret);
+       if (ret >= 0)
+               ret = register_fprobe_ips(fp, addrs, ret);
 
        for (int i = 0; i < num; i++) {
                if (mods[i])