--- a/net/netlink/af_netlink.c 2004-09-19 06:23:22.000000000 +0200 +++ b/net/netlink/af_netlink.c 2004-09-19 06:24:48.000000000 +0200 @@ -548,19 +548,21 @@ kmalloc(sizeof(struct netlink_work), GFP_KERNEL); if (!nlwork) - return -EAGAIN; + return 0; INIT_TQUEUE(&nlwork->work, netlink_tq_handler, nlwork); nlwork->sk = sk; nlwork->len = skb->len; queue_task(&nlwork->work, &tq_netlink); wake_up(&netlink_thread_wait); - } else + } else { sk->data_ready(sk, skb->len); + sock_put(sk); + } - return 0; + return 1; } - return -1; + return 0; } void netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid, @@ -602,11 +604,12 @@ /* Clone failed. Notify ALL listeners. */ failure = 1; sock_put(sk); - } else if (netlink_broadcast_deliver(sk, skb2)) { + } else if (netlink_broadcast_deliver(sk, skb2)) + skb2 = NULL; + else { netlink_overrun(sk); sock_put(sk); - } else - skb2 = NULL; + } } netlink_unlock_table();