]> git.baikalelectronics.ru Git - kernel.git/commit
bpf: fix msg->data/data_end after sg shift repair in bpf_msg_pull_data
authorDaniel Borkmann <daniel@iogearbox.net>
Wed, 29 Aug 2018 14:50:34 +0000 (16:50 +0200)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 29 Aug 2018 17:47:17 +0000 (10:47 -0700)
commit4f6bbcbc7d4511e95cebf4b3b7c301523d39afd6
tree1a441ac0adf08eeed4949afa5ab67b8868d3fc39
parentf4c2d984f7afe659b0ec21f4566fdee0a87e7a8f
bpf: fix msg->data/data_end after sg shift repair in bpf_msg_pull_data

In the current code, msg->data is set as sg_virt(&sg[i]) + start - offset
and msg->data_end relative to it as msg->data + bytes. Using iterator i
to point to the updated starting scatterlist element holds true for some
cases, however not for all where we'd end up pointing out of bounds. It
is /correct/ for these ones:

1) When first finding the starting scatterlist element (sge) where we
   find that the page is already privately owned by the msg and where
   the requested bytes and headroom fit into the sge's length.

However, it's /incorrect/ for the following ones:

2) After we made the requested area private and updated the newly allocated
   page into first_sg slot of the scatterlist ring; when we find that no
   shift repair of the ring is needed where we bail out updating msg->data
   and msg->data_end. At that point i will point to last_sg, which in this
   case is the next elem of first_sg in the ring. The sge at that point
   might as well be invalid (e.g. i == msg->sg_end), which we use for
   setting the range of sg_virt(&sg[i]). The correct one would have been
   first_sg.

3) Similar as in 2) but when we find that a shift repair of the ring is
   needed. In this case we fix up all sges and stop once we've reached the
   end. In this case i will point to will point to the new msg->sg_end,
   and the sge at that point will be invalid. Again here the requested
   range sits in first_sg.

Fixes: b20b48b5b56e ("bpf: sk_msg program helper bpf_sk_msg_pull_data")
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
net/core/filter.c