[NETLINK]: Defer socket destruction a bit
authorTommy S. Christensen <tommy.christensen@tpack.net>
Thu, 19 May 2005 20:07:32 +0000 (13:07 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 19 May 2005 20:07:32 +0000 (13:07 -0700)
In netlink_broadcast() we're sending shared skb's to netlink listeners
when possible (saves some copying). This is OK, since we hold the only
other reference to the skb.

However, this implies that we must drop our reference on the skb, before
allowing a receiving socket to disappear. Otherwise, the socket buffer
accounting is disrupted.

Signed-off-by: Tommy S. Christensen <tommy.christensen@tpack.net>
Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/netlink/af_netlink.c

index 4b91f4b84cb7a78d3714570885f7c3b6a00aef65..e41ce458c2a99afd66c1f7255638c918b61c8fea 100644 (file)
@@ -789,11 +789,12 @@ int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid,
        sk_for_each_bound(sk, node, &nl_table[ssk->sk_protocol].mc_list)
                do_one_broadcast(sk, &info);
 
+       kfree_skb(skb);
+
        netlink_unlock_table();
 
        if (info.skb2)
                kfree_skb(info.skb2);
-       kfree_skb(skb);
 
        if (info.delivered) {
                if (info.congested && (allocation & __GFP_WAIT))