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]
Date:   Fri, 4 Mar 2022 15:11:12 -0800
From:   Andrii Nakryiko <andrii.nakryiko@...il.com>
To:     Jiri Olsa <jolsa@...nel.org>
Cc:     Alexei Starovoitov <ast@...nel.org>,
        Daniel Borkmann <daniel@...earbox.net>,
        Andrii Nakryiko <andrii@...nel.org>,
        Masami Hiramatsu <mhiramat@...nel.org>,
        Networking <netdev@...r.kernel.org>, bpf <bpf@...r.kernel.org>,
        lkml <linux-kernel@...r.kernel.org>,
        Martin KaFai Lau <kafai@...com>,
        Song Liu <songliubraving@...com>, Yonghong Song <yhs@...com>,
        John Fastabend <john.fastabend@...il.com>,
        KP Singh <kpsingh@...omium.org>,
        Steven Rostedt <rostedt@...dmis.org>
Subject: Re: [PATCH 06/10] libbpf: Add libbpf_kallsyms_parse function

On Tue, Feb 22, 2022 at 9:07 AM Jiri Olsa <jolsa@...nel.org> wrote:
>
> Move the kallsyms parsing in internal libbpf_kallsyms_parse
> function, so it can be used from other places.
>
> It will be used in following changes.
>
> Signed-off-by: Jiri Olsa <jolsa@...nel.org>
> ---

LGTM

Acked-by: Andrii Nakryiko <andrii@...nel.org>


>  tools/lib/bpf/libbpf.c          | 62 ++++++++++++++++++++-------------
>  tools/lib/bpf/libbpf_internal.h |  5 +++
>  2 files changed, 43 insertions(+), 24 deletions(-)
>
> diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
> index ad43b6ce825e..fb530b004a0d 100644
> --- a/tools/lib/bpf/libbpf.c
> +++ b/tools/lib/bpf/libbpf.c
> @@ -7172,12 +7172,10 @@ static int bpf_object__sanitize_maps(struct bpf_object *obj)
>         return 0;
>  }
>
> -static int bpf_object__read_kallsyms_file(struct bpf_object *obj)
> +int libbpf_kallsyms_parse(kallsyms_cb_t cb, void *ctx)
>  {
>         char sym_type, sym_name[500];
>         unsigned long long sym_addr;
> -       const struct btf_type *t;
> -       struct extern_desc *ext;
>         int ret, err = 0;
>         FILE *f;
>
> @@ -7196,35 +7194,51 @@ static int bpf_object__read_kallsyms_file(struct bpf_object *obj)
>                 if (ret != 3) {
>                         pr_warn("failed to read kallsyms entry: %d\n", ret);
>                         err = -EINVAL;
> -                       goto out;
> +                       break;
>                 }
>
> -               ext = find_extern_by_name(obj, sym_name);
> -               if (!ext || ext->type != EXT_KSYM)
> -                       continue;
> -
> -               t = btf__type_by_id(obj->btf, ext->btf_id);
> -               if (!btf_is_var(t))
> -                       continue;
> -
> -               if (ext->is_set && ext->ksym.addr != sym_addr) {
> -                       pr_warn("extern (ksym) '%s' resolution is ambiguous: 0x%llx or 0x%llx\n",
> -                               sym_name, ext->ksym.addr, sym_addr);
> -                       err = -EINVAL;
> -                       goto out;
> -               }
> -               if (!ext->is_set) {
> -                       ext->is_set = true;
> -                       ext->ksym.addr = sym_addr;
> -                       pr_debug("extern (ksym) %s=0x%llx\n", sym_name, sym_addr);
> -               }
> +               err = cb(sym_addr, sym_type, sym_name, ctx);
> +               if (err)
> +                       break;
>         }
>
> -out:
>         fclose(f);
>         return err;
>  }
>
> +static int kallsyms_cb(unsigned long long sym_addr, char sym_type,
> +                      const char *sym_name, void *ctx)
> +{
> +       struct bpf_object *obj = ctx;
> +       const struct btf_type *t;
> +       struct extern_desc *ext;
> +
> +       ext = find_extern_by_name(obj, sym_name);
> +       if (!ext || ext->type != EXT_KSYM)
> +               return 0;
> +
> +       t = btf__type_by_id(obj->btf, ext->btf_id);
> +       if (!btf_is_var(t))
> +               return 0;
> +
> +       if (ext->is_set && ext->ksym.addr != sym_addr) {
> +               pr_warn("extern (ksym) '%s' resolution is ambiguous: 0x%llx or 0x%llx\n",
> +                       sym_name, ext->ksym.addr, sym_addr);
> +               return -EINVAL;
> +       }
> +       if (!ext->is_set) {
> +               ext->is_set = true;
> +               ext->ksym.addr = sym_addr;
> +               pr_debug("extern (ksym) %s=0x%llx\n", sym_name, sym_addr);
> +       }
> +       return 0;
> +}
> +
> +static int bpf_object__read_kallsyms_file(struct bpf_object *obj)
> +{
> +       return libbpf_kallsyms_parse(kallsyms_cb, obj);
> +}
> +
>  static int find_ksym_btf_id(struct bpf_object *obj, const char *ksym_name,
>                             __u16 kind, struct btf **res_btf,
>                             struct module_btf **res_mod_btf)
> diff --git a/tools/lib/bpf/libbpf_internal.h b/tools/lib/bpf/libbpf_internal.h
> index 4fda8bdf0a0d..b6247dc7f8eb 100644
> --- a/tools/lib/bpf/libbpf_internal.h
> +++ b/tools/lib/bpf/libbpf_internal.h
> @@ -449,6 +449,11 @@ __s32 btf__find_by_name_kind_own(const struct btf *btf, const char *type_name,
>
>  extern enum libbpf_strict_mode libbpf_mode;
>
> +typedef int (*kallsyms_cb_t)(unsigned long long sym_addr, char sym_type,
> +                            const char *sym_name, void *ctx);
> +
> +int libbpf_kallsyms_parse(kallsyms_cb_t cb, void *arg);
> +
>  /* handle direct returned errors */
>  static inline int libbpf_err(int ret)
>  {
> --
> 2.35.1
>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ