hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/net/ipv6/ip6_gre.c
....@@ -955,11 +955,12 @@
955955 goto tx_err;
956956
957957 if (skb->len > dev->mtu + dev->hard_header_len) {
958
- pskb_trim(skb, dev->mtu + dev->hard_header_len);
958
+ if (pskb_trim(skb, dev->mtu + dev->hard_header_len))
959
+ goto tx_err;
959960 truncate = true;
960961 }
961962
962
- nhoff = skb_network_header(skb) - skb_mac_header(skb);
963
+ nhoff = skb_network_offset(skb);
963964 if (skb->protocol == htons(ETH_P_IP) &&
964965 (ntohs(ip_hdr(skb)->tot_len) > skb->len - nhoff))
965966 truncate = true;
....@@ -968,7 +969,7 @@
968969 int thoff;
969970
970971 if (skb_transport_header_was_set(skb))
971
- thoff = skb_transport_header(skb) - skb_mac_header(skb);
972
+ thoff = skb_transport_offset(skb);
972973 else
973974 thoff = nhoff + sizeof(struct ipv6hdr);
974975 if (ntohs(ipv6_hdr(skb)->payload_len) > skb->len - thoff)
....@@ -1015,12 +1016,14 @@
10151016 ntohl(tun_id),
10161017 ntohl(md->u.index), truncate,
10171018 false);
1019
+ proto = htons(ETH_P_ERSPAN);
10181020 } else if (md->version == 2) {
10191021 erspan_build_header_v2(skb,
10201022 ntohl(tun_id),
10211023 md->u.md2.dir,
10221024 get_hwid(&md->u.md2),
10231025 truncate, false);
1026
+ proto = htons(ETH_P_ERSPAN2);
10241027 } else {
10251028 goto tx_err;
10261029 }
....@@ -1043,24 +1046,25 @@
10431046 break;
10441047 }
10451048
1046
- if (t->parms.erspan_ver == 1)
1049
+ if (t->parms.erspan_ver == 1) {
10471050 erspan_build_header(skb, ntohl(t->parms.o_key),
10481051 t->parms.index,
10491052 truncate, false);
1050
- else if (t->parms.erspan_ver == 2)
1053
+ proto = htons(ETH_P_ERSPAN);
1054
+ } else if (t->parms.erspan_ver == 2) {
10511055 erspan_build_header_v2(skb, ntohl(t->parms.o_key),
10521056 t->parms.dir,
10531057 t->parms.hwid,
10541058 truncate, false);
1055
- else
1059
+ proto = htons(ETH_P_ERSPAN2);
1060
+ } else {
10561061 goto tx_err;
1062
+ }
10571063
10581064 fl6.daddr = t->parms.raddr;
10591065 }
10601066
10611067 /* Push GRE header. */
1062
- proto = (t->parms.erspan_ver == 1) ? htons(ETH_P_ERSPAN)
1063
- : htons(ETH_P_ERSPAN2);
10641068 gre_build_header(skb, 8, TUNNEL_SEQ, proto, 0, htonl(atomic_fetch_inc(&t->o_seqno)));
10651069
10661070 /* TooBig packet may have updated dst->dev's mtu */