On Wed, Jan 8, 2020 at 1:15 PM John Fastabend <john.fastabend@xxxxxxxxx> wrote: > > In the push, pull, and pop helpers operating on skmsg objects to make > data writable or insert/remove data we use this bounds check to ensure > specified data is valid, > > /* Bounds checks: start and pop must be inside message */ > if (start >= offset + l || last >= msg->sg.size) > return -EINVAL; > > The problem here is offset has already included the length of the > current element the 'l' above. So start could be past the end of > the scatterlist element in the case where start also points into an > offset on the last skmsg element. > > To fix do the accounting slightly different by adding the length of > the previous entry to offset at the start of the iteration. And > ensure its initialized to zero so that the first iteration does > nothing. > > Fixes: 604326b41a6fb ("bpf, sockmap: convert to generic sk_msg interface") > Fixes: 6fff607e2f14b ("bpf: sk_msg program helper bpf_msg_push_data") > Fixes: 7246d8ed4dcce ("bpf: helper to pop data from messages") > Signed-off-by: John Fastabend <john.fastabend@xxxxxxxxx> This is pretty tricky... But it looks right. Acked-by: Song Liu <songliubraving@xxxxxx>