diff options
-rw-r--r-- | drivers/connector/connector.c | 2 | ||||
-rw-r--r-- | drivers/scsi/scsi_netlink.c | 2 | ||||
-rw-r--r-- | drivers/scsi/scsi_transport_iscsi.c | 2 | ||||
-rw-r--r-- | fs/ecryptfs/netlink.c | 2 | ||||
-rw-r--r-- | include/linux/netlink.h | 6 | ||||
-rw-r--r-- | kernel/audit.c | 4 | ||||
-rw-r--r-- | lib/kobject_uevent.c | 5 | ||||
-rw-r--r-- | net/bridge/netfilter/ebt_ulog.c | 5 | ||||
-rw-r--r-- | net/core/rtnetlink.c | 4 | ||||
-rw-r--r-- | net/decnet/netfilter/dn_rtmsg.c | 3 | ||||
-rw-r--r-- | net/ipv4/fib_frontend.c | 4 | ||||
-rw-r--r-- | net/ipv4/inet_diag.c | 4 | ||||
-rw-r--r-- | net/ipv4/netfilter/ip_queue.c | 6 | ||||
-rw-r--r-- | net/ipv4/netfilter/ipt_ULOG.c | 3 | ||||
-rw-r--r-- | net/ipv6/netfilter/ip6_queue.c | 6 | ||||
-rw-r--r-- | net/netfilter/nfnetlink.c | 2 | ||||
-rw-r--r-- | net/netfilter/nfnetlink_log.c | 3 | ||||
-rw-r--r-- | net/netfilter/nfnetlink_queue.c | 3 | ||||
-rw-r--r-- | net/netlink/af_netlink.c | 104 | ||||
-rw-r--r-- | net/netlink/genetlink.c | 4 | ||||
-rw-r--r-- | net/xfrm/xfrm_user.c | 2 | ||||
-rw-r--r-- | security/selinux/netlink.c | 5 |
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 | ||
30 | struct net; | ||
31 | |||
30 | struct sockaddr_nl | 32 | struct 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 | ||
160 | extern struct sock *netlink_kernel_create(int unit, unsigned int groups, | 162 | extern 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 | ||
207 | struct netlink_notify | 210 | struct 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) |
281 | static int __init kobject_uevent_init(void) | 281 | static 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 | ||
817 | static void nl_fib_lookup_init(void) | 817 | static 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 | ||
823 | static void fib_disable_ip(struct net_device *dev, int force) | 823 | static 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 | ||
214 | static __inline__ struct sock *netlink_lookup(int protocol, u32 pid) | 214 | static __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 | ||
331 | static int netlink_insert(struct sock *sk, u32 pid) | 331 | static 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) | |||
509 | static int netlink_autobind(struct socket *sock) | 507 | static 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) | |||
598 | static int netlink_bind(struct socket *sock, struct sockaddr *addr, int addr_len) | 599 | static 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) | |||
703 | static struct sock *netlink_getsockbypid(struct sock *ssk, u32 pid) | 705 | static 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 | ||
888 | struct netlink_broadcast_data { | 892 | struct 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: | |||
947 | int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid, | 955 | int 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 | ||
1306 | struct sock * | 1319 | struct sock * |
1307 | netlink_kernel_create(int unit, unsigned int groups, | 1320 | netlink_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 |
1708 | struct nl_seq_iter { | 1724 | struct 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 | ||
1866 | static 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 | |||
1841 | static const struct file_operations netlink_seq_fops = { | 1874 | static 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 | ||
1921 | static 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 | |||
1930 | static void netlink_net_exit(struct net *net) | ||
1931 | { | ||
1932 | #ifdef CONFIG_PROC_FS | ||
1933 | proc_net_remove(net, "netlink"); | ||
1934 | #endif | ||
1935 | } | ||
1936 | |||
1937 | static struct pernet_operations netlink_net_ops = { | ||
1938 | .init = netlink_net_init, | ||
1939 | .exit = netlink_net_exit, | ||
1940 | }; | ||
1941 | |||
1888 | static int __init netlink_proto_init(void) | 1942 | static 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(); |
1938 | out: | 1990 | out: |
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 | ||
21 | static struct sock *selnl; | 22 | static struct sock *selnl; |
22 | 23 | ||
@@ -104,8 +105,8 @@ void selnl_notify_policyload(u32 seqno) | |||
104 | 105 | ||
105 | static int __init selnl_init(void) | 106 | static 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); |