Commit 30ee348c authored by Daniel Borkmann's avatar Daniel Borkmann

Merge branch 'bpf-libbpf-fixes'

Andrii Nakryiko says:

====================
Github's mirror of libbpf got LGTM and Coverity statis analysis running
against it and spotted few real bugs and few potential issues. This patch
series fixes found issues.
====================
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parents 9656b346 98e527af
...@@ -189,7 +189,7 @@ static void * ...@@ -189,7 +189,7 @@ static void *
alloc_zero_tailing_info(const void *orecord, __u32 cnt, alloc_zero_tailing_info(const void *orecord, __u32 cnt,
__u32 actual_rec_size, __u32 expected_rec_size) __u32 actual_rec_size, __u32 expected_rec_size)
{ {
__u64 info_len = actual_rec_size * cnt; __u64 info_len = (__u64)actual_rec_size * cnt;
void *info, *nrecord; void *info, *nrecord;
int i; int i;
......
...@@ -101,6 +101,7 @@ struct bpf_prog_linfo *bpf_prog_linfo__new(const struct bpf_prog_info *info) ...@@ -101,6 +101,7 @@ struct bpf_prog_linfo *bpf_prog_linfo__new(const struct bpf_prog_info *info)
{ {
struct bpf_prog_linfo *prog_linfo; struct bpf_prog_linfo *prog_linfo;
__u32 nr_linfo, nr_jited_func; __u32 nr_linfo, nr_jited_func;
__u64 data_sz;
nr_linfo = info->nr_line_info; nr_linfo = info->nr_line_info;
...@@ -122,11 +123,11 @@ struct bpf_prog_linfo *bpf_prog_linfo__new(const struct bpf_prog_info *info) ...@@ -122,11 +123,11 @@ struct bpf_prog_linfo *bpf_prog_linfo__new(const struct bpf_prog_info *info)
/* Copy xlated line_info */ /* Copy xlated line_info */
prog_linfo->nr_linfo = nr_linfo; prog_linfo->nr_linfo = nr_linfo;
prog_linfo->rec_size = info->line_info_rec_size; prog_linfo->rec_size = info->line_info_rec_size;
prog_linfo->raw_linfo = malloc(nr_linfo * prog_linfo->rec_size); data_sz = (__u64)nr_linfo * prog_linfo->rec_size;
prog_linfo->raw_linfo = malloc(data_sz);
if (!prog_linfo->raw_linfo) if (!prog_linfo->raw_linfo)
goto err_free; goto err_free;
memcpy(prog_linfo->raw_linfo, (void *)(long)info->line_info, memcpy(prog_linfo->raw_linfo, (void *)(long)info->line_info, data_sz);
nr_linfo * prog_linfo->rec_size);
nr_jited_func = info->nr_jited_ksyms; nr_jited_func = info->nr_jited_ksyms;
if (!nr_jited_func || if (!nr_jited_func ||
...@@ -142,13 +143,12 @@ struct bpf_prog_linfo *bpf_prog_linfo__new(const struct bpf_prog_info *info) ...@@ -142,13 +143,12 @@ struct bpf_prog_linfo *bpf_prog_linfo__new(const struct bpf_prog_info *info)
/* Copy jited_line_info */ /* Copy jited_line_info */
prog_linfo->nr_jited_func = nr_jited_func; prog_linfo->nr_jited_func = nr_jited_func;
prog_linfo->jited_rec_size = info->jited_line_info_rec_size; prog_linfo->jited_rec_size = info->jited_line_info_rec_size;
prog_linfo->raw_jited_linfo = malloc(nr_linfo * data_sz = (__u64)nr_linfo * prog_linfo->jited_rec_size;
prog_linfo->jited_rec_size); prog_linfo->raw_jited_linfo = malloc(data_sz);
if (!prog_linfo->raw_jited_linfo) if (!prog_linfo->raw_jited_linfo)
goto err_free; goto err_free;
memcpy(prog_linfo->raw_jited_linfo, memcpy(prog_linfo->raw_jited_linfo,
(void *)(long)info->jited_line_info, (void *)(long)info->jited_line_info, data_sz);
nr_linfo * prog_linfo->jited_rec_size);
/* Number of jited_line_info per jited func */ /* Number of jited_line_info per jited func */
prog_linfo->nr_jited_linfo_per_func = malloc(nr_jited_func * prog_linfo->nr_jited_linfo_per_func = malloc(nr_jited_func *
......
...@@ -269,10 +269,9 @@ __s64 btf__resolve_size(const struct btf *btf, __u32 type_id) ...@@ -269,10 +269,9 @@ __s64 btf__resolve_size(const struct btf *btf, __u32 type_id)
t = btf__type_by_id(btf, type_id); t = btf__type_by_id(btf, type_id);
} }
done:
if (size < 0) if (size < 0)
return -EINVAL; return -EINVAL;
done:
if (nelems && size > UINT32_MAX / nelems) if (nelems && size > UINT32_MAX / nelems)
return -E2BIG; return -E2BIG;
......
...@@ -956,13 +956,13 @@ static int bpf_object__init_user_maps(struct bpf_object *obj, bool strict) ...@@ -956,13 +956,13 @@ static int bpf_object__init_user_maps(struct bpf_object *obj, bool strict)
pr_debug("maps in %s: %d maps in %zd bytes\n", pr_debug("maps in %s: %d maps in %zd bytes\n",
obj->path, nr_maps, data->d_size); obj->path, nr_maps, data->d_size);
map_def_sz = data->d_size / nr_maps; if (!data->d_size || nr_maps == 0 || (data->d_size % nr_maps) != 0) {
if (!data->d_size || (data->d_size % nr_maps) != 0) {
pr_warn("unable to determine map definition size " pr_warn("unable to determine map definition size "
"section %s, %d maps in %zd bytes\n", "section %s, %d maps in %zd bytes\n",
obj->path, nr_maps, data->d_size); obj->path, nr_maps, data->d_size);
return -EINVAL; return -EINVAL;
} }
map_def_sz = data->d_size / nr_maps;
/* Fill obj->maps using data in "maps" section. */ /* Fill obj->maps using data in "maps" section. */
for (i = 0; i < nr_syms; i++) { for (i = 0; i < nr_syms; i++) {
...@@ -3523,6 +3523,7 @@ bpf_program__reloc_text(struct bpf_program *prog, struct bpf_object *obj, ...@@ -3523,6 +3523,7 @@ bpf_program__reloc_text(struct bpf_program *prog, struct bpf_object *obj,
pr_warn("oom in prog realloc\n"); pr_warn("oom in prog realloc\n");
return -ENOMEM; return -ENOMEM;
} }
prog->insns = new_insn;
if (obj->btf_ext) { if (obj->btf_ext) {
err = bpf_program_reloc_btf_ext(prog, obj, err = bpf_program_reloc_btf_ext(prog, obj,
...@@ -3534,7 +3535,6 @@ bpf_program__reloc_text(struct bpf_program *prog, struct bpf_object *obj, ...@@ -3534,7 +3535,6 @@ bpf_program__reloc_text(struct bpf_program *prog, struct bpf_object *obj,
memcpy(new_insn + prog->insns_cnt, text->insns, memcpy(new_insn + prog->insns_cnt, text->insns,
text->insns_cnt * sizeof(*insn)); text->insns_cnt * sizeof(*insn));
prog->insns = new_insn;
prog->main_prog_cnt = prog->insns_cnt; prog->main_prog_cnt = prog->insns_cnt;
prog->insns_cnt = new_cnt; prog->insns_cnt = new_cnt;
pr_debug("added %zd insn from %s to prog %s\n", pr_debug("added %zd insn from %s to prog %s\n",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment