patch-2.4.0-test9 linux/net/ipv6/af_inet6.c

Next file: linux/net/ipv6/ip6_fib.c
Previous file: linux/net/ipv4/utils.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.0-test8/linux/net/ipv6/af_inet6.c linux/net/ipv6/af_inet6.c
@@ -7,10 +7,11 @@
  *
  *	Adapted from linux/net/ipv4/af_inet.c
  *
- *	$Id: af_inet6.c,v 1.56 2000/04/25 04:13:34 davem Exp $
+ *	$Id: af_inet6.c,v 1.58 2000/09/18 05:59:48 davem Exp $
  *
  * 	Fixes:
  * 	Hideaki YOSHIFUJI	:	sin6_scope_id support
+ * 	Arnaldo Melo		: 	check proc_net_create return, cleanups
  *
  *	This program is free software; you can redistribute it and/or
  *      modify it under the terms of the GNU General Public License
@@ -189,7 +190,7 @@
 	if (sk->prot->init) {
 		int err = sk->prot->init(sk);
 		if (err != 0) {
-			sk->dead = 1;
+			MOD_DEC_USE_COUNT;
 			inet_sock_release(sk);
 			return(err);
 		}
@@ -295,10 +296,13 @@
 		return -EADDRINUSE;
 	}
 
+	if (addr_type != IPV6_ADDR_ANY)
+		sk->userlocks |= SOCK_BINDADDR_LOCK;
+	if (snum)
+		sk->userlocks |= SOCK_BINDPORT_LOCK;
 	sk->sport = ntohs(sk->num);
 	sk->dport = 0;
 	sk->daddr = 0;
-	sk->prot->hash(sk);
 	release_sock(sk);
 
 	return 0;
@@ -395,10 +399,8 @@
 	{
 	case FIOSETOWN:
 	case SIOCSPGRP:
-		err = get_user(pid, (int *) arg);
-		if(err)
-			return err;
-
+		if (get_user(pid, (int *) arg))
+			return -EFAULT;
 		/* see sock_no_fcntl */
 		if (current->pid != pid && current->pgrp != -pid && 
 		    !capable(CAP_NET_ADMIN))
@@ -407,10 +409,7 @@
 		return(0);
 	case FIOGETOWN:
 	case SIOCGPGRP:
-		err = put_user(sk->proc,(int *)arg);
-		if(err)
-			return err;
-		return(0);
+		return put_user(sk->proc,(int *)arg);
 	case SIOCGSTAMP:
 		if(sk->stamp.tv_sec==0)
 			return -ENOENT;
@@ -550,6 +549,20 @@
 	err = igmp6_init(&inet6_family_ops);
 	if (err)
 		goto igmp_fail;
+	/* Create /proc/foo6 entries. */
+#ifdef CONFIG_PROC_FS
+	err = -ENOMEM;
+	if (!proc_net_create("raw6", 0, raw6_get_info))
+		goto proc_raw6_fail;
+	if (!proc_net_create("tcp6", 0, tcp6_get_info))
+		goto proc_tcp6_fail;
+	if (!proc_net_create("udp6", 0, udp6_get_info))
+		goto proc_udp6_fail;
+	if (!proc_net_create("sockstat6", 0, afinet6_get_info))
+		goto proc_sockstat6_fail;
+	if (!proc_net_create("snmp6", 0, afinet6_get_snmp))
+		goto proc_snmp6_fail;
+#endif
 	ipv6_netdev_notif_init();
 	ipv6_packet_init();
 	ip6_route_init();
@@ -561,15 +574,6 @@
 	udpv6_init();
 	tcpv6_init();
 
-	/* Create /proc/foo6 entries. */
-#ifdef CONFIG_PROC_FS
-	proc_net_create("raw6", 0, raw6_get_info);
-	proc_net_create("tcp6", 0, tcp6_get_info);
-	proc_net_create("udp6", 0, udp6_get_info);
-	proc_net_create("sockstat6", 0, afinet6_get_info);
-	proc_net_create("snmp6", 0, afinet6_get_snmp);
-#endif
-
 	/* Now the userspace is allowed to create INET6 sockets. */
 	(void) sock_register(&inet6_family_ops);
 	
@@ -579,6 +583,18 @@
 	return;
 #endif
 
+#ifdef CONFIG_PROC_FS
+proc_snmp6_fail:
+	proc_net_remove("sockstat6");
+proc_sockstat6_fail:
+	proc_net_remove("udp6");
+proc_udp6_fail:
+	proc_net_remove("tcp6");
+proc_tcp6_fail:
+        proc_net_remove("raw6");
+proc_raw6_fail:
+	igmp6_cleanup();
+#endif
 igmp_fail:
 	ndisc_cleanup();
 ndisc_fail:

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)