Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5781b235 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

udp: udp_lib_get_port() fix



Now we can have a large udp hash table, udp_lib_get_port() loop
should be converted to a do {} while (cond) form,
or we dont enter it at all if hash table size is exactly 65536.

Reported-by: default avatarYinghai Lu <yinghai@kernel.org>
Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e1187b3b
Loading
Loading
Loading
Loading
+3 −4
Original line number Original line Diff line number Diff line
@@ -216,9 +216,8 @@ int udp_lib_get_port(struct sock *sk, unsigned short snum,
		 * force rand to be an odd multiple of UDP_HTABLE_SIZE
		 * force rand to be an odd multiple of UDP_HTABLE_SIZE
		 */
		 */
		rand = (rand | 1) * (udptable->mask + 1);
		rand = (rand | 1) * (udptable->mask + 1);
		for (last = first + udptable->mask + 1;
		last = first + udptable->mask + 1;
		     first != last;
		do {
		     first++) {
			hslot = udp_hashslot(udptable, net, first);
			hslot = udp_hashslot(udptable, net, first);
			bitmap_zero(bitmap, PORTS_PER_CHAIN);
			bitmap_zero(bitmap, PORTS_PER_CHAIN);
			spin_lock_bh(&hslot->lock);
			spin_lock_bh(&hslot->lock);
@@ -238,7 +237,7 @@ int udp_lib_get_port(struct sock *sk, unsigned short snum,
				snum += rand;
				snum += rand;
			} while (snum != first);
			} while (snum != first);
			spin_unlock_bh(&hslot->lock);
			spin_unlock_bh(&hslot->lock);
		}
		} while (++first != last);
		goto fail;
		goto fail;
	} else {
	} else {
		hslot = udp_hashslot(udptable, net, snum);
		hslot = udp_hashslot(udptable, net, snum);