genetlink: make multicast groups const, prevent abuse
Register generic netlink multicast groups as an array with the family and give them contiguous group IDs. Then instead of passing the global group ID to the various functions that send messages, pass the ID relative to the family - for most families that's just 0 because the only have one group. This avoids the list_head and ID in each group, adding a new field for the mcast group ID offset to the family. At the same time, this allows us to prevent abusing groups again like the quota and dropmon code did, since we can now check that a family only uses a group it owns. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Этот коммит содержится в:

коммит произвёл
David S. Miller

родитель
68eb55031d
Коммит
2a94fe48f3
@@ -9,6 +9,10 @@
|
||||
#include <net/netlink.h>
|
||||
#include <net/genetlink.h>
|
||||
|
||||
static const struct genl_multicast_group quota_mcgrps[] = {
|
||||
{ .name = "events", },
|
||||
};
|
||||
|
||||
/* Netlink family structure for quota */
|
||||
static struct genl_family quota_genl_family = {
|
||||
/*
|
||||
@@ -22,10 +26,8 @@ static struct genl_family quota_genl_family = {
|
||||
.name = "VFS_DQUOT",
|
||||
.version = 1,
|
||||
.maxattr = QUOTA_NL_A_MAX,
|
||||
};
|
||||
|
||||
static struct genl_multicast_group quota_mcgrp = {
|
||||
.name = "events",
|
||||
.mcgrps = quota_mcgrps,
|
||||
.n_mcgrps = ARRAY_SIZE(quota_mcgrps),
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -88,7 +90,7 @@ void quota_send_warning(struct kqid qid, dev_t dev,
|
||||
goto attr_err_out;
|
||||
genlmsg_end(skb, msg_head);
|
||||
|
||||
genlmsg_multicast("a_genl_family, skb, 0, quota_mcgrp.id, GFP_NOFS);
|
||||
genlmsg_multicast("a_genl_family, skb, 0, 0, GFP_NOFS);
|
||||
return;
|
||||
attr_err_out:
|
||||
printk(KERN_ERR "VFS: Not enough space to compose quota message!\n");
|
||||
@@ -102,9 +104,6 @@ static int __init quota_init(void)
|
||||
if (genl_register_family("a_genl_family) != 0)
|
||||
printk(KERN_ERR
|
||||
"VFS: Failed to create quota netlink interface.\n");
|
||||
if (genl_register_mc_group("a_genl_family, "a_mcgrp))
|
||||
printk(KERN_ERR
|
||||
"VFS: Failed to register quota mcast group.\n");
|
||||
return 0;
|
||||
};
|
||||
|
||||
|
Ссылка в новой задаче
Block a user