aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Wang <jasowang@redhat.com>2014-11-13 03:54:14 -0500
committerDavid S. Miller <davem@davemloft.net>2014-11-13 14:33:22 -0500
commit8c847d254146d32c86574a1b16923ff91bb784dd (patch)
tree5c6634687b9833a81cef836f88e466bc267126e9
parent882288c05ede954e797baa623062f5ea06663ae1 (diff)
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 e0b46d0ee9c240c7430a47e9b0365674d4a04522 ("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>
-rw-r--r--drivers/net/tun.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index 2ff769bf3f35..e3fa65a4d96c 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -1235,7 +1235,7 @@ static ssize_t tun_put_user(struct tun_struct *tun,
1235{ 1235{
1236 struct tun_pi pi = { 0, skb->protocol }; 1236 struct tun_pi pi = { 0, skb->protocol };
1237 ssize_t total; 1237 ssize_t total;
1238 int vlan_offset; 1238 int vlan_offset = 0;
1239 int vlan_hlen = 0; 1239 int vlan_hlen = 0;
1240 int vnet_hdr_sz = 0; 1240 int vnet_hdr_sz = 0;
1241 1241
@@ -1304,6 +1304,8 @@ static ssize_t tun_put_user(struct tun_struct *tun,
1304 1304
1305 if (copy_to_iter(&gso, sizeof(gso), iter) != sizeof(gso)) 1305 if (copy_to_iter(&gso, sizeof(gso), iter) != sizeof(gso))
1306 return -EFAULT; 1306 return -EFAULT;
1307
1308 iov_iter_advance(iter, vnet_hdr_sz - sizeof(gso));
1307 } 1309 }
1308 1310
1309 if (vlan_hlen) { 1311 if (vlan_hlen) {