aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2007-10-09 02:24:22 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-10-10 19:49:07 -0400
commit1b8d7ae42d02e483ad94035cca851e4f7fbecb40 (patch)
tree81f8cc0ee49ef99cc67dfed3dc7b7ecb510abf8b /include
parent457c4cbc5a3dde259d2a1f15d5f9785290397267 (diff)
[NET]: Make socket creation namespace safe.
This patch passes in the namespace a new socket should be created in and has the socket code do the appropriate reference counting. By virtue of this all socket create methods are touched. In addition the socket create methods are modified so that they will fail if you attempt to create a socket in a non-default network namespace. Failing if we attempt to create a socket outside of the default network namespace ensures that as we incrementally make the network stack network namespace aware we will not export functionality that someone has not audited and made certain is network namespace safe. Allowing us to partially enable network namespaces before all of the exotic protocols are supported. Any protocol layers I have missed will fail to compile because I now pass an extra parameter into the socket creation code. [ Integrated AF_IUCV build fixes from Andrew Morton... -DaveM ] Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r--include/linux/if_pppox.h2
-rw-r--r--include/linux/net.h3
-rw-r--r--include/net/iucv/af_iucv.h1
-rw-r--r--include/net/llc_conn.h2
-rw-r--r--include/net/sock.h4
5 files changed, 7 insertions, 5 deletions
diff --git a/include/linux/if_pppox.h b/include/linux/if_pppox.h
index 25652545ba6..43cfc9f0c07 100644
--- a/include/linux/if_pppox.h
+++ b/include/linux/if_pppox.h
@@ -172,7 +172,7 @@ static inline struct sock *sk_pppox(struct pppox_sock *po)
172struct module; 172struct module;
173 173
174struct pppox_proto { 174struct pppox_proto {
175 int (*create)(struct socket *sock); 175 int (*create)(struct net *net, struct socket *sock);
176 int (*ioctl)(struct socket *sock, unsigned int cmd, 176 int (*ioctl)(struct socket *sock, unsigned int cmd,
177 unsigned long arg); 177 unsigned long arg);
178 struct module *owner; 178 struct module *owner;
diff --git a/include/linux/net.h b/include/linux/net.h
index efc45177b50..c136abce7ef 100644
--- a/include/linux/net.h
+++ b/include/linux/net.h
@@ -23,6 +23,7 @@
23 23
24struct poll_table_struct; 24struct poll_table_struct;
25struct inode; 25struct inode;
26struct net;
26 27
27#define NPROTO 34 /* should be enough for now.. */ 28#define NPROTO 34 /* should be enough for now.. */
28 29
@@ -169,7 +170,7 @@ struct proto_ops {
169 170
170struct net_proto_family { 171struct net_proto_family {
171 int family; 172 int family;
172 int (*create)(struct socket *sock, int protocol); 173 int (*create)(struct net *net, struct socket *sock, int protocol);
173 struct module *owner; 174 struct module *owner;
174}; 175};
175 176
diff --git a/include/net/iucv/af_iucv.h b/include/net/iucv/af_iucv.h
index b6c468cd7f5..c661c6fd6fd 100644
--- a/include/net/iucv/af_iucv.h
+++ b/include/net/iucv/af_iucv.h
@@ -78,7 +78,6 @@ static void iucv_sock_destruct(struct sock *sk);
78static void iucv_sock_cleanup_listen(struct sock *parent); 78static void iucv_sock_cleanup_listen(struct sock *parent);
79static void iucv_sock_kill(struct sock *sk); 79static void iucv_sock_kill(struct sock *sk);
80static void iucv_sock_close(struct sock *sk); 80static void iucv_sock_close(struct sock *sk);
81static int iucv_sock_create(struct socket *sock, int proto);
82static int iucv_sock_bind(struct socket *sock, struct sockaddr *addr, 81static int iucv_sock_bind(struct socket *sock, struct sockaddr *addr,
83 int addr_len); 82 int addr_len);
84static int iucv_sock_connect(struct socket *sock, struct sockaddr *addr, 83static int iucv_sock_connect(struct socket *sock, struct sockaddr *addr,
diff --git a/include/net/llc_conn.h b/include/net/llc_conn.h
index 00730d21b52..e2374e34989 100644
--- a/include/net/llc_conn.h
+++ b/include/net/llc_conn.h
@@ -93,7 +93,7 @@ static __inline__ char llc_backlog_type(struct sk_buff *skb)
93 return skb->cb[sizeof(skb->cb) - 1]; 93 return skb->cb[sizeof(skb->cb) - 1];
94} 94}
95 95
96extern struct sock *llc_sk_alloc(int family, gfp_t priority, 96extern struct sock *llc_sk_alloc(struct net *net, int family, gfp_t priority,
97 struct proto *prot); 97 struct proto *prot);
98extern void llc_sk_free(struct sock *sk); 98extern void llc_sk_free(struct sock *sk);
99 99
diff --git a/include/net/sock.h b/include/net/sock.h
index 9ef8b5fb793..74e1f7d90d7 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -56,6 +56,7 @@
56#include <asm/atomic.h> 56#include <asm/atomic.h>
57#include <net/dst.h> 57#include <net/dst.h>
58#include <net/checksum.h> 58#include <net/checksum.h>
59#include <net/net_namespace.h>
59 60
60/* 61/*
61 * This structure really needs to be cleaned up. 62 * This structure really needs to be cleaned up.
@@ -776,7 +777,7 @@ extern void FASTCALL(release_sock(struct sock *sk));
776 SINGLE_DEPTH_NESTING) 777 SINGLE_DEPTH_NESTING)
777#define bh_unlock_sock(__sk) spin_unlock(&((__sk)->sk_lock.slock)) 778#define bh_unlock_sock(__sk) spin_unlock(&((__sk)->sk_lock.slock))
778 779
779extern struct sock *sk_alloc(int family, 780extern struct sock *sk_alloc(struct net *net, int family,
780 gfp_t priority, 781 gfp_t priority,
781 struct proto *prot, int zero_it); 782 struct proto *prot, int zero_it);
782extern void sk_free(struct sock *sk); 783extern void sk_free(struct sock *sk);
@@ -1005,6 +1006,7 @@ static inline void sock_copy(struct sock *nsk, const struct sock *osk)
1005#endif 1006#endif
1006 1007
1007 memcpy(nsk, osk, osk->sk_prot->obj_size); 1008 memcpy(nsk, osk, osk->sk_prot->obj_size);
1009 get_net(nsk->sk_net);
1008#ifdef CONFIG_SECURITY_NETWORK 1010#ifdef CONFIG_SECURITY_NETWORK
1009 nsk->sk_security = sptr; 1011 nsk->sk_security = sptr;
1010 security_sk_clone(osk, nsk); 1012 security_sk_clone(osk, nsk);