Commit 87ab8194 authored by Daniel Borkmann's avatar Daniel Borkmann Committed by Alexei Starovoitov
Browse files

bpf: add test case for ld_abs and helper changing pkt data



Add a test that i) uses LD_ABS, ii) zeroing R6 before call, iii) calls
a helper that triggers reload of cached skb data, iv) uses LD_ABS again.
It's added for test_bpf in order to do runtime testing after JITing as
well as test_verifier to test that the sequence is allowed.

Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 07aee943
Loading
Loading
Loading
Loading
+43 −0
Original line number Diff line number Diff line
@@ -435,6 +435,41 @@ loop:
	return 0;
}

static int bpf_fill_ld_abs_vlan_push_pop2(struct bpf_test *self)
{
	struct bpf_insn *insn;

	insn = kmalloc_array(16, sizeof(*insn), GFP_KERNEL);
	if (!insn)
		return -ENOMEM;

	/* Due to func address being non-const, we need to
	 * assemble this here.
	 */
	insn[0] = BPF_MOV64_REG(R6, R1);
	insn[1] = BPF_LD_ABS(BPF_B, 0);
	insn[2] = BPF_LD_ABS(BPF_H, 0);
	insn[3] = BPF_LD_ABS(BPF_W, 0);
	insn[4] = BPF_MOV64_REG(R7, R6);
	insn[5] = BPF_MOV64_IMM(R6, 0);
	insn[6] = BPF_MOV64_REG(R1, R7);
	insn[7] = BPF_MOV64_IMM(R2, 1);
	insn[8] = BPF_MOV64_IMM(R3, 2);
	insn[9] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
			       bpf_skb_vlan_push_proto.func - __bpf_call_base);
	insn[10] = BPF_MOV64_REG(R6, R7);
	insn[11] = BPF_LD_ABS(BPF_B, 0);
	insn[12] = BPF_LD_ABS(BPF_H, 0);
	insn[13] = BPF_LD_ABS(BPF_W, 0);
	insn[14] = BPF_MOV64_IMM(R0, 42);
	insn[15] = BPF_EXIT_INSN();

	self->u.ptr.insns = insn;
	self->u.ptr.len = 16;

	return 0;
}

static int bpf_fill_jump_around_ld_abs(struct bpf_test *self)
{
	unsigned int len = BPF_MAXINSNS;
@@ -6066,6 +6101,14 @@ static struct bpf_test tests[] = {
		{},
		{ {0x1, 0x42 } },
	},
	{
		"LD_ABS with helper changing skb data",
		{ },
		INTERNAL,
		{ 0x34 },
		{ { ETH_HLEN, 42 } },
		.fill_helper = bpf_fill_ld_abs_vlan_push_pop2,
	},
};

static struct net_device dev;
+24 −0
Original line number Diff line number Diff line
@@ -6116,6 +6116,30 @@ static struct bpf_test tests[] = {
		},
		.result = ACCEPT,
	},
	{
		"ld_abs: tests on r6 and skb data reload helper",
		.insns = {
			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
			BPF_LD_ABS(BPF_B, 0),
			BPF_LD_ABS(BPF_H, 0),
			BPF_LD_ABS(BPF_W, 0),
			BPF_MOV64_REG(BPF_REG_7, BPF_REG_6),
			BPF_MOV64_IMM(BPF_REG_6, 0),
			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
			BPF_MOV64_IMM(BPF_REG_2, 1),
			BPF_MOV64_IMM(BPF_REG_3, 2),
			BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
				     BPF_FUNC_skb_vlan_push),
			BPF_MOV64_REG(BPF_REG_6, BPF_REG_7),
			BPF_LD_ABS(BPF_B, 0),
			BPF_LD_ABS(BPF_H, 0),
			BPF_LD_ABS(BPF_W, 0),
			BPF_MOV64_IMM(BPF_REG_0, 42),
			BPF_EXIT_INSN(),
		},
		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
		.result = ACCEPT,
	},
	{
		"ld_ind: check calling conv, r1",
		.insns = {