Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753775AbbK3Ikw (ORCPT ); Mon, 30 Nov 2015 03:40:52 -0500 Received: from mail-pa0-f45.google.com ([209.85.220.45]:34620 "EHLO mail-pa0-f45.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753639AbbK3Iku (ORCPT ); Mon, 30 Nov 2015 03:40:50 -0500 Date: Mon, 30 Nov 2015 17:40:18 +0900 From: Namhyung Kim To: Wang Nan Cc: acme@kernel.org, masami.hiramatsu.pt@hitachi.com, ast@kernel.org, lizefan@huawei.com, pi3orama@163.com, linux-kernel@vger.kernel.org, Arnaldo Carvalho de Melo Subject: Re: [PATCH v3 01/13] tools lib bpf: Check return value of strdup when reading map names Message-ID: <20151130084018.GA14252@danjae.kornet> References: <1448868733-225582-1-git-send-email-wangnan0@huawei.com> <1448868733-225582-2-git-send-email-wangnan0@huawei.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <1448868733-225582-2-git-send-email-wangnan0@huawei.com> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2452 Lines: 82 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 > Signed-off-by: Wang Nan > Cc: Arnaldo Carvalho de Melo Acked-by: Namhyung Kim 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 > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/