mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
bpf: Use memmove() to store bytes in an skb
Through bpf_dynptr_write() and bpf_dynptr_copy() the source of
bpf_skb_store_bytes() can be a slice of the same skb which overlaps the
destination. memcpy() then reads bytes which it has overwritten already. On
x86 with FSRM it repeats the first bytes of the source instead of copying
it. Local, ringbuf and skb metadata dynptrs are written with memmove() for
that reason.
Fixes: 2012c867c8 ("bpf: verifier: Accept dynptr mem as mem in helpers")
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://patch.msgid.link/20261017230950.802052-15-alexei.starovoitov@gmail.com
This commit is contained in:
parent
1c19f2b3b2
commit
1db084f428
|
|
@ -1749,7 +1749,8 @@ BPF_CALL_5(bpf_skb_store_bytes, struct sk_buff *, skb, u32, offset,
|
|||
if (flags & BPF_F_RECOMPUTE_CSUM)
|
||||
__skb_postpull_rcsum(skb, ptr, len, offset);
|
||||
|
||||
memcpy(ptr, from, len);
|
||||
/* through a dynptr the source may be an overlapping slice of the skb */
|
||||
memmove(ptr, from, len);
|
||||
|
||||
if (flags & BPF_F_RECOMPUTE_CSUM)
|
||||
__skb_postpush_rcsum(skb, ptr, len, offset);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user