diff options
-rw-r--r-- | net/ieee802154/6lowpan.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/net/ieee802154/6lowpan.c b/net/ieee802154/6lowpan.c index 6a095225148e..b28ec790c7c8 100644 --- a/net/ieee802154/6lowpan.c +++ b/net/ieee802154/6lowpan.c | |||
@@ -1133,6 +1133,8 @@ static int lowpan_validate(struct nlattr *tb[], struct nlattr *data[]) | |||
1133 | static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev, | 1133 | static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev, |
1134 | struct packet_type *pt, struct net_device *orig_dev) | 1134 | struct packet_type *pt, struct net_device *orig_dev) |
1135 | { | 1135 | { |
1136 | struct sk_buff *local_skb; | ||
1137 | |||
1136 | if (!netif_running(dev)) | 1138 | if (!netif_running(dev)) |
1137 | goto drop; | 1139 | goto drop; |
1138 | 1140 | ||
@@ -1144,7 +1146,12 @@ static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev, | |||
1144 | case LOWPAN_DISPATCH_IPHC: /* ipv6 datagram */ | 1146 | case LOWPAN_DISPATCH_IPHC: /* ipv6 datagram */ |
1145 | case LOWPAN_DISPATCH_FRAG1: /* first fragment header */ | 1147 | case LOWPAN_DISPATCH_FRAG1: /* first fragment header */ |
1146 | case LOWPAN_DISPATCH_FRAGN: /* next fragments headers */ | 1148 | case LOWPAN_DISPATCH_FRAGN: /* next fragments headers */ |
1147 | lowpan_process_data(skb); | 1149 | local_skb = skb_clone(skb, GFP_ATOMIC); |
1150 | if (!local_skb) | ||
1151 | goto drop; | ||
1152 | lowpan_process_data(local_skb); | ||
1153 | |||
1154 | kfree_skb(skb); | ||
1148 | break; | 1155 | break; |
1149 | default: | 1156 | default: |
1150 | break; | 1157 | break; |