summaryrefslogblamecommitdiff
path: root/tools/testing/selftests/bpf/verifier/bounds_deduction.c
blob: c162498a64fc6a0644903bde7255304690af66b7 (plain) (tree)
1
2
3
4
5
6
7
8
9







                                                             
                                                                                           
                                                             
                         











                                                             

                                                                                           










                                                             
                                                                                           
                                                             
                         











                                                             

                                                                                           









                                                             
                                                                                           
                                                             
                         









                                                             
                                                                                           
                                                             
                         










                                                              
                                                                                           
                                                    
                         











                                                              
                                                                                           
                                                    
                         









                                                             
                                                                                           
                                                             
                         










                                                             
                                                                                                  
                         
  
{
	"check deducing bounds from const, 1",
	.insns = {
		BPF_MOV64_IMM(BPF_REG_0, 1),
		BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 1, 0),
		BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
		BPF_EXIT_INSN(),
	},
	.errstr_unpriv = "R0 tried to sub from different maps, paths, or prohibited types",
	.errstr = "R0 tried to subtract pointer from scalar",
	.result = REJECT,
},
{
	"check deducing bounds from const, 2",
	.insns = {
		BPF_MOV64_IMM(BPF_REG_0, 1),
		BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 1, 1),
		BPF_EXIT_INSN(),
		BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 1, 1),
		BPF_EXIT_INSN(),
		BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0),
		BPF_EXIT_INSN(),
	},
	.errstr_unpriv = "R1 tried to sub from different maps, paths, or prohibited types",
	.result_unpriv = REJECT,
	.result = ACCEPT,
	.retval = 1,
},
{
	"check deducing bounds from const, 3",
	.insns = {
		BPF_MOV64_IMM(BPF_REG_0, 0),
		BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 0, 0),
		BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
		BPF_EXIT_INSN(),
	},
	.errstr_unpriv = "R0 tried to sub from different maps, paths, or prohibited types",
	.errstr = "R0 tried to subtract pointer from scalar",
	.result = REJECT,
},
{
	"check deducing bounds from const, 4",
	.insns = {
		BPF_MOV64_IMM(BPF_REG_0, 0),
		BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 0, 1),
		BPF_EXIT_INSN(),
		BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1),
		BPF_EXIT_INSN(),
		BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0),
		BPF_EXIT_INSN(),
	},
	.errstr_unpriv = "R1 tried to sub from different maps, paths, or prohibited types",
	.result_unpriv = REJECT,
	.result = ACCEPT,
},
{
	"check deducing bounds from const, 5",
	.insns = {
		BPF_MOV64_IMM(BPF_REG_0, 0),
		BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 1, 1),
		BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
		BPF_EXIT_INSN(),
	},
	.errstr_unpriv = "R0 tried to sub from different maps, paths, or prohibited types",
	.errstr = "R0 tried to subtract pointer from scalar",
	.result = REJECT,
},
{
	"check deducing bounds from const, 6",
	.insns = {
		BPF_MOV64_IMM(BPF_REG_0, 0),
		BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1),
		BPF_EXIT_INSN(),
		BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
		BPF_EXIT_INSN(),
	},
	.errstr_unpriv = "R0 tried to sub from different maps, paths, or prohibited types",
	.errstr = "R0 tried to subtract pointer from scalar",
	.result = REJECT,
},
{
	"check deducing bounds from const, 7",
	.insns = {
		BPF_MOV64_IMM(BPF_REG_0, ~0),
		BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 0),
		BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0),
		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
			    offsetof(struct __sk_buff, mark)),
		BPF_EXIT_INSN(),
	},
	.errstr_unpriv = "R1 tried to sub from different maps, paths, or prohibited types",
	.errstr = "dereference of modified ctx ptr",
	.result = REJECT,
	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
},
{
	"check deducing bounds from const, 8",
	.insns = {
		BPF_MOV64_IMM(BPF_REG_0, ~0),
		BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1),
		BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0),
		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
			    offsetof(struct __sk_buff, mark)),
		BPF_EXIT_INSN(),
	},
	.errstr_unpriv = "R1 tried to add from different maps, paths, or prohibited types",
	.errstr = "dereference of modified ctx ptr",
	.result = REJECT,
	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
},
{
	"check deducing bounds from const, 9",
	.insns = {
		BPF_MOV64_IMM(BPF_REG_0, 0),
		BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 0),
		BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
		BPF_EXIT_INSN(),
	},
	.errstr_unpriv = "R0 tried to sub from different maps, paths, or prohibited types",
	.errstr = "R0 tried to subtract pointer from scalar",
	.result = REJECT,
},
{
	"check deducing bounds from const, 10",
	.insns = {
		BPF_MOV64_IMM(BPF_REG_0, 0),
		BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 0, 0),
		/* Marks reg as unknown. */
		BPF_ALU64_IMM(BPF_NEG, BPF_REG_0, 0),
		BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
		BPF_EXIT_INSN(),
	},
	.errstr = "math between ctx pointer and register with unbounded min value is not allowed",
	.result = REJECT,
},