|
|
7e752c |
From 9348ded117d05ba1d54a748173db009d473c707c Mon Sep 17 00:00:00 2001
|
|
|
7e752c |
From: Andrea Claudi <aclaudi@redhat.com>
|
|
|
7e752c |
Date: Thu, 13 Jun 2019 14:37:57 +0200
|
|
|
7e752c |
Subject: [PATCH] bpf: initialise map symbol before retrieving and comparing
|
|
|
7e752c |
its type
|
|
|
7e752c |
|
|
|
7e752c |
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1716361
|
|
|
7e752c |
Upstream Status: iproute2.git commit 1a7d3ad8a5862
|
|
|
7e752c |
|
|
|
7e752c |
commit 1a7d3ad8a5862ca9ce9dd19326faeea77e5e6142
|
|
|
7e752c |
Author: Quentin Monnet <quentin.monnet@netronome.com>
|
|
|
7e752c |
Date: Tue Nov 20 01:26:27 2018 +0000
|
|
|
7e752c |
|
|
|
7e752c |
bpf: initialise map symbol before retrieving and comparing its type
|
|
|
7e752c |
|
|
|
7e752c |
In order to compare BPF map symbol type correctly in regard to the
|
|
|
7e752c |
latest LLVM, commit 7a04dd84a7f9 ("bpf: check map symbol type properly
|
|
|
7e752c |
with newer llvm compiler") compares map symbol type to both NOTYPE and
|
|
|
7e752c |
OBJECT. To do so, it first retrieves the type from "sym.st_info" and
|
|
|
7e752c |
stores it into a temporary variable.
|
|
|
7e752c |
|
|
|
7e752c |
However, the type is collected from the symbol "sym" before this latter
|
|
|
7e752c |
symbol is actually updated. gelf_getsym() is called after that and
|
|
|
7e752c |
updates "sym", and when comparison with OBJECT or NOTYPE happens it is
|
|
|
7e752c |
done on the type of the symbol collected in the previous passage of the
|
|
|
7e752c |
loop (or on an uninitialised symbol on the first passage). This may
|
|
|
7e752c |
eventually break map collection from the ELF file.
|
|
|
7e752c |
|
|
|
7e752c |
Fix this by assigning the type to the temporary variable only after the
|
|
|
7e752c |
call to gelf_getsym().
|
|
|
7e752c |
|
|
|
7e752c |
Fixes: 7a04dd84a7f9 ("bpf: check map symbol type properly with newer llvm compiler")
|
|
|
7e752c |
Reported-by: Ron Philip <ron.philip@netronome.com>
|
|
|
7e752c |
Signed-off-by: Quentin Monnet <quentin.monnet@netronome.com>
|
|
|
7e752c |
Reviewed-by: Jiong Wang <jiong.wang@netronome.com>
|
|
|
7e752c |
Acked-by: Yonghong Song <yhs@fb.com>
|
|
|
7e752c |
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
|
|
|
7e752c |
---
|
|
|
7e752c |
lib/bpf.c | 10 +++++++---
|
|
|
7e752c |
1 file changed, 7 insertions(+), 3 deletions(-)
|
|
|
7e752c |
|
|
|
7e752c |
diff --git a/lib/bpf.c b/lib/bpf.c
|
|
|
7e752c |
index 45f279fa4a416..6aff8f7bad7fb 100644
|
|
|
7e752c |
--- a/lib/bpf.c
|
|
|
7e752c |
+++ b/lib/bpf.c
|
|
|
7e752c |
@@ -1758,11 +1758,12 @@ static const char *bpf_map_fetch_name(struct bpf_elf_ctx *ctx, int which)
|
|
|
7e752c |
int i;
|
|
|
7e752c |
|
|
|
7e752c |
for (i = 0; i < ctx->sym_num; i++) {
|
|
|
7e752c |
- int type = GELF_ST_TYPE(sym.st_info);
|
|
|
7e752c |
+ int type;
|
|
|
7e752c |
|
|
|
7e752c |
if (gelf_getsym(ctx->sym_tab, i, &sym) != &sym)
|
|
|
7e752c |
continue;
|
|
|
7e752c |
|
|
|
7e752c |
+ type = GELF_ST_TYPE(sym.st_info);
|
|
|
7e752c |
if (GELF_ST_BIND(sym.st_info) != STB_GLOBAL ||
|
|
|
7e752c |
(type != STT_NOTYPE && type != STT_OBJECT) ||
|
|
|
7e752c |
sym.st_shndx != ctx->sec_maps ||
|
|
|
7e752c |
@@ -1851,11 +1852,12 @@ static int bpf_map_num_sym(struct bpf_elf_ctx *ctx)
|
|
|
7e752c |
GElf_Sym sym;
|
|
|
7e752c |
|
|
|
7e752c |
for (i = 0; i < ctx->sym_num; i++) {
|
|
|
7e752c |
- int type = GELF_ST_TYPE(sym.st_info);
|
|
|
7e752c |
+ int type;
|
|
|
7e752c |
|
|
|
7e752c |
if (gelf_getsym(ctx->sym_tab, i, &sym) != &sym)
|
|
|
7e752c |
continue;
|
|
|
7e752c |
|
|
|
7e752c |
+ type = GELF_ST_TYPE(sym.st_info);
|
|
|
7e752c |
if (GELF_ST_BIND(sym.st_info) != STB_GLOBAL ||
|
|
|
7e752c |
(type != STT_NOTYPE && type != STT_OBJECT) ||
|
|
|
7e752c |
sym.st_shndx != ctx->sec_maps)
|
|
|
7e752c |
@@ -1931,10 +1933,12 @@ static int bpf_map_verify_all_offs(struct bpf_elf_ctx *ctx, int end)
|
|
|
7e752c |
* the table again.
|
|
|
7e752c |
*/
|
|
|
7e752c |
for (i = 0; i < ctx->sym_num; i++) {
|
|
|
7e752c |
- int type = GELF_ST_TYPE(sym.st_info);
|
|
|
7e752c |
+ int type;
|
|
|
7e752c |
|
|
|
7e752c |
if (gelf_getsym(ctx->sym_tab, i, &sym) != &sym)
|
|
|
7e752c |
continue;
|
|
|
7e752c |
+
|
|
|
7e752c |
+ type = GELF_ST_TYPE(sym.st_info);
|
|
|
7e752c |
if (GELF_ST_BIND(sym.st_info) != STB_GLOBAL ||
|
|
|
7e752c |
(type != STT_NOTYPE && type != STT_OBJECT) ||
|
|
|
7e752c |
sym.st_shndx != ctx->sec_maps)
|
|
|
7e752c |
--
|
|
|
7e752c |
2.20.1
|
|
|
7e752c |
|