|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [linux-2.6.18-xen] netback: don't disconnect frontend when seeing oversize packet
# HG changeset patch
# User David Vrabel <david.vrabel@xxxxxxxxxx>
# Date 1367332231 -7200
# Node ID 03152e80954136f7eb4ea37c7dc358024a45888f
# Parent 874725c5afa10717a5307f5f1c6bdc4baa655c9d
netback: don't disconnect frontend when seeing oversize packet
Some frontend drivers are sending packets > 64 KiB in length. This length
overflows the length field in the first slot making the following slots have
an invalid length.
Turn this error back into a non-fatal error by dropping the packet. To avoid
having the following slots having fatal errors, consume all slots in the
packet.
This does not reopen the security hole in XSA-39 as if the packet as an
invalid number of slots it will still hit fatal error case.
Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx>
Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
Committed-by: Jan Beulich <jbeulich@xxxxxxxx>
---
diff -r 874725c5afa1 -r 03152e809541 drivers/xen/netback/netback.c
--- a/drivers/xen/netback/netback.c Mon Apr 15 10:37:23 2013 +0200
+++ b/drivers/xen/netback/netback.c Tue Apr 30 16:30:31 2013 +0200
@@ -1034,7 +1034,7 @@ static int netbk_count_requests(netif_t
netif_tx_request_t *txp, int work_to_do)
{
RING_IDX cons = netif->tx.req_cons;
- int frags = 0;
+ int frags = 0, drop_err = 0;
if (!(first->flags & NETTXF_more_data))
return 0;
@@ -1056,11 +1056,22 @@ static int netbk_count_requests(netif_t
memcpy(txp, RING_GET_REQUEST(&netif->tx, cons + frags),
sizeof(*txp));
- if (txp->size > first->size) {
- printk(KERN_ERR "%s: Frag is bigger than frame.\n",
- netif->dev->name);
- netbk_fatal_tx_err(netif);
- return -EIO;
+
+ /*
+ * If the guest submitted a frame >= 64 KiB then first->size
+ * overflowed and following slots will appear to be larger
+ * than the frame. This cannot be fatal error as there are
+ * buggy frontends that do this.
+ *
+ * Consume all slots and drop the packet.
+ */
+ if (!drop_err && txp->size > first->size) {
+ if (net_ratelimit())
+ DPRINTK("%s: Invalid tx request"
+ " (slot size %u > remaining size %u)\n",
+ netif->dev->name,
+ txp->size, first->size);
+ drop_err = -EIO;
}
first->size -= txp->size;
@@ -1074,6 +1085,11 @@ static int netbk_count_requests(netif_t
}
} while ((txp++)->flags & NETTXF_more_data);
+ if (drop_err) {
+ netbk_tx_err(netif, first, cons + frags);
+ return drop_err;
+ }
+
return frags;
}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |