aboutsummaryrefslogtreecommitdiffstats
path: root/net/key/af_key.c
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 /net/key/af_key.c
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 'net/key/af_key.c')
-rw-r--r--net/key/af_key.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/net/key/af_key.c b/net/key/af_key.c
index 5b802bbb856e..ff5c3d03005e 100644
--- a/net/key/af_key.c
+++ b/net/key/af_key.c
@@ -136,11 +136,14 @@ static struct proto key_proto = {
136 .obj_size = sizeof(struct pfkey_sock), 136 .obj_size = sizeof(struct pfkey_sock),
137}; 137};
138 138
139static int pfkey_create(struct socket *sock, int protocol) 139static int pfkey_create(struct net *net, struct socket *sock, int protocol)
140{ 140{
141 struct sock *sk; 141 struct sock *sk;
142 int err; 142 int err;
143 143
144 if (net != &init_net)
145 return -EAFNOSUPPORT;
146
144 if (!capable(CAP_NET_ADMIN)) 147 if (!capable(CAP_NET_ADMIN))
145 return -EPERM; 148 return -EPERM;
146 if (sock->type != SOCK_RAW) 149 if (sock->type != SOCK_RAW)
@@ -149,7 +152,7 @@ static int pfkey_create(struct socket *sock, int protocol)
149 return -EPROTONOSUPPORT; 152 return -EPROTONOSUPPORT;
150 153
151 err = -ENOMEM; 154 err = -ENOMEM;
152 sk = sk_alloc(PF_KEY, GFP_KERNEL, &key_proto, 1); 155 sk = sk_alloc(net, PF_KEY, GFP_KERNEL, &key_proto, 1);
153 if (sk == NULL) 156 if (sk == NULL)
154 goto out; 157 goto out;
155 158