tun: fix recovery from gup errors
get user pages might fail partially in tun zero copy mode. To recover we need to put all pages that we got, but code used a wrong index resulting in double-free errors. Reported-by: Brad Hubbard <bhubbard@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Acked-by: Jason Wang <jasowang@redhat.com> Acked-by: Neil Horman <nhorman@tuxdriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
bd8a7036c0
commit
7e24bfbe43
|
@ -1010,8 +1010,10 @@ static int zerocopy_sg_from_iovec(struct sk_buff *skb, const struct iovec *from,
|
||||||
return -EMSGSIZE;
|
return -EMSGSIZE;
|
||||||
num_pages = get_user_pages_fast(base, size, 0, &page[i]);
|
num_pages = get_user_pages_fast(base, size, 0, &page[i]);
|
||||||
if (num_pages != size) {
|
if (num_pages != size) {
|
||||||
for (i = 0; i < num_pages; i++)
|
int j;
|
||||||
put_page(page[i]);
|
|
||||||
|
for (j = 0; j < num_pages; j++)
|
||||||
|
put_page(page[i + j]);
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
truesize = size * PAGE_SIZE;
|
truesize = size * PAGE_SIZE;
|
||||||
|
|
Loading…
Reference in New Issue