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 };
|
struct tun_pi pi = { 0, skb->protocol };
|
||||||
ssize_t total;
|
ssize_t total;
|
||||||
int vlan_offset;
|
int vlan_offset = 0;
|
||||||
int vlan_hlen = 0;
|
int vlan_hlen = 0;
|
||||||
int vnet_hdr_sz = 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))
|
if (copy_to_iter(&gso, sizeof(gso), iter) != sizeof(gso))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
iov_iter_advance(iter, vnet_hdr_sz - sizeof(gso));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vlan_hlen) {
|
if (vlan_hlen) {
|
||||||
|
|
Loading…
Reference in New Issue