From 4e10204b8e4f833136edf03a0cfcc8dbecdf3d29 Mon Sep 17 00:00:00 2001 From: Evan Hazlett Date: Thu, 19 Mar 2015 15:30:02 -0400 Subject: [PATCH 1/2] 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 8e7005d7..5ea8bf80 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 } From f524029d4830ddf5ab0dc22e970b7ae4465cff54 Mon Sep 17 00:00:00 2001 From: Evan Hazlett Date: Wed, 25 Mar 2015 18:10:54 -0700 Subject: [PATCH 2/2] virtualbox: add maximum retry for allocating a tcp port Signed-off-by: Evan Hazlett --- drivers/virtualbox/virtualbox.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/virtualbox/virtualbox.go b/drivers/virtualbox/virtualbox.go index 5ea8bf80..8a2abd34 100644 --- a/drivers/virtualbox/virtualbox.go +++ b/drivers/virtualbox/virtualbox.go @@ -629,7 +629,7 @@ func zeroFill(w io.Writer, n int64) error { func getAvailableTCPPort() (int, error) { port := 0 - for { + for i := 0; i <= 10; i++ { ln, err := net.Listen("tcp4", "127.0.0.1:0") if err != nil { return 0, err @@ -643,10 +643,10 @@ func getAvailableTCPPort() (int, error) { } if p != 0 { port = p - break + return port, nil } time.Sleep(1) } + return 0, fmt.Errorf("unable to allocate tcp port") - return port, nil }