|
@@ -195,6 +195,19 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi,
|
|
|
len -= copy;
|
|
|
offset += copy;
|
|
|
|
|
|
+ /*
|
|
|
+ * Verify that we can indeed put this data into a skb.
|
|
|
+ * This is here to handle cases when the device erroneously
|
|
|
+ * tries to receive more than is possible. This is usually
|
|
|
+ * the case of a broken device.
|
|
|
+ */
|
|
|
+ if (unlikely(len > MAX_SKB_FRAGS * PAGE_SIZE)) {
|
|
|
+ if (net_ratelimit())
|
|
|
+ pr_debug("%s: too much data\n", skb->dev->name);
|
|
|
+ dev_kfree_skb(skb);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
while (len) {
|
|
|
set_skb_frag(skb, page, offset, &len);
|
|
|
page = (struct page *)page->private;
|