OSDN Git Service

libbpf: Fix memory leak in legacy kprobe attach logic
authorAndrii Nakryiko <andrii@kernel.org>
Tue, 21 Sep 2021 21:00:33 +0000 (14:00 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 22 Sep 2021 02:40:08 +0000 (19:40 -0700)
In some error scenarios legacy_probe string won't be free()'d. Fix this.
This was reported by Coverity static analysis.

Fixes: ca304b40c20d ("libbpf: Introduce legacy kprobe events support")
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20210921210036.1545557-2-andrii@kernel.org
tools/lib/bpf/libbpf.c

index da65a16..6d2f12d 100644 (file)
@@ -9365,10 +9365,11 @@ bpf_program__attach_kprobe_opts(const struct bpf_program *prog,
                                                    offset, -1 /* pid */);
        }
        if (pfd < 0) {
+               err = pfd;
                pr_warn("prog '%s': failed to create %s '%s' perf event: %s\n",
                        prog->name, retprobe ? "kretprobe" : "kprobe", func_name,
-                       libbpf_strerror_r(pfd, errmsg, sizeof(errmsg)));
-               return libbpf_err_ptr(pfd);
+                       libbpf_strerror_r(err, errmsg, sizeof(errmsg)));
+               goto err_out;
        }
        link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts);
        err = libbpf_get_error(link);
@@ -9377,7 +9378,7 @@ bpf_program__attach_kprobe_opts(const struct bpf_program *prog,
                pr_warn("prog '%s': failed to attach to %s '%s': %s\n",
                        prog->name, retprobe ? "kretprobe" : "kprobe", func_name,
                        libbpf_strerror_r(err, errmsg, sizeof(errmsg)));
-               return libbpf_err_ptr(err);
+               goto err_out;
        }
        if (legacy) {
                struct bpf_link_perf *perf_link = container_of(link, struct bpf_link_perf, link);
@@ -9387,6 +9388,9 @@ bpf_program__attach_kprobe_opts(const struct bpf_program *prog,
        }
 
        return link;
+err_out:
+       free(legacy_probe);
+       return libbpf_err_ptr(err);
 }
 
 struct bpf_link *bpf_program__attach_kprobe(const struct bpf_program *prog,