Re: [PATCH] udp: port starting location not random
flat view
From: Eric Dumazet <hidden>
Date: 2012-10-04 21:45:57
On Thu, 2012-10-04 at 14:28 -0700, Stephen Hemminger wrote:
On Thu, 04 Oct 2012 17:12:46 -0400 (EDT) David Miller [off-list ref] wrote:quoted
From: Stephen Hemminger <redacted> Date: Thu, 4 Oct 2012 14:08:28 -0700quoted
While working on VXLAN, noticed a bug in UDP introduced by: commit 9088c5609584684149f3fb5b065aa7f18dcb03ff Author: Eric Dumazet [off-list ref] Date: Wed Oct 8 11:44:17 2008 -0700 udp: Improve port randomization The logic for choosing where to start for port randomization incorrectly calculates the starting port number. It is always ends up using the low end of the range independent of the value of random. This causes all UDP port searches to start at the same port. Doing the following fixes it but at the cost of doing a real divide. Signed-off-by: Stephen Hemminger <redacted> --- Resend, previous send was not going to netdev. Not sure if worth fixing for stable, because only has performance impact and some application might be depending on current broken behaviour.--- a/net/ipv4/udp.c 2012-10-01 17:06:53.107427436 -0700 +++ b/net/ipv4/udp.c 2012-10-04 13:43:21.278960379 -0700@@ -216,7 +216,7 @@ int udp_lib_get_port(struct sock *sk, un remaining = (high - low) + 1; rand = net_random(); - first = (((u64)rand * remaining) >> 32) + low; + first = rand % remaining + low;Try replacing "remaining" with "(remaining << (64 - 16))" in the expression instead.The standalone program gets same result.
Hey, I hope you understand random32() does allocate a 32bit value, not a 15bit one... If really we had such a bug, I am pretty sure we would have noticed.