aboutsummaryrefslogtreecommitdiffstats
path: root/net/netlink
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2012-09-07 22:53:53 -0400
committerDavid S. Miller <davem@davemloft.net>2012-09-08 18:45:27 -0400
commit9785e10aedfa0fad5c1aac709dce5ada1b123783 (patch)
treeca523e084318b6e908b18c6f3e9e53ea7e9a1c49 /net/netlink
parent16fa9e1d104e6f2c18005a4ac7ea60e4c7fc1286 (diff)
netlink: kill netlink_set_nonroot
Replace netlink_set_nonroot by one new field `flags' in struct netlink_kernel_cfg that is passed to netlink_kernel_create. This patch also renames NL_NONROOT_* to NL_CFG_F_NONROOT_* since now the flags field in nl_table is generic (so we can add more flags if needed in the future). Also adjust all callers in the net-next tree to use these flags instead of netlink_set_nonroot. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/netlink')
-rw-r--r--net/netlink/af_netlink.c28
-rw-r--r--net/netlink/genetlink.c3
2 files changed, 14 insertions, 17 deletions
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index f530b1ca1773..b74540ce3c14 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -121,7 +121,7 @@ struct netlink_table {
121 struct nl_pid_hash hash; 121 struct nl_pid_hash hash;
122 struct hlist_head mc_list; 122 struct hlist_head mc_list;
123 struct listeners __rcu *listeners; 123 struct listeners __rcu *listeners;
124 unsigned int nl_nonroot; 124 unsigned int flags;
125 unsigned int groups; 125 unsigned int groups;
126 struct mutex *cb_mutex; 126 struct mutex *cb_mutex;
127 struct module *module; 127 struct module *module;
@@ -536,6 +536,8 @@ static int netlink_release(struct socket *sock)
536 if (--nl_table[sk->sk_protocol].registered == 0) { 536 if (--nl_table[sk->sk_protocol].registered == 0) {
537 kfree(nl_table[sk->sk_protocol].listeners); 537 kfree(nl_table[sk->sk_protocol].listeners);
538 nl_table[sk->sk_protocol].module = NULL; 538 nl_table[sk->sk_protocol].module = NULL;
539 nl_table[sk->sk_protocol].bind = NULL;
540 nl_table[sk->sk_protocol].flags = 0;
539 nl_table[sk->sk_protocol].registered = 0; 541 nl_table[sk->sk_protocol].registered = 0;
540 } 542 }
541 } else if (nlk->subscriptions) { 543 } else if (nlk->subscriptions) {
@@ -596,7 +598,7 @@ retry:
596 598
597static inline int netlink_capable(const struct socket *sock, unsigned int flag) 599static inline int netlink_capable(const struct socket *sock, unsigned int flag)
598{ 600{
599 return (nl_table[sock->sk->sk_protocol].nl_nonroot & flag) || 601 return (nl_table[sock->sk->sk_protocol].flags & flag) ||
600 capable(CAP_NET_ADMIN); 602 capable(CAP_NET_ADMIN);
601} 603}
602 604
@@ -659,7 +661,7 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr,
659 661
660 /* Only superuser is allowed to listen multicasts */ 662 /* Only superuser is allowed to listen multicasts */
661 if (nladdr->nl_groups) { 663 if (nladdr->nl_groups) {
662 if (!netlink_capable(sock, NL_NONROOT_RECV)) 664 if (!netlink_capable(sock, NL_CFG_F_NONROOT_RECV))
663 return -EPERM; 665 return -EPERM;
664 err = netlink_realloc_groups(sk); 666 err = netlink_realloc_groups(sk);
665 if (err) 667 if (err)
@@ -721,7 +723,7 @@ static int netlink_connect(struct socket *sock, struct sockaddr *addr,
721 return -EINVAL; 723 return -EINVAL;
722 724
723 /* Only superuser is allowed to send multicasts */ 725 /* Only superuser is allowed to send multicasts */
724 if (nladdr->nl_groups && !netlink_capable(sock, NL_NONROOT_SEND)) 726 if (nladdr->nl_groups && !netlink_capable(sock, NL_CFG_F_NONROOT_SEND))
725 return -EPERM; 727 return -EPERM;
726 728
727 if (!nlk->pid) 729 if (!nlk->pid)
@@ -1244,7 +1246,7 @@ static int netlink_setsockopt(struct socket *sock, int level, int optname,
1244 break; 1246 break;
1245 case NETLINK_ADD_MEMBERSHIP: 1247 case NETLINK_ADD_MEMBERSHIP:
1246 case NETLINK_DROP_MEMBERSHIP: { 1248 case NETLINK_DROP_MEMBERSHIP: {
1247 if (!netlink_capable(sock, NL_NONROOT_RECV)) 1249 if (!netlink_capable(sock, NL_CFG_F_NONROOT_RECV))
1248 return -EPERM; 1250 return -EPERM;
1249 err = netlink_realloc_groups(sk); 1251 err = netlink_realloc_groups(sk);
1250 if (err) 1252 if (err)
@@ -1376,7 +1378,7 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock,
1376 dst_group = ffs(addr->nl_groups); 1378 dst_group = ffs(addr->nl_groups);
1377 err = -EPERM; 1379 err = -EPERM;
1378 if ((dst_group || dst_pid) && 1380 if ((dst_group || dst_pid) &&
1379 !netlink_capable(sock, NL_NONROOT_SEND)) 1381 !netlink_capable(sock, NL_CFG_F_NONROOT_SEND))
1380 goto out; 1382 goto out;
1381 } else { 1383 } else {
1382 dst_pid = nlk->dst_pid; 1384 dst_pid = nlk->dst_pid;
@@ -1580,7 +1582,10 @@ netlink_kernel_create(struct net *net, int unit,
1580 rcu_assign_pointer(nl_table[unit].listeners, listeners); 1582 rcu_assign_pointer(nl_table[unit].listeners, listeners);
1581 nl_table[unit].cb_mutex = cb_mutex; 1583 nl_table[unit].cb_mutex = cb_mutex;
1582 nl_table[unit].module = module; 1584 nl_table[unit].module = module;
1583 nl_table[unit].bind = cfg ? cfg->bind : NULL; 1585 if (cfg) {
1586 nl_table[unit].bind = cfg->bind;
1587 nl_table[unit].flags = cfg->flags;
1588 }
1584 nl_table[unit].registered = 1; 1589 nl_table[unit].registered = 1;
1585 } else { 1590 } else {
1586 kfree(listeners); 1591 kfree(listeners);
@@ -1679,13 +1684,6 @@ void netlink_clear_multicast_users(struct sock *ksk, unsigned int group)
1679 netlink_table_ungrab(); 1684 netlink_table_ungrab();
1680} 1685}
1681 1686
1682void netlink_set_nonroot(int protocol, unsigned int flags)
1683{
1684 if ((unsigned int)protocol < MAX_LINKS)
1685 nl_table[protocol].nl_nonroot = flags;
1686}
1687EXPORT_SYMBOL(netlink_set_nonroot);
1688
1689struct nlmsghdr * 1687struct nlmsghdr *
1690__nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags) 1688__nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags)
1691{ 1689{
@@ -2150,7 +2148,7 @@ static void __init netlink_add_usersock_entry(void)
2150 rcu_assign_pointer(nl_table[NETLINK_USERSOCK].listeners, listeners); 2148 rcu_assign_pointer(nl_table[NETLINK_USERSOCK].listeners, listeners);
2151 nl_table[NETLINK_USERSOCK].module = THIS_MODULE; 2149 nl_table[NETLINK_USERSOCK].module = THIS_MODULE;
2152 nl_table[NETLINK_USERSOCK].registered = 1; 2150 nl_table[NETLINK_USERSOCK].registered = 1;
2153 nl_table[NETLINK_USERSOCK].nl_nonroot = NL_NONROOT_SEND; 2151 nl_table[NETLINK_USERSOCK].flags = NL_CFG_F_NONROOT_SEND;
2154 2152
2155 netlink_table_ungrab(); 2153 netlink_table_ungrab();
2156} 2154}
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c
index fda497412fc3..c1b71aef9f71 100644
--- a/net/netlink/genetlink.c
+++ b/net/netlink/genetlink.c
@@ -918,6 +918,7 @@ static int __net_init genl_pernet_init(struct net *net)
918 struct netlink_kernel_cfg cfg = { 918 struct netlink_kernel_cfg cfg = {
919 .input = genl_rcv, 919 .input = genl_rcv,
920 .cb_mutex = &genl_mutex, 920 .cb_mutex = &genl_mutex,
921 .flags = NL_CFG_F_NONROOT_RECV,
921 }; 922 };
922 923
923 /* we'll bump the group number right afterwards */ 924 /* we'll bump the group number right afterwards */
@@ -955,8 +956,6 @@ static int __init genl_init(void)
955 if (err < 0) 956 if (err < 0)
956 goto problem; 957 goto problem;
957 958
958 netlink_set_nonroot(NETLINK_GENERIC, NL_NONROOT_RECV);
959
960 err = register_pernet_subsys(&genl_pernet_ops); 959 err = register_pernet_subsys(&genl_pernet_ops);
961 if (err) 960 if (err)
962 goto problem; 961 goto problem;