[IPSEC]: Fix panic when using inter address familiy IPsec on loopback.
authorKazunori MIYAZAWA <kazunori@miyazawa.org>
Tue, 29 May 2007 20:03:17 +0000 (13:03 -0700)
committerDavid S. Miller <davem@sunset.davemloft.net>
Thu, 31 May 2007 08:23:28 +0000 (01:23 -0700)
Signed-off-by: Kazunori MIYAZAWA <kazunori@miyazawa.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/xfrm4_input.c
net/ipv4/xfrm4_mode_tunnel.c
net/ipv6/xfrm6_input.c
net/ipv6/xfrm6_mode_tunnel.c

index 5ceca951d73f4fc4964d802ce68aac833c463904..fa1902dc81b86e1c20f24451c5bf515567e9015f 100644 (file)
@@ -139,10 +139,8 @@ int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type)
        nf_reset(skb);
 
        if (decaps) {
-               if (!(skb->dev->flags&IFF_LOOPBACK)) {
-                       dst_release(skb->dst);
-                       skb->dst = NULL;
-               }
+               dst_release(skb->dst);
+               skb->dst = NULL;
                netif_rx(skb);
                return 0;
        } else {
index a2f2e6a5ec5d1662e6ba0b372af47059288cebaf..9963700e74c1e6185f31ea807b839a0d67a87081 100644 (file)
@@ -85,6 +85,8 @@ static int xfrm4_tunnel_output(struct xfrm_state *x, struct sk_buff *skb)
        top_iph->saddr = x->props.saddr.a4;
        top_iph->daddr = x->id.daddr.a4;
 
+       skb->protocol = htons(ETH_P_IP);
+
        memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options));
        return 0;
 }
index d7ed8aa56ec18657e79abbf0abe45bbdcd01f878..c858537cec4b0b756ba03907b1ffa7dbcc787793 100644 (file)
@@ -104,10 +104,8 @@ int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi)
        nf_reset(skb);
 
        if (decaps) {
-               if (!(skb->dev->flags&IFF_LOOPBACK)) {
-                       dst_release(skb->dst);
-                       skb->dst = NULL;
-               }
+               dst_release(skb->dst);
+               skb->dst = NULL;
                netif_rx(skb);
                return -1;
        } else {
index a6c0cdf46ad6a3458f9b905cf284529c1371db97..9fc95bc6509f718b675579ba037adfc5cc0a9065 100644 (file)
@@ -80,6 +80,7 @@ static int xfrm6_tunnel_output(struct xfrm_state *x, struct sk_buff *skb)
        top_iph->hop_limit = dst_metric(dst->child, RTAX_HOPLIMIT);
        ipv6_addr_copy(&top_iph->saddr, (struct in6_addr *)&x->props.saddr);
        ipv6_addr_copy(&top_iph->daddr, (struct in6_addr *)&x->id.daddr);
+       skb->protocol = htons(ETH_P_IPV6);
        return 0;
 }