net: bridge: xmit: make sure we have at least eth header len bytes
[linux-block.git] / net / bridge / br_device.c
index c366ccc8b3db7b3052faea7fc75367d6a9f052b5..ecac7886988b1506fcb044ae582951b72e91966a 100644 (file)
@@ -27,6 +27,7 @@ EXPORT_SYMBOL_GPL(nf_br_ops);
 /* net device transmit always called with BH disabled */
 netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
 {
+       enum skb_drop_reason reason = pskb_may_pull_reason(skb, ETH_HLEN);
        struct net_bridge_mcast_port *pmctx_null = NULL;
        struct net_bridge *br = netdev_priv(dev);
        struct net_bridge_mcast *brmctx = &br->multicast_ctx;
@@ -38,6 +39,11 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
        const unsigned char *dest;
        u16 vid = 0;
 
+       if (unlikely(reason != SKB_NOT_DROPPED_YET)) {
+               kfree_skb_reason(skb, reason);
+               return NETDEV_TX_OK;
+       }
+
        memset(skb->cb, 0, sizeof(struct br_input_skb_cb));
        br_tc_skb_miss_set(skb, false);