aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/connector/connector.c2
-rw-r--r--drivers/scsi/scsi_netlink.c2
-rw-r--r--drivers/scsi/scsi_transport_iscsi.c2
-rw-r--r--fs/ecryptfs/netlink.c2
-rw-r--r--include/linux/netlink.h6
-rw-r--r--kernel/audit.c4
-rw-r--r--lib/kobject_uevent.c5
-rw-r--r--net/bridge/netfilter/ebt_ulog.c5
-rw-r--r--net/core/rtnetlink.c4
-rw-r--r--net/decnet/netfilter/dn_rtmsg.c3
-rw-r--r--net/ipv4/fib_frontend.c4
-rw-r--r--net/ipv4/inet_diag.c4
-rw-r--r--net/ipv4/netfilter/ip_queue.c6
-rw-r--r--net/ipv4/netfilter/ipt_ULOG.c3
-rw-r--r--net/ipv6/netfilter/ip6_queue.c6
-rw-r--r--net/netfilter/nfnetlink.c2
-rw-r--r--net/netfilter/nfnetlink_log.c3
-rw-r--r--net/netfilter/nfnetlink_queue.c3
-rw-r--r--net/netlink/af_netlink.c104
-rw-r--r--net/netlink/genetlink.c4
-rw-r--r--net/xfrm/xfrm_user.c2
-rw-r--r--security/selinux/netlink.c5
22 files changed, 121 insertions, 60 deletions
diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c
index a7b9e9bb3e8d..569070997cc1 100644
--- a/drivers/connector/connector.c
+++ b/drivers/connector/connector.c
@@ -446,7 +446,7 @@ static int __devinit cn_init(void)
446 dev->id.idx = cn_idx; 446 dev->id.idx = cn_idx;
447 dev->id.val = cn_val; 447 dev->id.val = cn_val;
448 448
449 dev->nls = netlink_kernel_create(NETLINK_CONNECTOR, 449 dev->nls = netlink_kernel_create(&init_net, NETLINK_CONNECTOR,
450 CN_NETLINK_USERS + 0xf, 450 CN_NETLINK_USERS + 0xf,
451 dev->input, NULL, THIS_MODULE); 451 dev->input, NULL, THIS_MODULE);
452 if (!dev->nls) 452 if (!dev->nls)
diff --git a/drivers/scsi/scsi_netlink.c b/drivers/scsi/scsi_netlink.c
index 4bf9aa547c78..163acf6ad2d3 100644
--- a/drivers/scsi/scsi_netlink.c
+++ b/drivers/scsi/scsi_netlink.c
@@ -167,7 +167,7 @@ scsi_netlink_init(void)
167 return; 167 return;
168 } 168 }
169 169
170 scsi_nl_sock = netlink_kernel_create(NETLINK_SCSITRANSPORT, 170 scsi_nl_sock = netlink_kernel_create(&init_net, NETLINK_SCSITRANSPORT,
171 SCSI_NL_GRP_CNT, scsi_nl_rcv, NULL, 171 SCSI_NL_GRP_CNT, scsi_nl_rcv, NULL,
172 THIS_MODULE); 172 THIS_MODULE);
173 if (!scsi_nl_sock) { 173 if (!scsi_nl_sock) {
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
index 34c1860a259d..4916f01230dc 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -1523,7 +1523,7 @@ static __init int iscsi_transport_init(void)
1523 if (err) 1523 if (err)
1524 goto unregister_conn_class; 1524 goto unregister_conn_class;
1525 1525
1526 nls = netlink_kernel_create(NETLINK_ISCSI, 1, iscsi_if_rx, NULL, 1526 nls = netlink_kernel_create(&init_net, NETLINK_ISCSI, 1, iscsi_if_rx, NULL,
1527 THIS_MODULE); 1527 THIS_MODULE);
1528 if (!nls) { 1528 if (!nls) {
1529 err = -ENOBUFS; 1529 err = -ENOBUFS;
diff --git a/fs/ecryptfs/netlink.c b/fs/ecryptfs/netlink.c
index fe9186312d7c..056519cd92bc 100644
--- a/fs/ecryptfs/netlink.c
+++ b/fs/ecryptfs/netlink.c
@@ -227,7 +227,7 @@ int ecryptfs_init_netlink(void)
227{ 227{
228 int rc; 228 int rc;
229 229
230 ecryptfs_nl_sock = netlink_kernel_create(NETLINK_ECRYPTFS, 0, 230 ecryptfs_nl_sock = netlink_kernel_create(&init_net, NETLINK_ECRYPTFS, 0,
231 ecryptfs_receive_nl_message, 231 ecryptfs_receive_nl_message,
232 NULL, THIS_MODULE); 232 NULL, THIS_MODULE);
233 if (!ecryptfs_nl_sock) { 233 if (!ecryptfs_nl_sock) {
diff --git a/include/linux/netlink.h b/include/linux/netlink.h
index 83d8239f0cce..d2843ae4a83a 100644
--- a/include/linux/netlink.h
+++ b/include/linux/netlink.h
@@ -27,6 +27,8 @@
27 27
28#define MAX_LINKS 32 28#define MAX_LINKS 32
29 29
30struct net;
31
30struct sockaddr_nl 32struct sockaddr_nl
31{ 33{
32 sa_family_t nl_family; /* AF_NETLINK */ 34 sa_family_t nl_family; /* AF_NETLINK */
@@ -157,7 +159,8 @@ struct netlink_skb_parms
157#define NETLINK_CREDS(skb) (&NETLINK_CB((skb)).creds) 159#define NETLINK_CREDS(skb) (&NETLINK_CB((skb)).creds)
158 160
159 161
160extern struct sock *netlink_kernel_create(int unit, unsigned int groups, 162extern struct sock *netlink_kernel_create(struct net *net,
163 int unit,unsigned int groups,
161 void (*input)(struct sock *sk, int len), 164 void (*input)(struct sock *sk, int len),
162 struct mutex *cb_mutex, 165 struct mutex *cb_mutex,
163 struct module *module); 166 struct module *module);
@@ -206,6 +209,7 @@ struct netlink_callback
206 209
207struct netlink_notify 210struct netlink_notify
208{ 211{
212 struct net *net;
209 int pid; 213 int pid;
210 int protocol; 214 int protocol;
211}; 215};
diff --git a/kernel/audit.c b/kernel/audit.c
index eb0f9165b401..f3c390f6c0b4 100644
--- a/kernel/audit.c
+++ b/kernel/audit.c
@@ -876,8 +876,8 @@ static int __init audit_init(void)
876 876
877 printk(KERN_INFO "audit: initializing netlink socket (%s)\n", 877 printk(KERN_INFO "audit: initializing netlink socket (%s)\n",
878 audit_default ? "enabled" : "disabled"); 878 audit_default ? "enabled" : "disabled");
879 audit_sock = netlink_kernel_create(NETLINK_AUDIT, 0, audit_receive, 879 audit_sock = netlink_kernel_create(&init_net, NETLINK_AUDIT, 0,
880 NULL, THIS_MODULE); 880 audit_receive, NULL, THIS_MODULE);
881 if (!audit_sock) 881 if (!audit_sock)
882 audit_panic("cannot initialize netlink socket"); 882 audit_panic("cannot initialize netlink socket");
883 else 883 else
diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c
index df02814699d7..e06a8dcec0f0 100644
--- a/lib/kobject_uevent.c
+++ b/lib/kobject_uevent.c
@@ -280,9 +280,8 @@ EXPORT_SYMBOL_GPL(add_uevent_var);
280#if defined(CONFIG_NET) 280#if defined(CONFIG_NET)
281static int __init kobject_uevent_init(void) 281static int __init kobject_uevent_init(void)
282{ 282{
283 uevent_sock = netlink_kernel_create(NETLINK_KOBJECT_UEVENT, 1, NULL, 283 uevent_sock = netlink_kernel_create(&init_net, NETLINK_KOBJECT_UEVENT,
284 NULL, THIS_MODULE); 284 1, NULL, NULL, THIS_MODULE);
285
286 if (!uevent_sock) { 285 if (!uevent_sock) {
287 printk(KERN_ERR 286 printk(KERN_ERR
288 "kobject_uevent: unable to create netlink socket!\n"); 287 "kobject_uevent: unable to create netlink socket!\n");
diff --git a/net/bridge/netfilter/ebt_ulog.c b/net/bridge/netfilter/ebt_ulog.c
index 204c968fa86d..e7cfd30bac75 100644
--- a/net/bridge/netfilter/ebt_ulog.c
+++ b/net/bridge/netfilter/ebt_ulog.c
@@ -300,8 +300,9 @@ static int __init ebt_ulog_init(void)
300 spin_lock_init(&ulog_buffers[i].lock); 300 spin_lock_init(&ulog_buffers[i].lock);
301 } 301 }
302 302
303 ebtulognl = netlink_kernel_create(NETLINK_NFLOG, EBT_ULOG_MAXNLGROUPS, 303 ebtulognl = netlink_kernel_create(&init_net, NETLINK_NFLOG,
304 NULL, NULL, THIS_MODULE); 304 EBT_ULOG_MAXNLGROUPS, NULL, NULL,
305 THIS_MODULE);
305 if (!ebtulognl) 306 if (!ebtulognl)
306 ret = -ENOMEM; 307 ret = -ENOMEM;
307 else if ((ret = ebt_register_watcher(&ulog))) 308 else if ((ret = ebt_register_watcher(&ulog)))
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 41859508bedd..416768d1e0cd 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -1327,8 +1327,8 @@ void __init rtnetlink_init(void)
1327 if (!rta_buf) 1327 if (!rta_buf)
1328 panic("rtnetlink_init: cannot allocate rta_buf\n"); 1328 panic("rtnetlink_init: cannot allocate rta_buf\n");
1329 1329
1330 rtnl = netlink_kernel_create(NETLINK_ROUTE, RTNLGRP_MAX, rtnetlink_rcv, 1330 rtnl = netlink_kernel_create(&init_net, NETLINK_ROUTE, RTNLGRP_MAX,
1331 &rtnl_mutex, THIS_MODULE); 1331 rtnetlink_rcv, &rtnl_mutex, THIS_MODULE);
1332 if (rtnl == NULL) 1332 if (rtnl == NULL)
1333 panic("rtnetlink_init: cannot initialize rtnetlink\n"); 1333 panic("rtnetlink_init: cannot initialize rtnetlink\n");
1334 netlink_set_nonroot(NETLINK_ROUTE, NL_NONROOT_RECV); 1334 netlink_set_nonroot(NETLINK_ROUTE, NL_NONROOT_RECV);
diff --git a/net/decnet/netfilter/dn_rtmsg.c b/net/decnet/netfilter/dn_rtmsg.c
index 696234688cf6..ebb38feb4df3 100644
--- a/net/decnet/netfilter/dn_rtmsg.c
+++ b/net/decnet/netfilter/dn_rtmsg.c
@@ -137,7 +137,8 @@ static int __init dn_rtmsg_init(void)
137{ 137{
138 int rv = 0; 138 int rv = 0;
139 139
140 dnrmg = netlink_kernel_create(NETLINK_DNRTMSG, DNRNG_NLGRP_MAX, 140 dnrmg = netlink_kernel_create(&init_net,
141 NETLINK_DNRTMSG, DNRNG_NLGRP_MAX,
141 dnrmg_receive_user_sk, NULL, THIS_MODULE); 142 dnrmg_receive_user_sk, NULL, THIS_MODULE);
142 if (dnrmg == NULL) { 143 if (dnrmg == NULL) {
143 printk(KERN_ERR "dn_rtmsg: Cannot create netlink socket"); 144 printk(KERN_ERR "dn_rtmsg: Cannot create netlink socket");
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
index cefb55ec3d62..140bf7a8d877 100644
--- a/net/ipv4/fib_frontend.c
+++ b/net/ipv4/fib_frontend.c
@@ -816,8 +816,8 @@ static void nl_fib_input(struct sock *sk, int len)
816 816
817static void nl_fib_lookup_init(void) 817static void nl_fib_lookup_init(void)
818{ 818{
819 netlink_kernel_create(NETLINK_FIB_LOOKUP, 0, nl_fib_input, NULL, 819 netlink_kernel_create(&init_net, NETLINK_FIB_LOOKUP, 0, nl_fib_input,
820 THIS_MODULE); 820 NULL, THIS_MODULE);
821} 821}
822 822
823static void fib_disable_ip(struct net_device *dev, int force) 823static void fib_disable_ip(struct net_device *dev, int force)
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c
index 686ddd62f71a..031cc4856b49 100644
--- a/net/ipv4/inet_diag.c
+++ b/net/ipv4/inet_diag.c
@@ -897,8 +897,8 @@ static int __init inet_diag_init(void)
897 if (!inet_diag_table) 897 if (!inet_diag_table)
898 goto out; 898 goto out;
899 899
900 idiagnl = netlink_kernel_create(NETLINK_INET_DIAG, 0, inet_diag_rcv, 900 idiagnl = netlink_kernel_create(&init_net, NETLINK_INET_DIAG, 0,
901 NULL, THIS_MODULE); 901 inet_diag_rcv, NULL, THIS_MODULE);
902 if (idiagnl == NULL) 902 if (idiagnl == NULL)
903 goto out_free_table; 903 goto out_free_table;
904 err = 0; 904 err = 0;
diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c
index d91856097f25..82fda92e6b97 100644
--- a/net/ipv4/netfilter/ip_queue.c
+++ b/net/ipv4/netfilter/ip_queue.c
@@ -579,7 +579,7 @@ ipq_rcv_nl_event(struct notifier_block *this,
579 if (event == NETLINK_URELEASE && 579 if (event == NETLINK_URELEASE &&
580 n->protocol == NETLINK_FIREWALL && n->pid) { 580 n->protocol == NETLINK_FIREWALL && n->pid) {
581 write_lock_bh(&queue_lock); 581 write_lock_bh(&queue_lock);
582 if (n->pid == peer_pid) 582 if ((n->net == &init_net) && (n->pid == peer_pid))
583 __ipq_reset(); 583 __ipq_reset();
584 write_unlock_bh(&queue_lock); 584 write_unlock_bh(&queue_lock);
585 } 585 }
@@ -671,8 +671,8 @@ static int __init ip_queue_init(void)
671 struct proc_dir_entry *proc; 671 struct proc_dir_entry *proc;
672 672
673 netlink_register_notifier(&ipq_nl_notifier); 673 netlink_register_notifier(&ipq_nl_notifier);
674 ipqnl = netlink_kernel_create(NETLINK_FIREWALL, 0, ipq_rcv_sk, 674 ipqnl = netlink_kernel_create(&init_net, NETLINK_FIREWALL, 0,
675 NULL, THIS_MODULE); 675 ipq_rcv_sk, NULL, THIS_MODULE);
676 if (ipqnl == NULL) { 676 if (ipqnl == NULL) {
677 printk(KERN_ERR "ip_queue: failed to create netlink socket\n"); 677 printk(KERN_ERR "ip_queue: failed to create netlink socket\n");
678 goto cleanup_netlink_notifier; 678 goto cleanup_netlink_notifier;
diff --git a/net/ipv4/netfilter/ipt_ULOG.c b/net/ipv4/netfilter/ipt_ULOG.c
index 6ca43e4ca7e3..c636d6d63574 100644
--- a/net/ipv4/netfilter/ipt_ULOG.c
+++ b/net/ipv4/netfilter/ipt_ULOG.c
@@ -409,7 +409,8 @@ static int __init ipt_ulog_init(void)
409 for (i = 0; i < ULOG_MAXNLGROUPS; i++) 409 for (i = 0; i < ULOG_MAXNLGROUPS; i++)
410 setup_timer(&ulog_buffers[i].timer, ulog_timer, i); 410 setup_timer(&ulog_buffers[i].timer, ulog_timer, i);
411 411
412 nflognl = netlink_kernel_create(NETLINK_NFLOG, ULOG_MAXNLGROUPS, NULL, 412 nflognl = netlink_kernel_create(&init_net,
413 NETLINK_NFLOG, ULOG_MAXNLGROUPS, NULL,
413 NULL, THIS_MODULE); 414 NULL, THIS_MODULE);
414 if (!nflognl) 415 if (!nflognl)
415 return -ENOMEM; 416 return -ENOMEM;
diff --git a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c
index 64536a3ef2f6..2f5a52453834 100644
--- a/net/ipv6/netfilter/ip6_queue.c
+++ b/net/ipv6/netfilter/ip6_queue.c
@@ -569,7 +569,7 @@ ipq_rcv_nl_event(struct notifier_block *this,
569 if (event == NETLINK_URELEASE && 569 if (event == NETLINK_URELEASE &&
570 n->protocol == NETLINK_IP6_FW && n->pid) { 570 n->protocol == NETLINK_IP6_FW && n->pid) {
571 write_lock_bh(&queue_lock); 571 write_lock_bh(&queue_lock);
572 if (n->pid == peer_pid) 572 if ((n->net == &init_net) && (n->pid == peer_pid))
573 __ipq_reset(); 573 __ipq_reset();
574 write_unlock_bh(&queue_lock); 574 write_unlock_bh(&queue_lock);
575 } 575 }
@@ -661,8 +661,8 @@ static int __init ip6_queue_init(void)
661 struct proc_dir_entry *proc; 661 struct proc_dir_entry *proc;
662 662
663 netlink_register_notifier(&ipq_nl_notifier); 663 netlink_register_notifier(&ipq_nl_notifier);
664 ipqnl = netlink_kernel_create(NETLINK_IP6_FW, 0, ipq_rcv_sk, NULL, 664 ipqnl = netlink_kernel_create(&init_net, NETLINK_IP6_FW, 0, ipq_rcv_sk,
665 THIS_MODULE); 665 NULL, THIS_MODULE);
666 if (ipqnl == NULL) { 666 if (ipqnl == NULL) {
667 printk(KERN_ERR "ip6_queue: failed to create netlink socket\n"); 667 printk(KERN_ERR "ip6_queue: failed to create netlink socket\n");
668 goto cleanup_netlink_notifier; 668 goto cleanup_netlink_notifier;
diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c
index 8797e6953ef2..fa974e8e0ce6 100644
--- a/net/netfilter/nfnetlink.c
+++ b/net/netfilter/nfnetlink.c
@@ -264,7 +264,7 @@ static int __init nfnetlink_init(void)
264{ 264{
265 printk("Netfilter messages via NETLINK v%s.\n", nfversion); 265 printk("Netfilter messages via NETLINK v%s.\n", nfversion);
266 266
267 nfnl = netlink_kernel_create(NETLINK_NETFILTER, NFNLGRP_MAX, 267 nfnl = netlink_kernel_create(&init_net, NETLINK_NETFILTER, NFNLGRP_MAX,
268 nfnetlink_rcv, NULL, THIS_MODULE); 268 nfnetlink_rcv, NULL, THIS_MODULE);
269 if (!nfnl) { 269 if (!nfnl) {
270 printk(KERN_ERR "cannot initialize nfnetlink!\n"); 270 printk(KERN_ERR "cannot initialize nfnetlink!\n");
diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c
index 2351533a8507..8e4001b8f764 100644
--- a/net/netfilter/nfnetlink_log.c
+++ b/net/netfilter/nfnetlink_log.c
@@ -706,7 +706,8 @@ nfulnl_rcv_nl_event(struct notifier_block *this,
706 706
707 hlist_for_each_entry_safe(inst, tmp, t2, head, hlist) { 707 hlist_for_each_entry_safe(inst, tmp, t2, head, hlist) {
708 UDEBUG("node = %p\n", inst); 708 UDEBUG("node = %p\n", inst);
709 if (n->pid == inst->peer_pid) 709 if ((n->net == &init_net) &&
710 (n->pid == inst->peer_pid))
710 __instance_destroy(inst); 711 __instance_destroy(inst);
711 } 712 }
712 } 713 }
diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c
index 5a8e8ff76641..c97369f48db7 100644
--- a/net/netfilter/nfnetlink_queue.c
+++ b/net/netfilter/nfnetlink_queue.c
@@ -765,7 +765,8 @@ nfqnl_rcv_nl_event(struct notifier_block *this,
765 struct hlist_head *head = &instance_table[i]; 765 struct hlist_head *head = &instance_table[i];
766 766
767 hlist_for_each_entry_safe(inst, tmp, t2, head, hlist) { 767 hlist_for_each_entry_safe(inst, tmp, t2, head, hlist) {
768 if (n->pid == inst->peer_pid) 768 if ((n->net == &init_net) &&
769 (n->pid == inst->peer_pid))
769 __instance_destroy(inst); 770 __instance_destroy(inst);
770 } 771 }
771 } 772 }
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 406a493300d8..3029f865cd61 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -211,7 +211,7 @@ netlink_unlock_table(void)
211 wake_up(&nl_table_wait); 211 wake_up(&nl_table_wait);
212} 212}
213 213
214static __inline__ struct sock *netlink_lookup(int protocol, u32 pid) 214static __inline__ struct sock *netlink_lookup(struct net *net, int protocol, u32 pid)
215{ 215{
216 struct nl_pid_hash *hash = &nl_table[protocol].hash; 216 struct nl_pid_hash *hash = &nl_table[protocol].hash;
217 struct hlist_head *head; 217 struct hlist_head *head;
@@ -221,7 +221,7 @@ static __inline__ struct sock *netlink_lookup(int protocol, u32 pid)
221 read_lock(&nl_table_lock); 221 read_lock(&nl_table_lock);
222 head = nl_pid_hashfn(hash, pid); 222 head = nl_pid_hashfn(hash, pid);
223 sk_for_each(sk, node, head) { 223 sk_for_each(sk, node, head) {
224 if (nlk_sk(sk)->pid == pid) { 224 if ((sk->sk_net == net) && (nlk_sk(sk)->pid == pid)) {
225 sock_hold(sk); 225 sock_hold(sk);
226 goto found; 226 goto found;
227 } 227 }
@@ -328,7 +328,7 @@ netlink_update_listeners(struct sock *sk)
328 * makes sure updates are visible before bind or setsockopt return. */ 328 * makes sure updates are visible before bind or setsockopt return. */
329} 329}
330 330
331static int netlink_insert(struct sock *sk, u32 pid) 331static int netlink_insert(struct sock *sk, struct net *net, u32 pid)
332{ 332{
333 struct nl_pid_hash *hash = &nl_table[sk->sk_protocol].hash; 333 struct nl_pid_hash *hash = &nl_table[sk->sk_protocol].hash;
334 struct hlist_head *head; 334 struct hlist_head *head;
@@ -341,7 +341,7 @@ static int netlink_insert(struct sock *sk, u32 pid)
341 head = nl_pid_hashfn(hash, pid); 341 head = nl_pid_hashfn(hash, pid);
342 len = 0; 342 len = 0;
343 sk_for_each(osk, node, head) { 343 sk_for_each(osk, node, head) {
344 if (nlk_sk(osk)->pid == pid) 344 if ((osk->sk_net == net) && (nlk_sk(osk)->pid == pid))
345 break; 345 break;
346 len++; 346 len++;
347 } 347 }
@@ -419,9 +419,6 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol)
419 struct netlink_sock *nlk; 419 struct netlink_sock *nlk;
420 int err = 0; 420 int err = 0;
421 421
422 if (net != &init_net)
423 return -EAFNOSUPPORT;
424
425 sock->state = SS_UNCONNECTED; 422 sock->state = SS_UNCONNECTED;
426 423
427 if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM) 424 if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM)
@@ -481,6 +478,7 @@ static int netlink_release(struct socket *sock)
481 478
482 if (nlk->pid && !nlk->subscriptions) { 479 if (nlk->pid && !nlk->subscriptions) {
483 struct netlink_notify n = { 480 struct netlink_notify n = {
481 .net = sk->sk_net,
484 .protocol = sk->sk_protocol, 482 .protocol = sk->sk_protocol,
485 .pid = nlk->pid, 483 .pid = nlk->pid,
486 }; 484 };
@@ -509,6 +507,7 @@ static int netlink_release(struct socket *sock)
509static int netlink_autobind(struct socket *sock) 507static int netlink_autobind(struct socket *sock)
510{ 508{
511 struct sock *sk = sock->sk; 509 struct sock *sk = sock->sk;
510 struct net *net = sk->sk_net;
512 struct nl_pid_hash *hash = &nl_table[sk->sk_protocol].hash; 511 struct nl_pid_hash *hash = &nl_table[sk->sk_protocol].hash;
513 struct hlist_head *head; 512 struct hlist_head *head;
514 struct sock *osk; 513 struct sock *osk;
@@ -522,6 +521,8 @@ retry:
522 netlink_table_grab(); 521 netlink_table_grab();
523 head = nl_pid_hashfn(hash, pid); 522 head = nl_pid_hashfn(hash, pid);
524 sk_for_each(osk, node, head) { 523 sk_for_each(osk, node, head) {
524 if ((osk->sk_net != net))
525 continue;
525 if (nlk_sk(osk)->pid == pid) { 526 if (nlk_sk(osk)->pid == pid) {
526 /* Bind collision, search negative pid values. */ 527 /* Bind collision, search negative pid values. */
527 pid = rover--; 528 pid = rover--;
@@ -533,7 +534,7 @@ retry:
533 } 534 }
534 netlink_table_ungrab(); 535 netlink_table_ungrab();
535 536
536 err = netlink_insert(sk, pid); 537 err = netlink_insert(sk, net, pid);
537 if (err == -EADDRINUSE) 538 if (err == -EADDRINUSE)
538 goto retry; 539 goto retry;
539 540
@@ -598,6 +599,7 @@ static int netlink_realloc_groups(struct sock *sk)
598static int netlink_bind(struct socket *sock, struct sockaddr *addr, int addr_len) 599static int netlink_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
599{ 600{
600 struct sock *sk = sock->sk; 601 struct sock *sk = sock->sk;
602 struct net *net = sk->sk_net;
601 struct netlink_sock *nlk = nlk_sk(sk); 603 struct netlink_sock *nlk = nlk_sk(sk);
602 struct sockaddr_nl *nladdr = (struct sockaddr_nl *)addr; 604 struct sockaddr_nl *nladdr = (struct sockaddr_nl *)addr;
603 int err; 605 int err;
@@ -619,7 +621,7 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr, int addr_len
619 return -EINVAL; 621 return -EINVAL;
620 } else { 622 } else {
621 err = nladdr->nl_pid ? 623 err = nladdr->nl_pid ?
622 netlink_insert(sk, nladdr->nl_pid) : 624 netlink_insert(sk, net, nladdr->nl_pid) :
623 netlink_autobind(sock); 625 netlink_autobind(sock);
624 if (err) 626 if (err)
625 return err; 627 return err;
@@ -703,10 +705,12 @@ static void netlink_overrun(struct sock *sk)
703static struct sock *netlink_getsockbypid(struct sock *ssk, u32 pid) 705static struct sock *netlink_getsockbypid(struct sock *ssk, u32 pid)
704{ 706{
705 int protocol = ssk->sk_protocol; 707 int protocol = ssk->sk_protocol;
708 struct net *net;
706 struct sock *sock; 709 struct sock *sock;
707 struct netlink_sock *nlk; 710 struct netlink_sock *nlk;
708 711
709 sock = netlink_lookup(protocol, pid); 712 net = ssk->sk_net;
713 sock = netlink_lookup(net, protocol, pid);
710 if (!sock) 714 if (!sock)
711 return ERR_PTR(-ECONNREFUSED); 715 return ERR_PTR(-ECONNREFUSED);
712 716
@@ -887,6 +891,7 @@ static __inline__ int netlink_broadcast_deliver(struct sock *sk, struct sk_buff
887 891
888struct netlink_broadcast_data { 892struct netlink_broadcast_data {
889 struct sock *exclude_sk; 893 struct sock *exclude_sk;
894 struct net *net;
890 u32 pid; 895 u32 pid;
891 u32 group; 896 u32 group;
892 int failure; 897 int failure;
@@ -909,6 +914,9 @@ static inline int do_one_broadcast(struct sock *sk,
909 !test_bit(p->group - 1, nlk->groups)) 914 !test_bit(p->group - 1, nlk->groups))
910 goto out; 915 goto out;
911 916
917 if ((sk->sk_net != p->net))
918 goto out;
919
912 if (p->failure) { 920 if (p->failure) {
913 netlink_overrun(sk); 921 netlink_overrun(sk);
914 goto out; 922 goto out;
@@ -947,6 +955,7 @@ out:
947int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid, 955int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid,
948 u32 group, gfp_t allocation) 956 u32 group, gfp_t allocation)
949{ 957{
958 struct net *net = ssk->sk_net;
950 struct netlink_broadcast_data info; 959 struct netlink_broadcast_data info;
951 struct hlist_node *node; 960 struct hlist_node *node;
952 struct sock *sk; 961 struct sock *sk;
@@ -954,6 +963,7 @@ int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid,
954 skb = netlink_trim(skb, allocation); 963 skb = netlink_trim(skb, allocation);
955 964
956 info.exclude_sk = ssk; 965 info.exclude_sk = ssk;
966 info.net = net;
957 info.pid = pid; 967 info.pid = pid;
958 info.group = group; 968 info.group = group;
959 info.failure = 0; 969 info.failure = 0;
@@ -1002,6 +1012,9 @@ static inline int do_one_set_err(struct sock *sk,
1002 if (sk == p->exclude_sk) 1012 if (sk == p->exclude_sk)
1003 goto out; 1013 goto out;
1004 1014
1015 if (sk->sk_net != p->exclude_sk->sk_net)
1016 goto out;
1017
1005 if (nlk->pid == p->pid || p->group - 1 >= nlk->ngroups || 1018 if (nlk->pid == p->pid || p->group - 1 >= nlk->ngroups ||
1006 !test_bit(p->group - 1, nlk->groups)) 1019 !test_bit(p->group - 1, nlk->groups))
1007 goto out; 1020 goto out;
@@ -1304,7 +1317,7 @@ static void netlink_data_ready(struct sock *sk, int len)
1304 */ 1317 */
1305 1318
1306struct sock * 1319struct sock *
1307netlink_kernel_create(int unit, unsigned int groups, 1320netlink_kernel_create(struct net *net, int unit, unsigned int groups,
1308 void (*input)(struct sock *sk, int len), 1321 void (*input)(struct sock *sk, int len),
1309 struct mutex *cb_mutex, struct module *module) 1322 struct mutex *cb_mutex, struct module *module)
1310{ 1323{
@@ -1321,7 +1334,7 @@ netlink_kernel_create(int unit, unsigned int groups,
1321 if (sock_create_lite(PF_NETLINK, SOCK_DGRAM, unit, &sock)) 1334 if (sock_create_lite(PF_NETLINK, SOCK_DGRAM, unit, &sock))
1322 return NULL; 1335 return NULL;
1323 1336
1324 if (__netlink_create(&init_net, sock, cb_mutex, unit) < 0) 1337 if (__netlink_create(net, sock, cb_mutex, unit) < 0)
1325 goto out_sock_release; 1338 goto out_sock_release;
1326 1339
1327 if (groups < 32) 1340 if (groups < 32)
@@ -1336,18 +1349,20 @@ netlink_kernel_create(int unit, unsigned int groups,
1336 if (input) 1349 if (input)
1337 nlk_sk(sk)->data_ready = input; 1350 nlk_sk(sk)->data_ready = input;
1338 1351
1339 if (netlink_insert(sk, 0)) 1352 if (netlink_insert(sk, net, 0))
1340 goto out_sock_release; 1353 goto out_sock_release;
1341 1354
1342 nlk = nlk_sk(sk); 1355 nlk = nlk_sk(sk);
1343 nlk->flags |= NETLINK_KERNEL_SOCKET; 1356 nlk->flags |= NETLINK_KERNEL_SOCKET;
1344 1357
1345 netlink_table_grab(); 1358 netlink_table_grab();
1346 nl_table[unit].groups = groups; 1359 if (!nl_table[unit].registered) {
1347 nl_table[unit].listeners = listeners; 1360 nl_table[unit].groups = groups;
1348 nl_table[unit].cb_mutex = cb_mutex; 1361 nl_table[unit].listeners = listeners;
1349 nl_table[unit].module = module; 1362 nl_table[unit].cb_mutex = cb_mutex;
1350 nl_table[unit].registered = 1; 1363 nl_table[unit].module = module;
1364 nl_table[unit].registered = 1;
1365 }
1351 netlink_table_ungrab(); 1366 netlink_table_ungrab();
1352 1367
1353 return sk; 1368 return sk;
@@ -1513,7 +1528,7 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
1513 atomic_inc(&skb->users); 1528 atomic_inc(&skb->users);
1514 cb->skb = skb; 1529 cb->skb = skb;
1515 1530
1516 sk = netlink_lookup(ssk->sk_protocol, NETLINK_CB(skb).pid); 1531 sk = netlink_lookup(ssk->sk_net, ssk->sk_protocol, NETLINK_CB(skb).pid);
1517 if (sk == NULL) { 1532 if (sk == NULL) {
1518 netlink_destroy_callback(cb); 1533 netlink_destroy_callback(cb);
1519 return -ECONNREFUSED; 1534 return -ECONNREFUSED;
@@ -1555,7 +1570,8 @@ void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err)
1555 if (!skb) { 1570 if (!skb) {
1556 struct sock *sk; 1571 struct sock *sk;
1557 1572
1558 sk = netlink_lookup(in_skb->sk->sk_protocol, 1573 sk = netlink_lookup(in_skb->sk->sk_net,
1574 in_skb->sk->sk_protocol,
1559 NETLINK_CB(in_skb).pid); 1575 NETLINK_CB(in_skb).pid);
1560 if (sk) { 1576 if (sk) {
1561 sk->sk_err = ENOBUFS; 1577 sk->sk_err = ENOBUFS;
@@ -1706,6 +1722,7 @@ int nlmsg_notify(struct sock *sk, struct sk_buff *skb, u32 pid,
1706 1722
1707#ifdef CONFIG_PROC_FS 1723#ifdef CONFIG_PROC_FS
1708struct nl_seq_iter { 1724struct nl_seq_iter {
1725 struct net *net;
1709 int link; 1726 int link;
1710 int hash_idx; 1727 int hash_idx;
1711}; 1728};
@@ -1723,6 +1740,8 @@ static struct sock *netlink_seq_socket_idx(struct seq_file *seq, loff_t pos)
1723 1740
1724 for (j = 0; j <= hash->mask; j++) { 1741 for (j = 0; j <= hash->mask; j++) {
1725 sk_for_each(s, node, &hash->table[j]) { 1742 sk_for_each(s, node, &hash->table[j]) {
1743 if (iter->net != s->sk_net)
1744 continue;
1726 if (off == pos) { 1745 if (off == pos) {
1727 iter->link = i; 1746 iter->link = i;
1728 iter->hash_idx = j; 1747 iter->hash_idx = j;
@@ -1752,11 +1771,14 @@ static void *netlink_seq_next(struct seq_file *seq, void *v, loff_t *pos)
1752 if (v == SEQ_START_TOKEN) 1771 if (v == SEQ_START_TOKEN)
1753 return netlink_seq_socket_idx(seq, 0); 1772 return netlink_seq_socket_idx(seq, 0);
1754 1773
1755 s = sk_next(v); 1774 iter = seq->private;
1775 s = v;
1776 do {
1777 s = sk_next(s);
1778 } while (s && (iter->net != s->sk_net));
1756 if (s) 1779 if (s)
1757 return s; 1780 return s;
1758 1781
1759 iter = seq->private;
1760 i = iter->link; 1782 i = iter->link;
1761 j = iter->hash_idx + 1; 1783 j = iter->hash_idx + 1;
1762 1784
@@ -1765,6 +1787,8 @@ static void *netlink_seq_next(struct seq_file *seq, void *v, loff_t *pos)
1765 1787
1766 for (; j <= hash->mask; j++) { 1788 for (; j <= hash->mask; j++) {
1767 s = sk_head(&hash->table[j]); 1789 s = sk_head(&hash->table[j]);
1790 while (s && (iter->net != s->sk_net))
1791 s = sk_next(s);
1768 if (s) { 1792 if (s) {
1769 iter->link = i; 1793 iter->link = i;
1770 iter->hash_idx = j; 1794 iter->hash_idx = j;
@@ -1835,15 +1859,24 @@ static int netlink_seq_open(struct inode *inode, struct file *file)
1835 1859
1836 seq = file->private_data; 1860 seq = file->private_data;
1837 seq->private = iter; 1861 seq->private = iter;
1862 iter->net = get_net(PROC_NET(inode));
1838 return 0; 1863 return 0;
1839} 1864}
1840 1865
1866static int netlink_seq_release(struct inode *inode, struct file *file)
1867{
1868 struct seq_file *seq = file->private_data;
1869 struct nl_seq_iter *iter = seq->private;
1870 put_net(iter->net);
1871 return seq_release_private(inode, file);
1872}
1873
1841static const struct file_operations netlink_seq_fops = { 1874static const struct file_operations netlink_seq_fops = {
1842 .owner = THIS_MODULE, 1875 .owner = THIS_MODULE,
1843 .open = netlink_seq_open, 1876 .open = netlink_seq_open,
1844 .read = seq_read, 1877 .read = seq_read,
1845 .llseek = seq_lseek, 1878 .llseek = seq_lseek,
1846 .release = seq_release_private, 1879 .release = netlink_seq_release,
1847}; 1880};
1848 1881
1849#endif 1882#endif
@@ -1885,6 +1918,27 @@ static struct net_proto_family netlink_family_ops = {
1885 .owner = THIS_MODULE, /* for consistency 8) */ 1918 .owner = THIS_MODULE, /* for consistency 8) */
1886}; 1919};
1887 1920
1921static int netlink_net_init(struct net *net)
1922{
1923#ifdef CONFIG_PROC_FS
1924 if (!proc_net_fops_create(net, "netlink", 0, &netlink_seq_fops))
1925 return -ENOMEM;
1926#endif
1927 return 0;
1928}
1929
1930static void netlink_net_exit(struct net *net)
1931{
1932#ifdef CONFIG_PROC_FS
1933 proc_net_remove(net, "netlink");
1934#endif
1935}
1936
1937static struct pernet_operations netlink_net_ops = {
1938 .init = netlink_net_init,
1939 .exit = netlink_net_exit,
1940};
1941
1888static int __init netlink_proto_init(void) 1942static int __init netlink_proto_init(void)
1889{ 1943{
1890 struct sk_buff *dummy_skb; 1944 struct sk_buff *dummy_skb;
@@ -1930,9 +1984,7 @@ static int __init netlink_proto_init(void)
1930 } 1984 }
1931 1985
1932 sock_register(&netlink_family_ops); 1986 sock_register(&netlink_family_ops);
1933#ifdef CONFIG_PROC_FS 1987 register_pernet_subsys(&netlink_net_ops);
1934 proc_net_fops_create(&init_net, "netlink", 0, &netlink_seq_fops);
1935#endif
1936 /* The netlink device handler may be needed early. */ 1988 /* The netlink device handler may be needed early. */
1937 rtnetlink_init(); 1989 rtnetlink_init();
1938out: 1990out:
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c
index 8c11ca4a2121..af8fe26815fa 100644
--- a/net/netlink/genetlink.c
+++ b/net/netlink/genetlink.c
@@ -782,8 +782,8 @@ static int __init genl_init(void)
782 netlink_set_nonroot(NETLINK_GENERIC, NL_NONROOT_RECV); 782 netlink_set_nonroot(NETLINK_GENERIC, NL_NONROOT_RECV);
783 783
784 /* we'll bump the group number right afterwards */ 784 /* we'll bump the group number right afterwards */
785 genl_sock = netlink_kernel_create(NETLINK_GENERIC, 0, genl_rcv, 785 genl_sock = netlink_kernel_create(&init_net, NETLINK_GENERIC, 0,
786 NULL, THIS_MODULE); 786 genl_rcv, NULL, THIS_MODULE);
787 if (genl_sock == NULL) 787 if (genl_sock == NULL)
788 panic("GENL: Cannot initialize generic netlink\n"); 788 panic("GENL: Cannot initialize generic netlink\n");
789 789
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
index 0d81c0f23919..1f8e7c22ddbd 100644
--- a/net/xfrm/xfrm_user.c
+++ b/net/xfrm/xfrm_user.c
@@ -2399,7 +2399,7 @@ static int __init xfrm_user_init(void)
2399 2399
2400 printk(KERN_INFO "Initializing XFRM netlink socket\n"); 2400 printk(KERN_INFO "Initializing XFRM netlink socket\n");
2401 2401
2402 nlsk = netlink_kernel_create(NETLINK_XFRM, XFRMNLGRP_MAX, 2402 nlsk = netlink_kernel_create(&init_net, NETLINK_XFRM, XFRMNLGRP_MAX,
2403 xfrm_netlink_rcv, NULL, THIS_MODULE); 2403 xfrm_netlink_rcv, NULL, THIS_MODULE);
2404 if (nlsk == NULL) 2404 if (nlsk == NULL)
2405 return -ENOMEM; 2405 return -ENOMEM;
diff --git a/security/selinux/netlink.c b/security/selinux/netlink.c
index f49046de63a2..b59871d74dad 100644
--- a/security/selinux/netlink.c
+++ b/security/selinux/netlink.c
@@ -17,6 +17,7 @@
17#include <linux/skbuff.h> 17#include <linux/skbuff.h>
18#include <linux/netlink.h> 18#include <linux/netlink.h>
19#include <linux/selinux_netlink.h> 19#include <linux/selinux_netlink.h>
20#include <net/net_namespace.h>
20 21
21static struct sock *selnl; 22static struct sock *selnl;
22 23
@@ -104,8 +105,8 @@ void selnl_notify_policyload(u32 seqno)
104 105
105static int __init selnl_init(void) 106static int __init selnl_init(void)
106{ 107{
107 selnl = netlink_kernel_create(NETLINK_SELINUX, SELNLGRP_MAX, NULL, NULL, 108 selnl = netlink_kernel_create(&init_net, NETLINK_SELINUX,
108 THIS_MODULE); 109 SELNLGRP_MAX, NULL, NULL, THIS_MODULE);
109 if (selnl == NULL) 110 if (selnl == NULL)
110 panic("SELinux: Cannot create netlink socket."); 111 panic("SELinux: Cannot create netlink socket.");
111 netlink_set_nonroot(NETLINK_SELINUX, NL_NONROOT_RECV); 112 netlink_set_nonroot(NETLINK_SELINUX, NL_NONROOT_RECV);