Messages in this thread Patch in this message | | | Date | Mon, 30 Nov 2015 17:40:18 +0900 | From | Namhyung Kim <> | Subject | Re: [PATCH v3 01/13] tools lib bpf: Check return value of strdup when reading map names |
| |
On Mon, Nov 30, 2015 at 07:32:01AM +0000, Wang Nan wrote: > Commit 561bbccac72d08babafaa33fd7fa9100ec4c9fb6 ("tools lib bpf: > Extract and collect map names from BPF object file") forgets checking > return value of strdup(). This patch fixes it. It also checks names > pointer before strcmp() for safty. > > Reported-by: Namhyung Kim <namhyung@kernel.org> > Signed-off-by: Wang Nan <wangnan0@huawei.com> > Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Thanks, Namhyung
> --- > tools/lib/bpf/libbpf.c | 13 +++++++++---- > 1 file changed, 9 insertions(+), 4 deletions(-) > > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index a298614..16485ab 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -527,14 +527,14 @@ bpf_object__init_maps(struct bpf_object *obj, void *data, > return 0; > } > > -static void > +static int > bpf_object__init_maps_name(struct bpf_object *obj, int maps_shndx) > { > int i; > Elf_Data *symbols = obj->efile.symbols; > > if (!symbols || maps_shndx < 0) > - return; > + return -EINVAL; > > for (i = 0; i < symbols->d_size / sizeof(GElf_Sym); i++) { > GElf_Sym sym; > @@ -556,9 +556,14 @@ bpf_object__init_maps_name(struct bpf_object *obj, int maps_shndx) > continue; > } > obj->maps[map_idx].name = strdup(map_name); > + if (!obj->maps[map_idx].name) { > + pr_warning("failed to alloc map name\n"); > + return -ENOMEM; > + } > pr_debug("map %zu is \"%s\"\n", map_idx, > obj->maps[map_idx].name); > } > + return 0; > } > > static int bpf_object__elf_collect(struct bpf_object *obj) > @@ -663,7 +668,7 @@ static int bpf_object__elf_collect(struct bpf_object *obj) > } > > if (maps_shndx >= 0) > - bpf_object__init_maps_name(obj, maps_shndx); > + err = bpf_object__init_maps_name(obj, maps_shndx); > out: > return err; > } > @@ -1372,7 +1377,7 @@ bpf_object__get_map_by_name(struct bpf_object *obj, const char *name) > struct bpf_map *pos; > > bpf_map__for_each(pos, obj) { > - if (strcmp(pos->name, name) == 0) > + if (pos->name && !strcmp(pos->name, name)) > return pos; > } > return NULL; > -- > 1.8.3.4 >
| |