Skip to content

Commit 73bfd37

Browse files
Daniel Borkmanndavem330
authored andcommitted
netlink: only do not deliver to tap when both sides are kernel sks
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>
1 parent 89ba52b commit 73bfd37

File tree

1 file changed

+8
-5
lines changed

1 file changed

+8
-5
lines changed

net/netlink/af_netlink.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,13 @@ static void netlink_deliver_tap(struct sk_buff *skb)
239239
rcu_read_unlock();
240240
}
241241

242+
static void netlink_deliver_tap_kernel(struct sock *dst, struct sock *src,
243+
struct sk_buff *skb)
244+
{
245+
if (!(netlink_is_kernel(dst) && netlink_is_kernel(src)))
246+
netlink_deliver_tap(skb);
247+
}
248+
242249
static void netlink_overrun(struct sock *sk)
243250
{
244251
struct netlink_sock *nlk = nlk_sk(sk);
@@ -1697,14 +1704,10 @@ static int netlink_unicast_kernel(struct sock *sk, struct sk_buff *skb,
16971704

16981705
ret = -ECONNREFUSED;
16991706
if (nlk->netlink_rcv != NULL) {
1700-
/* We could do a netlink_deliver_tap(skb) here as well
1701-
* but since this is intended for the kernel only, we
1702-
* should rather let it stay under the hood.
1703-
*/
1704-
17051707
ret = skb->len;
17061708
netlink_skb_set_owner_r(skb, sk);
17071709
NETLINK_CB(skb).sk = ssk;
1710+
netlink_deliver_tap_kernel(sk, ssk, skb);
17081711
nlk->netlink_rcv(skb);
17091712
consume_skb(skb);
17101713
} else {

0 commit comments

Comments
 (0)