Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1343556

[PATCH v18 4/9] bpf: Mark __bpf_prog_run() stack frame as non-standard

From Josh Poimboeuf <jpoimboe@redhat.com>
Newsgroups linux.kernel
Subject [PATCH v18 4/9] bpf: Mark __bpf_prog_run() stack frame as non-standard
Date 2016-02-26 00:00 +0100
Message-ID <r6d34-2h5-25@gated-at.bofh.it> (permalink)
References <r6d33-2h5-5@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


objtool reports the following false positive warnings:

  objtool: kernel/bpf/core.o: __bpf_prog_run()+0x5c: sibling call from callable instruction with changed frame pointer
  objtool: kernel/bpf/core.o: __bpf_prog_run()+0x60: function has unreachable instruction
  objtool: kernel/bpf/core.o: __bpf_prog_run()+0x64: function has unreachable instruction
  [...]

It's confused by the following dynamic jump instruction in
__bpf_prog_run()::

  jmp     *(%r12,%rax,8)

which corresponds to the following line in the C code:

  goto *jumptable[insn->code];

There's no way for objtool to deterministically find all possible
branch targets for a dynamic jump, so it can't verify this code.

In this case the jumps all stay within the function, and there's nothing
unusual going on related to the stack, so we can whitelist the function.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Cc: netdev@vger.kernel.org
---
 kernel/bpf/core.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
index 972d9a8..be0abf6 100644
--- a/kernel/bpf/core.c
+++ b/kernel/bpf/core.c
@@ -27,6 +27,7 @@
 #include <linux/random.h>
 #include <linux/moduleloader.h>
 #include <linux/bpf.h>
+#include <linux/frame.h>
 
 #include <asm/unaligned.h>
 
@@ -649,6 +650,7 @@ load_byte:
 		WARN_RATELIMIT(1, "unknown opcode %02x\n", insn->code);
 		return 0;
 }
+STACK_FRAME_NON_STANDARD(__bpf_prog_run); /* jump table */
 
 bool bpf_prog_array_compatible(struct bpf_array *array,
 			       const struct bpf_prog *fp)
-- 
2.4.3

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH v18 0/9] Compile-time stack metadata validation Josh Poimboeuf <jpoimboe@redhat.com> - 2016-02-26 00:00 +0100
  [PATCH v18 3/9] x86/xen: Mark xen_cpuid() stack frame as non-standard Josh Poimboeuf <jpoimboe@redhat.com> - 2016-02-26 00:00 +0100
  [PATCH v18 2/9] objtool: Add STACK_FRAME_NON_STANDARD macro Josh Poimboeuf <jpoimboe@redhat.com> - 2016-02-26 00:00 +0100
  [PATCH v18 4/9] bpf: Mark __bpf_prog_run() stack frame as non-standard Josh Poimboeuf <jpoimboe@redhat.com> - 2016-02-26 00:00 +0100
  [PATCH v18 1/9] objtool: Mark non-standard files and directories Josh Poimboeuf <jpoimboe@redhat.com> - 2016-02-26 00:00 +0100
  [PATCH v18 5/9] sched: Mark __schedule() stack frame as non-standard Josh Poimboeuf <jpoimboe@redhat.com> - 2016-02-26 00:00 +0100
  [PATCH v18 8/9] objtool: Add CONFIG_STACK_VALIDATION option Josh Poimboeuf <jpoimboe@redhat.com> - 2016-02-26 00:00 +0100
  Re: [PATCH v18 0/9] Compile-time stack metadata validation Ingo Molnar <mingo@kernel.org> - 2016-02-28 08:00 +0100
    Re: [PATCH v18 0/9] Compile-time stack metadata validation Josh Poimboeuf <jpoimboe@redhat.com> - 2016-02-28 18:10 +0100
  Re: [PATCH v18 0/9] Compile-time stack metadata validation Ingo Molnar <mingo@kernel.org> - 2016-02-28 08:00 +0100

csiph-web