diff options
author | Jason Wang <jasowang@redhat.com> | 2014-11-13 03:54:14 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-11-13 14:33:22 -0500 |
commit | 8c847d254146d32c86574a1b16923ff91bb784dd (patch) | |
tree | 5c6634687b9833a81cef836f88e466bc267126e9 | |
parent | 882288c05ede954e797baa623062f5ea06663ae1 (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.c | 4 |
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) { |