Merge branch 'master' of git://git.infradead.org/users/linville/wireless-next into...
[pandora-kernel.git] / drivers / net / virtio_net.c
index 0c7321c..b8225f3 100644 (file)
@@ -149,7 +149,7 @@ static void set_skb_frag(struct sk_buff *skb, struct page *page,
        f = &skb_shinfo(skb)->frags[i];
        f->size = min((unsigned)PAGE_SIZE - offset, *len);
        f->page_offset = offset;
-       f->page = page;
+       __skb_frag_set_page(f, page);
 
        skb->data_len += f->size;
        skb->len += f->size;
@@ -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;
@@ -949,6 +962,7 @@ static int virtnet_probe(struct virtio_device *vdev)
                return -ENOMEM;
 
        /* Set up network device as normal. */
+       dev->priv_flags |= IFF_UNICAST_FLT;
        dev->netdev_ops = &virtnet_netdev;
        dev->features = NETIF_F_HIGHDMA;