git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
netlink: ensure to loop over all netns in genlmsg_multicast_allns()
[pandora-kernel.git]
/
net
/
netlink
/
genetlink.c
diff --git
a/net/netlink/genetlink.c
b/net/netlink/genetlink.c
index
482fa57
..
3b1b2a2
100644
(file)
--- a/
net/netlink/genetlink.c
+++ b/
net/netlink/genetlink.c
@@
-134,6
+134,7
@@
int genl_register_mc_group(struct genl_family *family,
int err = 0;
BUG_ON(grp->name[0] == '\0');
int err = 0;
BUG_ON(grp->name[0] == '\0');
+ BUG_ON(memchr(grp->name, '\0', GENL_NAMSIZ) == NULL);
genl_lock();
genl_lock();
@@
-916,6
+917,7
@@
static int genlmsg_mcast(struct sk_buff *skb, u32 pid, unsigned long group,
{
struct sk_buff *tmp;
struct net *net, *prev = NULL;
{
struct sk_buff *tmp;
struct net *net, *prev = NULL;
+ bool delivered = false;
int err;
for_each_net_rcu(net) {
int err;
for_each_net_rcu(net) {
@@
-927,14
+929,21
@@
static int genlmsg_mcast(struct sk_buff *skb, u32 pid, unsigned long group,
}
err = nlmsg_multicast(prev->genl_sock, tmp,
pid, group, flags);
}
err = nlmsg_multicast(prev->genl_sock, tmp,
pid, group, flags);
- if (err)
+ if (!err)
+ delivered = true;
+ else if (err != -ESRCH)
goto error;
}
prev = net;
}
goto error;
}
prev = net;
}
- return nlmsg_multicast(prev->genl_sock, skb, pid, group, flags);
+ err = nlmsg_multicast(prev->genl_sock, skb, pid, group, flags);
+ if (!err)
+ delivered = true;
+ else if (err != -ESRCH)
+ goto error;
+ return delivered ? 0 : -ESRCH;
error:
kfree_skb(skb);
return err;
error:
kfree_skb(skb);
return err;