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);
* Set socket options on an inet socket.
*/
int inet_setsockopt(struct socket *sock, int level, int optname,
- char *optval, int optlen)
+ char __user *optval, int optlen)
{
struct sock *sk = sock->sk;
*/
int inet_getsockopt(struct socket *sock, int level, int optname,
- char *optval, int *optlen)
+ char __user *optval, int __user *optlen)
{
struct sock *sk = sock->sk;
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;
if (sk->sk_prot->init) {
err = sk->sk_prot->init(sk);
- if (err) {
-/* sk->sk_vx_info = NULL;
- put_vx_info(current->vx_info);
- sk->sk_nx_info = NULL;
- put_nx_info(current->nx_info);
-*/ inet_sock_release(sk);
- }
+ if (err)
+ inet_sock_release(sk);
}
out:
return err;
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;
switch (cmd) {
case SIOCGSTAMP:
- err = sock_get_timestamp(sk, (struct timeval *)arg);
+ err = sock_get_timestamp(sk, (struct timeval __user *)arg);
break;
case SIOCADDRT:
case SIOCDELRT:
case SIOCDARP:
case SIOCGARP:
case SIOCSARP:
- err = arp_ioctl(cmd, (void *)arg);
+ err = arp_ioctl(cmd, (void __user *)arg);
break;
case SIOCGIFADDR:
case SIOCSIFADDR:
case SIOCSIFPFLAGS:
case SIOCGIFPFLAGS:
case SIOCSIFFLAGS:
- err = devinet_ioctl(cmd, (void *)arg);
+ err = devinet_ioctl(cmd, (void __user *)arg);
break;
default:
if (!sk->sk_prot->ioctl ||
(err = sk->sk_prot->ioctl(sk, cmd, arg)) ==
-ENOIOCTLCMD)
- err = dev_ioctl(cmd, (void *)arg);
+ err = dev_ioctl(cmd, (void __user *)arg);
break;
}
return err;
spin_lock_bh(&inetsw_lock);
- if (p->type > SOCK_MAX)
+ if (p->type >= SOCK_MAX)
goto out_illegal;
/* If we are trying to override a permanent protocol, bail. */
{
net_statistics[0] = alloc_percpu(struct linux_mib);
net_statistics[1] = alloc_percpu(struct linux_mib);
- ip_statistics[0] = alloc_percpu(struct ip_mib);
- ip_statistics[1] = alloc_percpu(struct ip_mib);
+ ip_statistics[0] = alloc_percpu(struct ipstats_mib);
+ ip_statistics[1] = alloc_percpu(struct ipstats_mib);
icmp_statistics[0] = alloc_percpu(struct icmp_mib);
icmp_statistics[1] = alloc_percpu(struct icmp_mib);
tcp_statistics[0] = alloc_percpu(struct tcp_mib);