Skip to content

Commit

Permalink
[NETLINK]: Fix infinite loops in synchronous netlink changes.
Browse files Browse the repository at this point in the history
The qlen should continue to decrement, even if we
pop partially processed SKBs back onto the receive queue.

Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David S. Miller authored and David S. Miller committed May 3, 2005
1 parent 2a0a6eb commit 09e1430
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 9 deletions.
7 changes: 3 additions & 4 deletions net/core/rtnetlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -626,14 +626,13 @@ static void rtnetlink_rcv(struct sock *sk, int len)
if (qlen > skb_queue_len(&sk->sk_receive_queue))
qlen = skb_queue_len(&sk->sk_receive_queue);

while (qlen--) {
for (; qlen; qlen--) {
skb = skb_dequeue(&sk->sk_receive_queue);
if (rtnetlink_rcv_skb(skb)) {
if (skb->len) {
if (skb->len)
skb_queue_head(&sk->sk_receive_queue,
skb);
qlen++;
} else
else
kfree_skb(skb);
break;
}
Expand Down
2 changes: 1 addition & 1 deletion net/decnet/netfilter/dn_rtmsg.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ static void dnrmg_receive_user_sk(struct sock *sk, int len)
struct sk_buff *skb;
unsigned int qlen = skb_queue_len(&sk->sk_receive_queue);

while (qlen-- && (skb = skb_dequeue(&sk->sk_receive_queue))) {
for (; qlen && (skb = skb_dequeue(&sk->sk_receive_queue)); qlen--) {
dnrmg_receive_user_skb(skb);
kfree_skb(skb);
}
Expand Down
7 changes: 3 additions & 4 deletions net/xfrm/xfrm_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -1018,14 +1018,13 @@ static void xfrm_netlink_rcv(struct sock *sk, int len)
if (qlen > skb_queue_len(&sk->sk_receive_queue))
qlen = skb_queue_len(&sk->sk_receive_queue);

while (qlen--) {
for (; qlen; qlen--) {
skb = skb_dequeue(&sk->sk_receive_queue);
if (xfrm_user_rcv_skb(skb)) {
if (skb->len) {
if (skb->len)
skb_queue_head(&sk->sk_receive_queue,
skb);
qlen++;
} else
else
kfree_skb(skb);
break;
}
Expand Down

0 comments on commit 09e1430

Please sign in to comment.