Skip to content

Commit 8c68b1a

Browse files
Ursula Braundavem330
authored andcommitted
Subject: [PATCH] af_iucv: drop skbs rejected by filter
A packet filter might be installed for instance with setsockopt SO_ATTACH_FILTER. af_iucv currently queues skbs rejected by filter into the backlog queue. This does not make sense, since packets rejected by filter can be dropped immediately. This patch adds separate sk_filter return code checking, and dropping of packets if applicable. Signed-off-by: Ursula Braun <ubraun@linux.vnet.ibm.com> Reported-by: Daniel Borkmann <daniel@iogearbox.net> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 4e0ad32 commit 8c68b1a

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

net/iucv/af_iucv.c

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1323,8 +1323,13 @@ static void iucv_process_message(struct sock *sk, struct sk_buff *skb,
13231323
}
13241324

13251325
IUCV_SKB_CB(skb)->offset = 0;
1326-
if (sock_queue_rcv_skb(sk, skb))
1327-
skb_queue_head(&iucv_sk(sk)->backlog_skb_q, skb);
1326+
if (sk_filter(sk, skb)) {
1327+
atomic_inc(&sk->sk_drops); /* skb rejected by filter */
1328+
kfree_skb(skb);
1329+
return;
1330+
}
1331+
if (__sock_queue_rcv_skb(sk, skb)) /* handle rcv queue full */
1332+
skb_queue_tail(&iucv_sk(sk)->backlog_skb_q, skb);
13281333
}
13291334

13301335
/* iucv_process_message_q() - Process outstanding IUCV messages
@@ -1438,13 +1443,13 @@ static int iucv_sock_recvmsg(struct socket *sock, struct msghdr *msg,
14381443
rskb = skb_dequeue(&iucv->backlog_skb_q);
14391444
while (rskb) {
14401445
IUCV_SKB_CB(rskb)->offset = 0;
1441-
if (sock_queue_rcv_skb(sk, rskb)) {
1446+
if (__sock_queue_rcv_skb(sk, rskb)) {
1447+
/* handle rcv queue full */
14421448
skb_queue_head(&iucv->backlog_skb_q,
14431449
rskb);
14441450
break;
1445-
} else {
1446-
rskb = skb_dequeue(&iucv->backlog_skb_q);
14471451
}
1452+
rskb = skb_dequeue(&iucv->backlog_skb_q);
14481453
}
14491454
if (skb_queue_empty(&iucv->backlog_skb_q)) {
14501455
if (!list_empty(&iucv->message_q.list))
@@ -2124,12 +2129,17 @@ static int afiucv_hs_callback_rx(struct sock *sk, struct sk_buff *skb)
21242129
skb_reset_transport_header(skb);
21252130
skb_reset_network_header(skb);
21262131
IUCV_SKB_CB(skb)->offset = 0;
2132+
if (sk_filter(sk, skb)) {
2133+
atomic_inc(&sk->sk_drops); /* skb rejected by filter */
2134+
kfree_skb(skb);
2135+
return NET_RX_SUCCESS;
2136+
}
2137+
21272138
spin_lock(&iucv->message_q.lock);
21282139
if (skb_queue_empty(&iucv->backlog_skb_q)) {
2129-
if (sock_queue_rcv_skb(sk, skb)) {
2140+
if (__sock_queue_rcv_skb(sk, skb))
21302141
/* handle rcv queue full */
21312142
skb_queue_tail(&iucv->backlog_skb_q, skb);
2132-
}
21332143
} else
21342144
skb_queue_tail(&iucv_sk(sk)->backlog_skb_q, skb);
21352145
spin_unlock(&iucv->message_q.lock);

0 commit comments

Comments
 (0)