Skip to content

Commit

Permalink
bpf: fix undefined behavior in narrow load handling
Browse files Browse the repository at this point in the history
Commit 31fd858 ("bpf: permits narrower load from bpf program
context fields") made the verifier add AND instructions to clear the
unwanted bits with a mask when doing a narrow load. The mask is
computed with

  (1 << size * 8) - 1

where "size" is the size of the narrow load. When doing a 4 byte load
of a an 8 byte field the verifier shifts the literal 1 by 32 places to
the left. This results in an overflow of a signed integer, which is an
undefined behavior. Typically, the computed mask was zero, so the
result of the narrow load ended up being zero too.

Cast the literal to long long to avoid overflows. Note that narrow
load of the 4 byte fields does not have the undefined behavior,
because the load size can only be either 1 or 2 bytes, so shifting 1
by 8 or 16 places will not overflow it. And reading 4 bytes would not
be a narrow load of a 4 bytes field.

Fixes: 31fd858 ("bpf: permits narrower load from bpf program context fields")
Reviewed-by: Alban Crequy <[email protected]>
Reviewed-by: Iago López Galeiras <[email protected]>
Signed-off-by: Krzesimir Nowak <[email protected]>
Cc: Yonghong Song <[email protected]>
Signed-off-by: Daniel Borkmann <[email protected]>
  • Loading branch information
krnowak authored and borkmann committed May 13, 2019
1 parent d7c4b39 commit e2f7fc0
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion kernel/bpf/verifier.c
Original file line number Diff line number Diff line change
Expand Up @@ -7599,7 +7599,7 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env)
insn->dst_reg,
shift);
insn_buf[cnt++] = BPF_ALU64_IMM(BPF_AND, insn->dst_reg,
(1 << size * 8) - 1);
(1ULL << size * 8) - 1);
}
}

Expand Down

0 comments on commit e2f7fc0

Please sign in to comment.