netlink: avoid a double skb free in genlmsg_mcast()
[pandora-kernel.git] / net / netlink / genetlink.c
index 482fa57..c41301a 100644 (file)
@@ -134,6 +134,7 @@ int genl_register_mc_group(struct genl_family *family,
        int err = 0;
 
        BUG_ON(grp->name[0] == '\0');
+       BUG_ON(memchr(grp->name, '\0', GENL_NAMSIZ) == NULL);
 
        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;
+       bool delivered = false;
        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);
-                       if (err)
+                       if (!err)
+                               delivered = true;
+                       else if (err != -ESRCH)
                                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)
+               return err;
+       return delivered ? 0 : -ESRCH;
  error:
        kfree_skb(skb);
        return err;