Skip to content

Commit

Permalink
netlink: only do not deliver to tap when both sides are kernel sks
Browse files Browse the repository at this point in the history
We should also deliver packets to nlmon devices when we are in
netlink_unicast_kernel(), and only one of the {src,dst} sockets
is user sk and the other one kernel sk. That's e.g. the case in
netlink diag, netlink route, etc. Still, forbid to deliver messages
from kernel to kernel sks.

Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
Signed-off-by: Jakub Zawadzki <darkjames-ws@darkjames.pl>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Daniel Borkmann authored and David S. Miller committed Dec 31, 2013
1 parent 89ba52b commit 73bfd37
Showing 1 changed file with 8 additions and 5 deletions.
13 changes: 8 additions & 5 deletions net/netlink/af_netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,13 @@ static void netlink_deliver_tap(struct sk_buff *skb)
rcu_read_unlock();
}

static void netlink_deliver_tap_kernel(struct sock *dst, struct sock *src,
struct sk_buff *skb)
{
if (!(netlink_is_kernel(dst) && netlink_is_kernel(src)))
netlink_deliver_tap(skb);
}

static void netlink_overrun(struct sock *sk)
{
struct netlink_sock *nlk = nlk_sk(sk);
Expand Down Expand Up @@ -1697,14 +1704,10 @@ static int netlink_unicast_kernel(struct sock *sk, struct sk_buff *skb,

ret = -ECONNREFUSED;
if (nlk->netlink_rcv != NULL) {
/* We could do a netlink_deliver_tap(skb) here as well
* but since this is intended for the kernel only, we
* should rather let it stay under the hood.
*/

ret = skb->len;
netlink_skb_set_owner_r(skb, sk);
NETLINK_CB(skb).sk = ssk;
netlink_deliver_tap_kernel(sk, ssk, skb);
nlk->netlink_rcv(skb);
consume_skb(skb);
} else {
Expand Down

0 comments on commit 73bfd37

Please sign in to comment.