.. | .. |
---|
552 | 552 | return -1; |
---|
553 | 553 | } |
---|
554 | 554 | |
---|
555 | | - if (skb_cloned(skb)) { |
---|
556 | | - if (pskb_expand_head(skb, IPV6_RPL_SRH_WORST_SWAP_SIZE, 0, |
---|
557 | | - GFP_ATOMIC)) { |
---|
558 | | - __IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), |
---|
559 | | - IPSTATS_MIB_OUTDISCARDS); |
---|
560 | | - kfree_skb(skb); |
---|
561 | | - return -1; |
---|
562 | | - } |
---|
563 | | - } else { |
---|
564 | | - err = skb_cow_head(skb, IPV6_RPL_SRH_WORST_SWAP_SIZE); |
---|
565 | | - if (unlikely(err)) { |
---|
566 | | - kfree_skb(skb); |
---|
567 | | - return -1; |
---|
568 | | - } |
---|
569 | | - } |
---|
570 | | - |
---|
571 | | - hdr = (struct ipv6_rpl_sr_hdr *)skb_transport_header(skb); |
---|
572 | | - |
---|
573 | 555 | if (!pskb_may_pull(skb, ipv6_rpl_srh_size(n, hdr->cmpri, |
---|
574 | 556 | hdr->cmpre))) { |
---|
575 | 557 | kfree_skb(skb); |
---|
.. | .. |
---|
615 | 597 | skb_pull(skb, ((hdr->hdrlen + 1) << 3)); |
---|
616 | 598 | skb_postpull_rcsum(skb, oldhdr, |
---|
617 | 599 | sizeof(struct ipv6hdr) + ((hdr->hdrlen + 1) << 3)); |
---|
| 600 | + if (unlikely(!hdr->segments_left)) { |
---|
| 601 | + if (pskb_expand_head(skb, sizeof(struct ipv6hdr) + ((chdr->hdrlen + 1) << 3), 0, |
---|
| 602 | + GFP_ATOMIC)) { |
---|
| 603 | + __IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_OUTDISCARDS); |
---|
| 604 | + kfree_skb(skb); |
---|
| 605 | + kfree(buf); |
---|
| 606 | + return -1; |
---|
| 607 | + } |
---|
| 608 | + |
---|
| 609 | + oldhdr = ipv6_hdr(skb); |
---|
| 610 | + } |
---|
618 | 611 | skb_push(skb, ((chdr->hdrlen + 1) << 3) + sizeof(struct ipv6hdr)); |
---|
619 | 612 | skb_reset_network_header(skb); |
---|
620 | 613 | skb_mac_header_rebuild(skb); |
---|