diff -u -r1.3 af_netlink.c --- a/net/netlink/af_netlink.c 19 Sep 2004 19:46:20 -0000 1.3 +++ b/net/netlink/af_netlink.c 19 Sep 2004 20:04:44 -0000 @@ -629,8 +629,9 @@ kmalloc(sizeof(struct netlink_work), GFP_KERNEL); if (!nlwork) - return -1; - + return 0; + + sock_hold(sk); INIT_WORK(&nlwork->work, netlink_wq_handler, nlwork); nlwork->sk = sk; nlwork->len = skb->len; @@ -638,9 +639,9 @@ } else sk->sk_data_ready(sk, skb->len); - return 0; + return 1; } - return -1; + return 0; } int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid, @@ -683,14 +684,13 @@ netlink_overrun(sk); /* Clone failed. Notify ALL listeners. */ failure = 1; - sock_put(sk); } else if (netlink_broadcast_deliver(sk, skb2)) { - netlink_overrun(sk); - sock_put(sk); - } else { delivered = 1; skb2 = NULL; - } + } else + netlink_overrun(sk); + + sock_put(sk); } netlink_unlock_table();