From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752693AbcFZLYv (ORCPT ); Sun, 26 Jun 2016 07:24:51 -0400 Received: from szxga04-in.huawei.com ([58.251.152.52]:21864 "EHLO szxga04-in.huawei.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1752527AbcFZLWL (ORCPT ); Sun, 26 Jun 2016 07:22:11 -0400 From: He Kuang To: , , , , , , , , CC: Subject: [RFC PATCH v2 21/26] bpf: Support bpf load/store boundary check for ubpf Date: Sun, 26 Jun 2016 11:21:13 +0000 Message-ID: <1466940078-65581-22-git-send-email-hekuang@huawei.com> X-Mailer: git-send-email 1.8.3.4 In-Reply-To: <1466940078-65581-1-git-send-email-hekuang@huawei.com> References: <1466940078-65581-1-git-send-email-hekuang@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.107.193.250] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A090202.576FBAD7.0045,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0, ip=0.0.0.0, so=2014-11-16 11:51:01, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 3a0514f3754539f72e9b3b63c88a29ea Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org A boundary check is added before each store/load instruction, since we don't have a verifier in userspace bpf. There's no functionality change without UBPF_BUILD flag. Signed-off-by: He Kuang --- kernel/bpf/vm.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/kernel/bpf/vm.c b/kernel/bpf/vm.c index add5669..0ddb592 100644 --- a/kernel/bpf/vm.c +++ b/kernel/bpf/vm.c @@ -76,9 +76,13 @@ static inline int bpf_vm_jmp_tail_call_handler(u64 *regs, u32 *p_tail_call_cnt, *p_insn = prog->insnsi; return 0; } -#endif /* UBPF_BUILD */ - +#define BOUNDS_CHECK_STORE(size) +#define BOUNDS_CHECK_LOAD(size) unsigned int __bpf_prog_run(void *ctx, const struct bpf_insn *insn) +#else +unsigned int __bpf_prog_run(void *ctx, const struct bpf_insn *insn, + size_t ctx_len) +#endif /* UBPF_BUILD */ { u64 stack[MAX_BPF_STACK / sizeof(u64)]; u64 regs[MAX_BPF_REG], tmp; @@ -419,12 +423,15 @@ select_insn: /* STX and ST and LDX*/ #define LDST(SIZEOP, SIZE) \ STX_MEM_##SIZEOP: \ + BOUNDS_CHECK_STORE(sizeof(SIZE)); \ *(SIZE *)(unsigned long) (DST + insn->off) = SRC; \ CONT; \ ST_MEM_##SIZEOP: \ + BOUNDS_CHECK_STORE(sizeof(SIZE)); \ *(SIZE *)(unsigned long) (DST + insn->off) = IMM; \ CONT; \ LDX_MEM_##SIZEOP: \ + BOUNDS_CHECK_LOAD(sizeof(SIZE)); \ DST = *(SIZE *)(unsigned long) (SRC + insn->off); \ CONT; -- 1.8.5.2