lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.8 561/633] libbpf: Close map fd if init map slots failed
    Date
    From: Hangbin Liu <liuhangbin@gmail.com>

    [ Upstream commit a0f2b7acb4b1d29127ff99c714233b973afd1411 ]

    Previously we forgot to close the map fd if bpf_map_update_elem()
    failed during map slot init, which will leak map fd.

    Let's move map slot initialization to new function init_map_slots() to
    simplify the code. And close the map fd if init slot failed.

    Reported-by: Andrii Nakryiko <andrii.nakryiko@gmail.com>
    Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Acked-by: Andrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/bpf/20201006021345.3817033-2-liuhangbin@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    tools/lib/bpf/libbpf.c | 55 ++++++++++++++++++++++++++----------------
    1 file changed, 34 insertions(+), 21 deletions(-)

    diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
    index e4d304247c1ba..3e71c2f69afe8 100644
    --- a/tools/lib/bpf/libbpf.c
    +++ b/tools/lib/bpf/libbpf.c
    @@ -3677,6 +3677,36 @@ static int bpf_object__create_map(struct bpf_object *obj, struct bpf_map *map)
    return 0;
    }

    +static int init_map_slots(struct bpf_map *map)
    +{
    + const struct bpf_map *targ_map;
    + unsigned int i;
    + int fd, err;
    +
    + for (i = 0; i < map->init_slots_sz; i++) {
    + if (!map->init_slots[i])
    + continue;
    +
    + targ_map = map->init_slots[i];
    + fd = bpf_map__fd(targ_map);
    + err = bpf_map_update_elem(map->fd, &i, &fd, 0);
    + if (err) {
    + err = -errno;
    + pr_warn("map '%s': failed to initialize slot [%d] to map '%s' fd=%d: %d\n",
    + map->name, i, targ_map->name,
    + fd, err);
    + return err;
    + }
    + pr_debug("map '%s': slot [%d] set to map '%s' fd=%d\n",
    + map->name, i, targ_map->name, fd);
    + }
    +
    + zfree(&map->init_slots);
    + map->init_slots_sz = 0;
    +
    + return 0;
    +}
    +
    static int
    bpf_object__create_maps(struct bpf_object *obj)
    {
    @@ -3719,28 +3749,11 @@ bpf_object__create_maps(struct bpf_object *obj)
    }

    if (map->init_slots_sz) {
    - for (j = 0; j < map->init_slots_sz; j++) {
    - const struct bpf_map *targ_map;
    - int fd;
    -
    - if (!map->init_slots[j])
    - continue;
    -
    - targ_map = map->init_slots[j];
    - fd = bpf_map__fd(targ_map);
    - err = bpf_map_update_elem(map->fd, &j, &fd, 0);
    - if (err) {
    - err = -errno;
    - pr_warn("map '%s': failed to initialize slot [%d] to map '%s' fd=%d: %d\n",
    - map->name, j, targ_map->name,
    - fd, err);
    - goto err_out;
    - }
    - pr_debug("map '%s': slot [%d] set to map '%s' fd=%d\n",
    - map->name, j, targ_map->name, fd);
    + err = init_map_slots(map);
    + if (err < 0) {
    + zclose(map->fd);
    + goto err_out;
    }
    - zfree(&map->init_slots);
    - map->init_slots_sz = 0;
    }

    if (map->pin_path && !map->pinned) {
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-10-27 17:52    [W:2.231 / U:0.320 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site