hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/ipv6/exthdrs.c
....@@ -552,24 +552,6 @@
552552 return -1;
553553 }
554554
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
-
573555 if (!pskb_may_pull(skb, ipv6_rpl_srh_size(n, hdr->cmpri,
574556 hdr->cmpre))) {
575557 kfree_skb(skb);
....@@ -615,6 +597,17 @@
615597 skb_pull(skb, ((hdr->hdrlen + 1) << 3));
616598 skb_postpull_rcsum(skb, oldhdr,
617599 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
+ }
618611 skb_push(skb, ((chdr->hdrlen + 1) << 3) + sizeof(struct ipv6hdr));
619612 skb_reset_network_header(skb);
620613 skb_mac_header_rebuild(skb);