|
@@ -154,6 +154,12 @@ static void netlink_destroy_callback(struct netlink_callback *cb)
|
|
|
kfree(cb);
|
|
|
}
|
|
|
|
|
|
+static void netlink_consume_callback(struct netlink_callback *cb)
|
|
|
+{
|
|
|
+ consume_skb(cb->skb);
|
|
|
+ kfree(cb);
|
|
|
+}
|
|
|
+
|
|
|
static void netlink_sock_destruct(struct sock *sk)
|
|
|
{
|
|
|
struct netlink_sock *nlk = nlk_sk(sk);
|
|
@@ -902,8 +908,10 @@ static int netlink_unicast_kernel(struct sock *sk, struct sk_buff *skb)
|
|
|
ret = skb->len;
|
|
|
skb_set_owner_r(skb, sk);
|
|
|
nlk->netlink_rcv(skb);
|
|
|
+ consume_skb(skb);
|
|
|
+ } else {
|
|
|
+ kfree_skb(skb);
|
|
|
}
|
|
|
- kfree_skb(skb);
|
|
|
sock_put(sk);
|
|
|
return ret;
|
|
|
}
|
|
@@ -1728,7 +1736,7 @@ static int netlink_dump(struct sock *sk)
|
|
|
nlk->cb = NULL;
|
|
|
mutex_unlock(nlk->cb_mutex);
|
|
|
|
|
|
- netlink_destroy_callback(cb);
|
|
|
+ netlink_consume_callback(cb);
|
|
|
return 0;
|
|
|
|
|
|
errout_skb:
|