Merge to Fedora kernel-2.6.7-1.494 and VServer 1.9.1.12. Fix some previous merge...
[linux-2.6.git] / net / ipv4 / af_inet.c
index e42418c..f4f7a57 100644 (file)
@@ -159,8 +159,11 @@ void inet_sock_destruct(struct sock *sk)
        if (inet->opt)
                kfree(inet->opt);
        
-       BUG_ON(sk->sk_nx_info);
-       BUG_ON(sk->sk_vx_info);
+       clr_vx_info(&sk->sk_vx_info);
+       sk->sk_xid = -1;
+       clr_nx_info(&sk->sk_nx_info);
+       sk->sk_nid = -1;
+
        dst_release(sk->sk_dst_cache);
 #ifdef INET_REFCNT_DEBUG
        atomic_dec(&inet_sock_nr);
@@ -297,8 +300,11 @@ static int inet_create(struct socket *sock, int protocol)
        if (!answer)
                goto out_sk_free;
        err = -EPERM;
+       if ((protocol == IPPROTO_ICMP) && vx_ccaps(VXC_RAW_ICMP))
+               goto override;
        if (answer->capability > 0 && !capable(answer->capability))
                goto out_sk_free;
+override:
        err = -EPROTONOSUPPORT;
        if (!protocol)
                goto out_sk_free;
@@ -402,7 +408,9 @@ int inet_release(struct socket *sock)
                        timeout = sk->sk_lingertime;
                sock->sk = NULL;
                clr_vx_info(&sk->sk_vx_info);
+       sk->sk_xid = -1;
                clr_nx_info(&sk->sk_nx_info);
+       sk->sk_nid = -1;
                sk->sk_prot->close(sk, timeout);
        }
        return 0;