From 6f95524be3cee89bcf1790e2c33e00b69d123fe9 Mon Sep 17 00:00:00 2001 From: sakridge Date: Tue, 14 Apr 2020 13:34:41 -0700 Subject: [PATCH] Fix race in multi_bind_in_range (#9493) (cherry picked from commit ee72714c085bb885c2b842bb2c621c7e43e04258) --- net-utils/src/lib.rs | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/net-utils/src/lib.rs b/net-utils/src/lib.rs index 6ed03f71d6..a3220b6abe 100644 --- a/net-utils/src/lib.rs +++ b/net-utils/src/lib.rs @@ -307,13 +307,32 @@ pub fn multi_bind_in_range( } let mut sockets = Vec::with_capacity(num); - let port = { - let (port, _) = bind_in_range(ip_addr, range)?; - port - }; // drop the probe, port should be available... briefly. + const NUM_TRIES: usize = 100; + let mut port = 0; + let mut error = None; + for _ in 0..NUM_TRIES { + port = { + let (port, _) = bind_in_range(ip_addr, range)?; + port + }; // drop the probe, port should be available... briefly. - for _ in 0..num { - sockets.push(bind_to(ip_addr, port, true)?); + for _ in 0..num { + let sock = bind_to(ip_addr, port, true); + if let Ok(sock) = sock { + sockets.push(sock); + } else { + error = Some(sock); + break; + } + } + if sockets.len() == num { + break; + } else { + sockets.clear(); + } + } + if sockets.len() != num { + error.unwrap()?; } Ok((port, sockets)) }