From 4e10204b8e4f833136edf03a0cfcc8dbecdf3d29 Mon Sep 17 00:00:00 2001 From: Evan Hazlett Date: Thu, 19 Mar 2015 15:30:02 -0400 Subject: [PATCH] vbox: fix race with getting a tcp port Signed-off-by: Evan Hazlett --- drivers/virtualbox/virtualbox.go | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/drivers/virtualbox/virtualbox.go b/drivers/virtualbox/virtualbox.go index 8e7005d72d..5ea8bf8033 100644 --- a/drivers/virtualbox/virtualbox.go +++ b/drivers/virtualbox/virtualbox.go @@ -628,15 +628,25 @@ func zeroFill(w io.Writer, n int64) error { } func getAvailableTCPPort() (int, error) { - // FIXME: this has a race condition between finding an available port and - // virtualbox using that port. Perhaps we should randomly pick an unused - // port in a range not used by kernel for assigning ports - ln, err := net.Listen("tcp4", "127.0.0.1:0") - if err != nil { - return 0, err + port := 0 + for { + ln, err := net.Listen("tcp4", "127.0.0.1:0") + if err != nil { + return 0, err + } + defer ln.Close() + addr := ln.Addr().String() + addrParts := strings.SplitN(addr, ":", 2) + p, err := strconv.Atoi(addrParts[1]) + if err != nil { + return 0, err + } + if p != 0 { + port = p + break + } + time.Sleep(1) } - defer ln.Close() - addr := ln.Addr().String() - addrParts := strings.SplitN(addr, ":", 2) - return strconv.Atoi(addrParts[1]) + + return port, nil }