diff options
Diffstat (limited to 'tools/testing/selftests/bpf/verifier/bounds.c')
| -rw-r--r-- | tools/testing/selftests/bpf/verifier/bounds.c | 57 | 
1 files changed, 45 insertions, 12 deletions
diff --git a/tools/testing/selftests/bpf/verifier/bounds.c b/tools/testing/selftests/bpf/verifier/bounds.c index d55f476f2237..4d0d09574bf4 100644 --- a/tools/testing/selftests/bpf/verifier/bounds.c +++ b/tools/testing/selftests/bpf/verifier/bounds.c @@ -257,17 +257,15 @@  	 *      [0x00ff'ffff'ff00'0000, 0x00ff'ffff'ffff'ffff]  	 */  	BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), -	/* no-op or OOB pointer computation */ +	/* error on OOB pointer computation */  	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), -	/* potentially OOB access */ -	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),  	/* exit */  	BPF_MOV64_IMM(BPF_REG_0, 0),  	BPF_EXIT_INSN(),  	},  	.fixup_map_hash_8b = { 3 },  	/* not actually fully unbounded, but the bound is very high */ -	.errstr = "R0 unbounded memory access", +	.errstr = "value 72057594021150720 makes map_value pointer be out of bounds",  	.result = REJECT  },  { @@ -299,17 +297,15 @@  	 *      [0x00ff'ffff'ff00'0000, 0x00ff'ffff'ffff'ffff]  	 */  	BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), -	/* no-op or OOB pointer computation */ +	/* error on OOB pointer computation */  	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), -	/* potentially OOB access */ -	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),  	/* exit */  	BPF_MOV64_IMM(BPF_REG_0, 0),  	BPF_EXIT_INSN(),  	},  	.fixup_map_hash_8b = { 3 },  	/* not actually fully unbounded, but the bound is very high */ -	.errstr = "R0 unbounded memory access", +	.errstr = "value 72057594021150720 makes map_value pointer be out of bounds",  	.result = REJECT  },  { @@ -411,16 +407,14 @@  	BPF_ALU32_IMM(BPF_RSH, BPF_REG_1, 31),  	/* r1 = 0xffff'fffe (NOT 0!) */  	BPF_ALU32_IMM(BPF_SUB, BPF_REG_1, 2), -	/* computes OOB pointer */ +	/* error on computing OOB pointer */  	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), -	/* OOB access */ -	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),  	/* exit */  	BPF_MOV64_IMM(BPF_REG_0, 0),  	BPF_EXIT_INSN(),  	},  	.fixup_map_hash_8b = { 3 }, -	.errstr = "R0 invalid mem access", +	.errstr = "math between map_value pointer and 4294967294 is not allowed",  	.result = REJECT,  },  { @@ -506,3 +500,42 @@  	.errstr = "map_value pointer and 1000000000000",  	.result = REJECT  }, +{ +	"bounds check mixed 32bit and 64bit arithmatic. test1", +	.insns = { +	BPF_MOV64_IMM(BPF_REG_0, 0), +	BPF_MOV64_IMM(BPF_REG_1, -1), +	BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 32), +	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), +	/* r1 = 0xffffFFFF00000001 */ +	BPF_JMP32_IMM(BPF_JGT, BPF_REG_1, 1, 3), +	/* check ALU64 op keeps 32bit bounds */ +	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), +	BPF_JMP32_IMM(BPF_JGT, BPF_REG_1, 2, 1), +	BPF_JMP_A(1), +	/* invalid ldx if bounds are lost above */ +	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, -1), +	BPF_EXIT_INSN(), +	}, +	.result = ACCEPT +}, +{ +	"bounds check mixed 32bit and 64bit arithmatic. test2", +	.insns = { +	BPF_MOV64_IMM(BPF_REG_0, 0), +	BPF_MOV64_IMM(BPF_REG_1, -1), +	BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 32), +	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), +	/* r1 = 0xffffFFFF00000001 */ +	BPF_MOV64_IMM(BPF_REG_2, 3), +	/* r1 = 0x2 */ +	BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 1), +	/* check ALU32 op zero extends 64bit bounds */ +	BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 1), +	BPF_JMP_A(1), +	/* invalid ldx if bounds are lost above */ +	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, -1), +	BPF_EXIT_INSN(), +	}, +	.result = ACCEPT +},  |