Ver código fonte

inet: Fix virt-manager regression due to bind(0) changes.

From: Stephen Hemminger <shemminger@vyatta.com>

Fix regression introduced by a9d8f9110d7e953c2f2b521087a4179677843c2a
("inet: Allowing more than 64k connections and heavily optimize
bind(0) time.")

Based upon initial patches and feedback from Evegniy Polyakov and
Eric Dumazet.

From Eric Dumazet:
--------------------
Also there might be a problem at line 175

if (sk->sk_reuse && sk->sk_state != TCP_LISTEN && --attempts >= 0) { 
	spin_unlock(&head->lock);
	goto again;

If we entered inet_csk_get_port() with a non null snum, we can "goto again"
while it was not expected.
--------------------

Signed-off-by: David S. Miller <davem@davemloft.net>
Stephen Hemminger 16 anos atrás
pai
commit
5add300975
1 arquivos alterados com 2 adições e 1 exclusões
  1. 2 1
      net/ipv4/inet_connection_sock.c

+ 2 - 1
net/ipv4/inet_connection_sock.c

@@ -172,7 +172,8 @@ tb_found:
 		} else {
 		} else {
 			ret = 1;
 			ret = 1;
 			if (inet_csk(sk)->icsk_af_ops->bind_conflict(sk, tb)) {
 			if (inet_csk(sk)->icsk_af_ops->bind_conflict(sk, tb)) {
-				if (sk->sk_reuse && sk->sk_state != TCP_LISTEN && --attempts >= 0) {
+				if (sk->sk_reuse && sk->sk_state != TCP_LISTEN &&
+				    smallest_size != -1 && --attempts >= 0) {
 					spin_unlock(&head->lock);
 					spin_unlock(&head->lock);
 					goto again;
 					goto again;
 				}
 				}