|
|
@@ -897,6 +897,9 @@ static netdev_tx_t ip6gre_tunnel_xmit(struct sk_buff *skb,
|
|
|
struct net_device_stats *stats = &t->dev->stats;
|
|
|
int ret;
|
|
|
|
|
|
+ if (!pskb_inet_may_pull(skb))
|
|
|
+ goto tx_err;
|
|
|
+
|
|
|
if (!ip6_tnl_xmit_ctl(t, &t->parms.laddr, &t->parms.raddr))
|
|
|
goto tx_err;
|
|
|
|
|
|
@@ -939,6 +942,9 @@ static netdev_tx_t ip6erspan_tunnel_xmit(struct sk_buff *skb,
|
|
|
int nhoff;
|
|
|
int thoff;
|
|
|
|
|
|
+ if (!pskb_inet_may_pull(skb))
|
|
|
+ goto tx_err;
|
|
|
+
|
|
|
if (!ip6_tnl_xmit_ctl(t, &t->parms.laddr, &t->parms.raddr))
|
|
|
goto tx_err;
|
|
|
|
|
|
@@ -1011,8 +1017,6 @@ static netdev_tx_t ip6erspan_tunnel_xmit(struct sk_buff *skb,
|
|
|
goto tx_err;
|
|
|
}
|
|
|
} else {
|
|
|
- struct ipv6hdr *ipv6h = ipv6_hdr(skb);
|
|
|
-
|
|
|
switch (skb->protocol) {
|
|
|
case htons(ETH_P_IP):
|
|
|
memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
|
|
|
@@ -1020,7 +1024,7 @@ static netdev_tx_t ip6erspan_tunnel_xmit(struct sk_buff *skb,
|
|
|
&dsfield, &encap_limit);
|
|
|
break;
|
|
|
case htons(ETH_P_IPV6):
|
|
|
- if (ipv6_addr_equal(&t->parms.raddr, &ipv6h->saddr))
|
|
|
+ if (ipv6_addr_equal(&t->parms.raddr, &ipv6_hdr(skb)->saddr))
|
|
|
goto tx_err;
|
|
|
if (prepare_ip6gre_xmit_ipv6(skb, dev, &fl6,
|
|
|
&dsfield, &encap_limit))
|