mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 17:08:10 +00:00
tcp: fix listening_get_next()
Alexey Vlasov found /proc/net/tcp could sometime loop and display millions of sockets in LISTEN state. In 2.6.29, when we converted TCP hash tables to RCU, we left two sk_next() calls in listening_get_next(). We must instead use sk_nulls_next() to properly detect an end of chain. Reported-by: Alexey Vlasov <renton@renton.name> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
b7e03ec9a6
commit
1bde5ac493
1 changed files with 2 additions and 2 deletions
|
@ -2030,7 +2030,7 @@ static void *listening_get_next(struct seq_file *seq, void *cur)
|
|||
get_req:
|
||||
req = icsk->icsk_accept_queue.listen_opt->syn_table[st->sbucket];
|
||||
}
|
||||
sk = sk_next(st->syn_wait_sk);
|
||||
sk = sk_nulls_next(st->syn_wait_sk);
|
||||
st->state = TCP_SEQ_STATE_LISTENING;
|
||||
read_unlock_bh(&icsk->icsk_accept_queue.syn_wait_lock);
|
||||
} else {
|
||||
|
@ -2039,7 +2039,7 @@ static void *listening_get_next(struct seq_file *seq, void *cur)
|
|||
if (reqsk_queue_len(&icsk->icsk_accept_queue))
|
||||
goto start_req;
|
||||
read_unlock_bh(&icsk->icsk_accept_queue.syn_wait_lock);
|
||||
sk = sk_next(sk);
|
||||
sk = sk_nulls_next(sk);
|
||||
}
|
||||
get_sk:
|
||||
sk_nulls_for_each_from(sk, node) {
|
||||
|
|
Loading…
Reference in a new issue