lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAEf4BzY_wkZV0zMD4pAvLdpSMFAbiLq0vLSiRZSgxadgZEfr4w@mail.gmail.com>
Date:   Thu, 14 Mar 2019 14:05:04 -0700
From:   Andrii Nakryiko <andrii.nakryiko@...il.com>
To:     Daniel Borkmann <daniel@...earbox.net>
Cc:     Alexei Starovoitov <ast@...nel.org>, bpf@...r.kernel.org,
        Networking <netdev@...r.kernel.org>,
        Joe Stringer <joe@...d.net.nz>,
        john fastabend <john.fastabend@...il.com>,
        Yonghong Song <yhs@...com>,
        Jakub Kicinski <jakub.kicinski@...ronome.com>, tgraf@...g.ch,
        lmb@...udflare.com
Subject: Re: [PATCH rfc v3 bpf-next 6/9] bpf, libbpf: refactor relocation handling

On Mon, Mar 11, 2019 at 2:51 PM Daniel Borkmann <daniel@...earbox.net> wrote:
>
> From: Joe Stringer <joe@...d.net.nz>
>
> Adjust the code for relocations slightly with no functional changes,
> so that upcoming patches that will introduce support for relocations
> into the .data, .rodata and .bss sections can be added independent
> of these changes.
>
> Signed-off-by: Joe Stringer <joe@...d.net.nz>
> Signed-off-by: Daniel Borkmann <daniel@...earbox.net>

lgtm

Acked-by: Andrii Nakryiko <andriin@...com>

> ---
>  tools/lib/bpf/libbpf.c | 62 ++++++++++++++++++++++--------------------
>  1 file changed, 32 insertions(+), 30 deletions(-)
>
> diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
> index f5eb60379c8d..0afdb8914386 100644
> --- a/tools/lib/bpf/libbpf.c
> +++ b/tools/lib/bpf/libbpf.c
> @@ -851,20 +851,20 @@ static int bpf_object__elf_collect(struct bpf_object *obj, int flags)
>                                 obj->efile.symbols = data;
>                                 obj->efile.strtabidx = sh.sh_link;
>                         }
> -               } else if ((sh.sh_type == SHT_PROGBITS) &&
> -                          (sh.sh_flags & SHF_EXECINSTR) &&
> -                          (data->d_size > 0)) {
> -                       if (strcmp(name, ".text") == 0)
> -                               obj->efile.text_shndx = idx;
> -                       err = bpf_object__add_program(obj, data->d_buf,
> -                                                     data->d_size, name, idx);
> -                       if (err) {
> -                               char errmsg[STRERR_BUFSIZE];
> -                               char *cp = libbpf_strerror_r(-err, errmsg,
> -                                                            sizeof(errmsg));
> -
> -                               pr_warning("failed to alloc program %s (%s): %s",
> -                                          name, obj->path, cp);
> +               } else if (sh.sh_type == SHT_PROGBITS && data->d_size > 0) {
> +                       if (sh.sh_flags & SHF_EXECINSTR) {
> +                               if (strcmp(name, ".text") == 0)
> +                                       obj->efile.text_shndx = idx;
> +                               err = bpf_object__add_program(obj, data->d_buf,
> +                                                             data->d_size, name, idx);
> +                               if (err) {
> +                                       char errmsg[STRERR_BUFSIZE];
> +                                       char *cp = libbpf_strerror_r(-err, errmsg,
> +                                                                    sizeof(errmsg));
> +
> +                                       pr_warning("failed to alloc program %s (%s): %s",
> +                                                  name, obj->path, cp);
> +                               }
>                         }
>                 } else if (sh.sh_type == SHT_REL) {
>                         void *reloc = obj->efile.reloc;
> @@ -1026,24 +1026,26 @@ bpf_program__collect_reloc(struct bpf_program *prog, GElf_Shdr *shdr,
>                         return -LIBBPF_ERRNO__RELOC;
>                 }
>
> -               /* TODO: 'maps' is sorted. We can use bsearch to make it faster. */
> -               for (map_idx = 0; map_idx < nr_maps; map_idx++) {
> -                       if (maps[map_idx].offset == sym.st_value) {
> -                               pr_debug("relocation: find map %zd (%s) for insn %u\n",
> -                                        map_idx, maps[map_idx].name, insn_idx);
> -                               break;
> +               if (sym.st_shndx == maps_shndx) {
> +                       /* TODO: 'maps' is sorted. We can use bsearch to make it faster. */
> +                       for (map_idx = 0; map_idx < nr_maps; map_idx++) {
> +                               if (maps[map_idx].offset == sym.st_value) {
> +                                       pr_debug("relocation: find map %zd (%s) for insn %u\n",
> +                                                map_idx, maps[map_idx].name, insn_idx);
> +                                       break;
> +                               }
>                         }
> -               }
>
> -               if (map_idx >= nr_maps) {
> -                       pr_warning("bpf relocation: map_idx %d large than %d\n",
> -                                  (int)map_idx, (int)nr_maps - 1);
> -                       return -LIBBPF_ERRNO__RELOC;
> -               }
> +                       if (map_idx >= nr_maps) {
> +                               pr_warning("bpf relocation: map_idx %d large than %d\n",
> +                                          (int)map_idx, (int)nr_maps - 1);
> +                               return -LIBBPF_ERRNO__RELOC;
> +                       }
>
> -               prog->reloc_desc[i].type = RELO_LD64;
> -               prog->reloc_desc[i].insn_idx = insn_idx;
> -               prog->reloc_desc[i].map_idx = map_idx;
> +                       prog->reloc_desc[i].type = RELO_LD64;
> +                       prog->reloc_desc[i].insn_idx = insn_idx;
> +                       prog->reloc_desc[i].map_idx = map_idx;
> +               }
>         }
>         return 0;
>  }
> @@ -1405,7 +1407,7 @@ bpf_program__relocate(struct bpf_program *prog, struct bpf_object *obj)
>                         }
>                         insns[insn_idx].src_reg = BPF_PSEUDO_MAP_FD;
>                         insns[insn_idx].imm = obj->maps[map_idx].fd;
> -               } else {
> +               } else if (prog->reloc_desc[i].type == RELO_CALL) {
>                         err = bpf_program__reloc_text(prog, obj,
>                                                       &prog->reloc_desc[i]);
>                         if (err)
> --
> 2.17.1
>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ