OSDN Git Service

libbpf: Fix memory leak and optimize BTF sanitization
authorAndrii Nakryiko <andriin@fb.com>
Fri, 10 Jul 2020 01:10:23 +0000 (18:10 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 10 Jul 2020 14:24:35 +0000 (16:24 +0200)
Coverity's static analysis helpfully reported a memory leak introduced by
0f0e55d8247c ("libbpf: Improve BTF sanitization handling"). While fixing it,
I realized that btf__new() already creates a memory copy, so there is no need
to do this. So this patch also fixes misleading btf__new() signature to make
data into a `const void *` input parameter. And it avoids unnecessary memory
allocation and copy in BTF sanitization code altogether.

Fixes: 0f0e55d8247c ("libbpf: Improve BTF sanitization handling")
Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20200710011023.1655008-1-andriin@fb.com
tools/lib/bpf/btf.c
tools/lib/bpf/btf.h
tools/lib/bpf/libbpf.c

index c8861c9..c9e760e 100644 (file)
@@ -397,7 +397,7 @@ void btf__free(struct btf *btf)
        free(btf);
 }
 
-struct btf *btf__new(__u8 *data, __u32 size)
+struct btf *btf__new(const void *data, __u32 size)
 {
        struct btf *btf;
        int err;
index 173eff2..a3b7ef9 100644 (file)
@@ -63,7 +63,7 @@ struct btf_ext_header {
 };
 
 LIBBPF_API void btf__free(struct btf *btf);
-LIBBPF_API struct btf *btf__new(__u8 *data, __u32 size);
+LIBBPF_API struct btf *btf__new(const void *data, __u32 size);
 LIBBPF_API struct btf *btf__parse_elf(const char *path,
                                      struct btf_ext **btf_ext);
 LIBBPF_API int btf__finalize_data(struct bpf_object *obj, struct btf *btf);
index 6602eb4..25e4f77 100644 (file)
@@ -2533,17 +2533,12 @@ static int bpf_object__sanitize_and_load_btf(struct bpf_object *obj)
 
        sanitize = btf_needs_sanitization(obj);
        if (sanitize) {
-               const void *orig_data;
-               void *san_data;
+               const void *raw_data;
                __u32 sz;
 
                /* clone BTF to sanitize a copy and leave the original intact */
-               orig_data = btf__get_raw_data(obj->btf, &sz);
-               san_data = malloc(sz);
-               if (!san_data)
-                       return -ENOMEM;
-               memcpy(san_data, orig_data, sz);
-               kern_btf = btf__new(san_data, sz);
+               raw_data = btf__get_raw_data(obj->btf, &sz);
+               kern_btf = btf__new(raw_data, sz);
                if (IS_ERR(kern_btf))
                        return PTR_ERR(kern_btf);