mirror of https://gitee.com/openkylin/linux.git
tun: fix issues of iovec iterators using in tun_put_user()
This patch fixes two issues after using iovec iterators:
- vlan_offset should be initialized to zero, otherwise unexpected offset
will be used in skb_copy_datagram_iter()
- advance iovec iterator when vnet_hdr_sz is greater than sizeof(gso), this
is the case when mergeable rx buffer were enabled for a virt guest.
Fixes e0b46d0ee9
("tun: Use iovec iterators")
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Jason Wang <jasowang@redhat.com>
Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
882288c05e
commit
8c847d2541
|
@ -1235,7 +1235,7 @@ static ssize_t tun_put_user(struct tun_struct *tun,
|
|||
{
|
||||
struct tun_pi pi = { 0, skb->protocol };
|
||||
ssize_t total;
|
||||
int vlan_offset;
|
||||
int vlan_offset = 0;
|
||||
int vlan_hlen = 0;
|
||||
int vnet_hdr_sz = 0;
|
||||
|
||||
|
@ -1304,6 +1304,8 @@ static ssize_t tun_put_user(struct tun_struct *tun,
|
|||
|
||||
if (copy_to_iter(&gso, sizeof(gso), iter) != sizeof(gso))
|
||||
return -EFAULT;
|
||||
|
||||
iov_iter_advance(iter, vnet_hdr_sz - sizeof(gso));
|
||||
}
|
||||
|
||||
if (vlan_hlen) {
|
||||
|
|
Loading…
Reference in New Issue