Skip to content

Commit 4acf6c0

Browse files
Brenden Blancodavem330
Brenden Blanco
authored andcommitted
bpf: enable direct packet data write for xdp progs
For forwarding to be effective, XDP programs should be allowed to rewrite packet data. This requires that the drivers supporting XDP must all map the packet memory as TODEVICE or BIDIRECTIONAL before invoking the program. Signed-off-by: Brenden Blanco <[email protected]> Acked-by: Alexei Starovoitov <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 9ecc2d8 commit 4acf6c0

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

Diff for: kernel/bpf/verifier.c

+16-1
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,16 @@ static int check_map_access(struct verifier_env *env, u32 regno, int off,
653653

654654
#define MAX_PACKET_OFF 0xffff
655655

656+
static bool may_write_pkt_data(enum bpf_prog_type type)
657+
{
658+
switch (type) {
659+
case BPF_PROG_TYPE_XDP:
660+
return true;
661+
default:
662+
return false;
663+
}
664+
}
665+
656666
static int check_packet_access(struct verifier_env *env, u32 regno, int off,
657667
int size)
658668
{
@@ -806,10 +816,15 @@ static int check_mem_access(struct verifier_env *env, u32 regno, int off,
806816
err = check_stack_read(state, off, size, value_regno);
807817
}
808818
} else if (state->regs[regno].type == PTR_TO_PACKET) {
809-
if (t == BPF_WRITE) {
819+
if (t == BPF_WRITE && !may_write_pkt_data(env->prog->type)) {
810820
verbose("cannot write into packet\n");
811821
return -EACCES;
812822
}
823+
if (t == BPF_WRITE && value_regno >= 0 &&
824+
is_pointer_value(env, value_regno)) {
825+
verbose("R%d leaks addr into packet\n", value_regno);
826+
return -EACCES;
827+
}
813828
err = check_packet_access(env, regno, off, size);
814829
if (!err && t == BPF_READ && value_regno >= 0)
815830
mark_reg_unknown_value(state->regs, value_regno);

0 commit comments

Comments
 (0)