Skip to content

Commit 9db39f4

Browse files
tndaveborkmann
authored andcommitted
bpf: Fix bpf_msg_pull_data()
Helper bpf_msg_pull_data() mistakenly reuses variable 'offset' while linearizing multiple scatterlist elements. Variable 'offset' is used to find first starting scatterlist element i.e. msg->data = sg_virt(&sg[first_sg]) + start - offset" Use different variable name while linearizing multiple scatterlist elements so that value contained in variable 'offset' won't get overwritten. Fixes: 015632b ("bpf: sk_msg program helper bpf_sk_msg_pull_data") Signed-off-by: Tushar Dave <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]>
1 parent 93bbadd commit 9db39f4

File tree

1 file changed

+3
-4
lines changed

1 file changed

+3
-4
lines changed

net/core/filter.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2292,7 +2292,7 @@ static const struct bpf_func_proto bpf_msg_cork_bytes_proto = {
22922292
BPF_CALL_4(bpf_msg_pull_data,
22932293
struct sk_msg_buff *, msg, u32, start, u32, end, u64, flags)
22942294
{
2295-
unsigned int len = 0, offset = 0, copy = 0;
2295+
unsigned int len = 0, offset = 0, copy = 0, poffset = 0;
22962296
int bytes = end - start, bytes_sg_total;
22972297
struct scatterlist *sg = msg->sg_data;
22982298
int first_sg, last_sg, i, shift;
@@ -2348,16 +2348,15 @@ BPF_CALL_4(bpf_msg_pull_data,
23482348
if (unlikely(!page))
23492349
return -ENOMEM;
23502350
p = page_address(page);
2351-
offset = 0;
23522351

23532352
i = first_sg;
23542353
do {
23552354
from = sg_virt(&sg[i]);
23562355
len = sg[i].length;
2357-
to = p + offset;
2356+
to = p + poffset;
23582357

23592358
memcpy(to, from, len);
2360-
offset += len;
2359+
poffset += len;
23612360
sg[i].length = 0;
23622361
put_page(sg_page(&sg[i]));
23632362

0 commit comments

Comments
 (0)