4.14-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Alexander Aring <ar...@mojatatu.com>

commit ac74f87c789af40936a80131c4759f3e72579c3a upstream.

This patch fixes patch add handling to take care tail and headroom for
single 6lowpan frames. We need to be sure we have a skb with the right
head and tailroom for single frames. This patch do it by using
skb_copy_expand() if head and tailroom is not enough allocated by upper
layer.

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=195059
Reported-by: David Palma <david.pa...@ntnu.no>
Reported-by: Rabi Narayan Sahoo <rabinarayans0...@gmail.com>
Cc: sta...@vger.kernel.org
Signed-off-by: Alexander Aring <ar...@mojatatu.com>
Signed-off-by: Stefan Schmidt <ste...@datenfreihafen.org>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>

---
 net/ieee802154/6lowpan/tx.c |   21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

--- a/net/ieee802154/6lowpan/tx.c
+++ b/net/ieee802154/6lowpan/tx.c
@@ -265,9 +265,24 @@ netdev_tx_t lowpan_xmit(struct sk_buff *
        /* We must take a copy of the skb before we modify/replace the ipv6
         * header as the header could be used elsewhere
         */
-       skb = skb_unshare(skb, GFP_ATOMIC);
-       if (!skb)
-               return NET_XMIT_DROP;
+       if (unlikely(skb_headroom(skb) < ldev->needed_headroom ||
+                    skb_tailroom(skb) < ldev->needed_tailroom)) {
+               struct sk_buff *nskb;
+
+               nskb = skb_copy_expand(skb, ldev->needed_headroom,
+                                      ldev->needed_tailroom, GFP_ATOMIC);
+               if (likely(nskb)) {
+                       consume_skb(skb);
+                       skb = nskb;
+               } else {
+                       kfree_skb(skb);
+                       return NET_XMIT_DROP;
+               }
+       } else {
+               skb = skb_unshare(skb, GFP_ATOMIC);
+               if (!skb)
+                       return NET_XMIT_DROP;
+       }
 
        ret = lowpan_header(skb, ldev, &dgram_size, &dgram_offset);
        if (ret < 0) {


Reply via email to