* [PATCH net V3 1/2] tun: unbreak truncated packet signalling
@ 2013-12-11 5:08 Jason Wang
2013-12-11 5:08 ` [PATCH net V3 2/2] macvtap: signal truncated packets Jason Wang
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Jason Wang @ 2013-12-11 5:08 UTC (permalink / raw)
To: davem, netdev, linux-kernel
Cc: Jason Wang, Zhi Yong Wu, Michael S. Tsirkin, Vlad Yasevich
Commit 6680ec68eff47d36f67b4351bc9836fd6cba9532
(tuntap: hardware vlan tx support) breaks the truncated packet signal by nev
return a length greater than iov length in tun_put_user(). This patch fixes
by always return the length of packet plus possible vlan header. Caller can
detect the truncated packet by comparing the return value and the size of io
length.
Cc: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Vlad Yasevich <vyasevich@gmail.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
Changes from V2:
- use "copied" as the variable name instead to be more descriptive
Changes from v1:
- increase total unconditionally
- do not move veth structure out of the vlan handing block
---
drivers/net/tun.c | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index e26cbea..7c8343a 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -1184,7 +1184,7 @@ static ssize_t tun_put_user(struct tun_struct *tun,
{
struct tun_pi pi = { 0, skb->protocol };
ssize_t total = 0;
- int vlan_offset = 0;
+ int vlan_offset = 0, copied;
if (!(tun->flags & TUN_NO_PI)) {
if ((len -= sizeof(pi)) < 0)
@@ -1248,6 +1248,8 @@ static ssize_t tun_put_user(struct tun_struct *tun,
total += tun->vnet_hdr_sz;
}
+ copied = total;
+ total += skb->len;
if (!vlan_tx_tag_present(skb)) {
len = min_t(int, skb->len, len);
} else {
@@ -1262,24 +1264,24 @@ static ssize_t tun_put_user(struct tun_struct *tun,
vlan_offset = offsetof(struct vlan_ethhdr, h_vlan_proto);
len = min_t(int, skb->len + VLAN_HLEN, len);
+ total += VLAN_HLEN;
copy = min_t(int, vlan_offset, len);
- ret = skb_copy_datagram_const_iovec(skb, 0, iv, total, copy);
+ ret = skb_copy_datagram_const_iovec(skb, 0, iv, copied, copy);
len -= copy;
- total += copy;
+ copied += copy;
if (ret || !len)
goto done;
copy = min_t(int, sizeof(veth), len);
- ret = memcpy_toiovecend(iv, (void *)&veth, total, copy);
+ ret = memcpy_toiovecend(iv, (void *)&veth, copied, copy);
len -= copy;
- total += copy;
+ copied += copy;
if (ret || !len)
goto done;
}
- skb_copy_datagram_const_iovec(skb, vlan_offset, iv, total, len);
- total += len;
+ skb_copy_datagram_const_iovec(skb, vlan_offset, iv, copied, len);
done:
tun->dev->stats.tx_packets++;
--
1.8.3.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH net V3 2/2] macvtap: signal truncated packets
2013-12-11 5:08 [PATCH net V3 1/2] tun: unbreak truncated packet signalling Jason Wang
@ 2013-12-11 5:08 ` Jason Wang
2013-12-11 14:25 ` Vlad Yasevich
` (2 more replies)
2013-12-11 14:32 ` [PATCH net V3 1/2] tun: unbreak truncated packet signalling Michael S. Tsirkin
2013-12-11 20:26 ` David Miller
2 siblings, 3 replies; 7+ messages in thread
From: Jason Wang @ 2013-12-11 5:08 UTC (permalink / raw)
To: davem, netdev, linux-kernel
Cc: Jason Wang, Vlad Yasevich, Zhi Yong Wu, Michael S. Tsirkin
macvtap_put_user() never return a value grater than iov length, this in fact
bypasses the truncated checking in macvtap_recvmsg(). Fix this by always
returning the size of packet plus the possible vlan header to let the trunca
checking work.
Cc: Vlad Yasevich <vyasevich@gmail.com>
Cc: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
Changes from V2:
- use total as the bytes of packet returned
Changes from V1:
- increase total unconditionally
- do not move the structure veth out of the vlan handling block
---
drivers/net/macvtap.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
index 957cc5c..2a89da0 100644
--- a/drivers/net/macvtap.c
+++ b/drivers/net/macvtap.c
@@ -770,7 +770,7 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
int ret;
int vnet_hdr_len = 0;
int vlan_offset = 0;
- int copied;
+ int copied, total;
if (q->flags & IFF_VNET_HDR) {
struct virtio_net_hdr vnet_hdr;
@@ -785,7 +785,8 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
if (memcpy_toiovecend(iv, (void *)&vnet_hdr, 0, sizeof(vnet_hdr)))
return -EFAULT;
}
- copied = vnet_hdr_len;
+ total = copied = vnet_hdr_len;
+ total += skb->len;
if (!vlan_tx_tag_present(skb))
len = min_t(int, skb->len, len);
@@ -800,6 +801,7 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
vlan_offset = offsetof(struct vlan_ethhdr, h_vlan_proto);
len = min_t(int, skb->len + VLAN_HLEN, len);
+ total += VLAN_HLEN;
copy = min_t(int, vlan_offset, len);
ret = skb_copy_datagram_const_iovec(skb, 0, iv, copied, copy);
@@ -817,10 +819,9 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
}
ret = skb_copy_datagram_const_iovec(skb, vlan_offset, iv, copied, len);
- copied += len;
done:
- return ret ? ret : copied;
+ return ret ? ret : total;
}
static ssize_t macvtap_do_read(struct macvtap_queue *q, struct kiocb *iocb,
@@ -875,7 +876,7 @@ static ssize_t macvtap_aio_read(struct kiocb *iocb, const struct iovec *iv,
}
ret = macvtap_do_read(q, iocb, iv, len, file->f_flags & O_NONBLOCK);
- ret = min_t(ssize_t, ret, len); /* XXX copied from tun.c. Why? */
+ ret = min_t(ssize_t, ret, len);
if (ret > 0)
iocb->ki_pos = ret;
out:
--
1.8.3.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH net V3 2/2] macvtap: signal truncated packets
2013-12-11 5:08 ` [PATCH net V3 2/2] macvtap: signal truncated packets Jason Wang
@ 2013-12-11 14:25 ` Vlad Yasevich
2013-12-11 14:32 ` Michael S. Tsirkin
2013-12-11 20:26 ` David Miller
2 siblings, 0 replies; 7+ messages in thread
From: Vlad Yasevich @ 2013-12-11 14:25 UTC (permalink / raw)
To: Jason Wang, davem, netdev, linux-kernel; +Cc: Zhi Yong Wu, Michael S. Tsirkin
On 12/11/2013 12:08 AM, Jason Wang wrote:
> macvtap_put_user() never return a value grater than iov length, this in fact
> bypasses the truncated checking in macvtap_recvmsg(). Fix this by always
> returning the size of packet plus the possible vlan header to let the trunca
> checking work.
>
> Cc: Vlad Yasevich <vyasevich@gmail.com>
> Cc: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Jason Wang <jasowang@redhat.com>
Acked-by: Vlad Yasevich <vyasevich@gmail.com>
-vlad
> ---
> Changes from V2:
> - use total as the bytes of packet returned
> Changes from V1:
> - increase total unconditionally
> - do not move the structure veth out of the vlan handling block
> ---
> drivers/net/macvtap.c | 11 ++++++-----
> 1 file changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
> index 957cc5c..2a89da0 100644
> --- a/drivers/net/macvtap.c
> +++ b/drivers/net/macvtap.c
> @@ -770,7 +770,7 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
> int ret;
> int vnet_hdr_len = 0;
> int vlan_offset = 0;
> - int copied;
> + int copied, total;
>
> if (q->flags & IFF_VNET_HDR) {
> struct virtio_net_hdr vnet_hdr;
> @@ -785,7 +785,8 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
> if (memcpy_toiovecend(iv, (void *)&vnet_hdr, 0, sizeof(vnet_hdr)))
> return -EFAULT;
> }
> - copied = vnet_hdr_len;
> + total = copied = vnet_hdr_len;
> + total += skb->len;
>
> if (!vlan_tx_tag_present(skb))
> len = min_t(int, skb->len, len);
> @@ -800,6 +801,7 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
>
> vlan_offset = offsetof(struct vlan_ethhdr, h_vlan_proto);
> len = min_t(int, skb->len + VLAN_HLEN, len);
> + total += VLAN_HLEN;
>
> copy = min_t(int, vlan_offset, len);
> ret = skb_copy_datagram_const_iovec(skb, 0, iv, copied, copy);
> @@ -817,10 +819,9 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
> }
>
> ret = skb_copy_datagram_const_iovec(skb, vlan_offset, iv, copied, len);
> - copied += len;
>
> done:
> - return ret ? ret : copied;
> + return ret ? ret : total;
> }
>
> static ssize_t macvtap_do_read(struct macvtap_queue *q, struct kiocb *iocb,
> @@ -875,7 +876,7 @@ static ssize_t macvtap_aio_read(struct kiocb *iocb, const struct iovec *iv,
> }
>
> ret = macvtap_do_read(q, iocb, iv, len, file->f_flags & O_NONBLOCK);
> - ret = min_t(ssize_t, ret, len); /* XXX copied from tun.c. Why? */
> + ret = min_t(ssize_t, ret, len);
> if (ret > 0)
> iocb->ki_pos = ret;
> out:
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net V3 2/2] macvtap: signal truncated packets
2013-12-11 5:08 ` [PATCH net V3 2/2] macvtap: signal truncated packets Jason Wang
2013-12-11 14:25 ` Vlad Yasevich
@ 2013-12-11 14:32 ` Michael S. Tsirkin
2013-12-11 20:26 ` David Miller
2 siblings, 0 replies; 7+ messages in thread
From: Michael S. Tsirkin @ 2013-12-11 14:32 UTC (permalink / raw)
To: Jason Wang; +Cc: davem, netdev, linux-kernel, Vlad Yasevich, Zhi Yong Wu
On Wed, Dec 11, 2013 at 01:08:34PM +0800, Jason Wang wrote:
> macvtap_put_user() never return a value grater than iov length, this in fact
> bypasses the truncated checking in macvtap_recvmsg(). Fix this by always
> returning the size of packet plus the possible vlan header to let the trunca
> checking work.
>
> Cc: Vlad Yasevich <vyasevich@gmail.com>
> Cc: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Jason Wang <jasowang@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
> ---
> Changes from V2:
> - use total as the bytes of packet returned
> Changes from V1:
> - increase total unconditionally
> - do not move the structure veth out of the vlan handling block
> ---
> drivers/net/macvtap.c | 11 ++++++-----
> 1 file changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
> index 957cc5c..2a89da0 100644
> --- a/drivers/net/macvtap.c
> +++ b/drivers/net/macvtap.c
> @@ -770,7 +770,7 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
> int ret;
> int vnet_hdr_len = 0;
> int vlan_offset = 0;
> - int copied;
> + int copied, total;
>
> if (q->flags & IFF_VNET_HDR) {
> struct virtio_net_hdr vnet_hdr;
> @@ -785,7 +785,8 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
> if (memcpy_toiovecend(iv, (void *)&vnet_hdr, 0, sizeof(vnet_hdr)))
> return -EFAULT;
> }
> - copied = vnet_hdr_len;
> + total = copied = vnet_hdr_len;
> + total += skb->len;
>
> if (!vlan_tx_tag_present(skb))
> len = min_t(int, skb->len, len);
> @@ -800,6 +801,7 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
>
> vlan_offset = offsetof(struct vlan_ethhdr, h_vlan_proto);
> len = min_t(int, skb->len + VLAN_HLEN, len);
> + total += VLAN_HLEN;
>
> copy = min_t(int, vlan_offset, len);
> ret = skb_copy_datagram_const_iovec(skb, 0, iv, copied, copy);
> @@ -817,10 +819,9 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
> }
>
> ret = skb_copy_datagram_const_iovec(skb, vlan_offset, iv, copied, len);
> - copied += len;
>
> done:
> - return ret ? ret : copied;
> + return ret ? ret : total;
> }
>
> static ssize_t macvtap_do_read(struct macvtap_queue *q, struct kiocb *iocb,
> @@ -875,7 +876,7 @@ static ssize_t macvtap_aio_read(struct kiocb *iocb, const struct iovec *iv,
> }
>
> ret = macvtap_do_read(q, iocb, iv, len, file->f_flags & O_NONBLOCK);
> - ret = min_t(ssize_t, ret, len); /* XXX copied from tun.c. Why? */
> + ret = min_t(ssize_t, ret, len);
> if (ret > 0)
> iocb->ki_pos = ret;
> out:
> --
> 1.8.3.2
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net V3 1/2] tun: unbreak truncated packet signalling
2013-12-11 5:08 [PATCH net V3 1/2] tun: unbreak truncated packet signalling Jason Wang
2013-12-11 5:08 ` [PATCH net V3 2/2] macvtap: signal truncated packets Jason Wang
@ 2013-12-11 14:32 ` Michael S. Tsirkin
2013-12-11 20:26 ` David Miller
2 siblings, 0 replies; 7+ messages in thread
From: Michael S. Tsirkin @ 2013-12-11 14:32 UTC (permalink / raw)
To: Jason Wang; +Cc: davem, netdev, linux-kernel, Zhi Yong Wu, Vlad Yasevich
On Wed, Dec 11, 2013 at 01:08:33PM +0800, Jason Wang wrote:
> Commit 6680ec68eff47d36f67b4351bc9836fd6cba9532
> (tuntap: hardware vlan tx support) breaks the truncated packet signal by nev
> return a length greater than iov length in tun_put_user(). This patch fixes
> by always return the length of packet plus possible vlan header. Caller can
> detect the truncated packet by comparing the return value and the size of io
> length.
>
> Cc: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Vlad Yasevich <vyasevich@gmail.com>
> Signed-off-by: Jason Wang <jasowang@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
> ---
> Changes from V2:
> - use "copied" as the variable name instead to be more descriptive
> Changes from v1:
> - increase total unconditionally
> - do not move veth structure out of the vlan handing block
> ---
> drivers/net/tun.c | 16 +++++++++-------
> 1 file changed, 9 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/net/tun.c b/drivers/net/tun.c
> index e26cbea..7c8343a 100644
> --- a/drivers/net/tun.c
> +++ b/drivers/net/tun.c
> @@ -1184,7 +1184,7 @@ static ssize_t tun_put_user(struct tun_struct *tun,
> {
> struct tun_pi pi = { 0, skb->protocol };
> ssize_t total = 0;
> - int vlan_offset = 0;
> + int vlan_offset = 0, copied;
>
> if (!(tun->flags & TUN_NO_PI)) {
> if ((len -= sizeof(pi)) < 0)
> @@ -1248,6 +1248,8 @@ static ssize_t tun_put_user(struct tun_struct *tun,
> total += tun->vnet_hdr_sz;
> }
>
> + copied = total;
> + total += skb->len;
> if (!vlan_tx_tag_present(skb)) {
> len = min_t(int, skb->len, len);
> } else {
> @@ -1262,24 +1264,24 @@ static ssize_t tun_put_user(struct tun_struct *tun,
>
> vlan_offset = offsetof(struct vlan_ethhdr, h_vlan_proto);
> len = min_t(int, skb->len + VLAN_HLEN, len);
> + total += VLAN_HLEN;
>
> copy = min_t(int, vlan_offset, len);
> - ret = skb_copy_datagram_const_iovec(skb, 0, iv, total, copy);
> + ret = skb_copy_datagram_const_iovec(skb, 0, iv, copied, copy);
> len -= copy;
> - total += copy;
> + copied += copy;
> if (ret || !len)
> goto done;
>
> copy = min_t(int, sizeof(veth), len);
> - ret = memcpy_toiovecend(iv, (void *)&veth, total, copy);
> + ret = memcpy_toiovecend(iv, (void *)&veth, copied, copy);
> len -= copy;
> - total += copy;
> + copied += copy;
> if (ret || !len)
> goto done;
> }
>
> - skb_copy_datagram_const_iovec(skb, vlan_offset, iv, total, len);
> - total += len;
> + skb_copy_datagram_const_iovec(skb, vlan_offset, iv, copied, len);
>
> done:
> tun->dev->stats.tx_packets++;
> --
> 1.8.3.2
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net V3 1/2] tun: unbreak truncated packet signalling
2013-12-11 5:08 [PATCH net V3 1/2] tun: unbreak truncated packet signalling Jason Wang
2013-12-11 5:08 ` [PATCH net V3 2/2] macvtap: signal truncated packets Jason Wang
2013-12-11 14:32 ` [PATCH net V3 1/2] tun: unbreak truncated packet signalling Michael S. Tsirkin
@ 2013-12-11 20:26 ` David Miller
2 siblings, 0 replies; 7+ messages in thread
From: David Miller @ 2013-12-11 20:26 UTC (permalink / raw)
To: jasowang; +Cc: netdev, linux-kernel, wuzhy, mst, vyasevich
From: Jason Wang <jasowang@redhat.com>
Date: Wed, 11 Dec 2013 13:08:33 +0800
> Commit 6680ec68eff47d36f67b4351bc9836fd6cba9532
> (tuntap: hardware vlan tx support) breaks the truncated packet signal by nev
> return a length greater than iov length in tun_put_user(). This patch fixes
> by always return the length of packet plus possible vlan header. Caller can
> detect the truncated packet by comparing the return value and the size of io
> length.
>
> Cc: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Vlad Yasevich <vyasevich@gmail.com>
> Signed-off-by: Jason Wang <jasowang@redhat.com>
Applied and queued up for -stable.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net V3 2/2] macvtap: signal truncated packets
2013-12-11 5:08 ` [PATCH net V3 2/2] macvtap: signal truncated packets Jason Wang
2013-12-11 14:25 ` Vlad Yasevich
2013-12-11 14:32 ` Michael S. Tsirkin
@ 2013-12-11 20:26 ` David Miller
2 siblings, 0 replies; 7+ messages in thread
From: David Miller @ 2013-12-11 20:26 UTC (permalink / raw)
To: jasowang; +Cc: netdev, linux-kernel, vyasevich, wuzhy, mst
From: Jason Wang <jasowang@redhat.com>
Date: Wed, 11 Dec 2013 13:08:34 +0800
> macvtap_put_user() never return a value grater than iov length, this in fact
> bypasses the truncated checking in macvtap_recvmsg(). Fix this by always
> returning the size of packet plus the possible vlan header to let the trunca
> checking work.
>
> Cc: Vlad Yasevich <vyasevich@gmail.com>
> Cc: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Jason Wang <jasowang@redhat.com>
Also applied and queued up for -stable, thanks.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2013-12-11 20:26 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-12-11 5:08 [PATCH net V3 1/2] tun: unbreak truncated packet signalling Jason Wang
2013-12-11 5:08 ` [PATCH net V3 2/2] macvtap: signal truncated packets Jason Wang
2013-12-11 14:25 ` Vlad Yasevich
2013-12-11 14:32 ` Michael S. Tsirkin
2013-12-11 20:26 ` David Miller
2013-12-11 14:32 ` [PATCH net V3 1/2] tun: unbreak truncated packet signalling Michael S. Tsirkin
2013-12-11 20:26 ` David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).