From 99aa2da7ea1f82eb8385835e5e7bf293c8da4fb5 Mon Sep 17 00:00:00 2001 From: Andrew Gerrand Date: Wed, 8 May 2013 15:58:43 -0700 Subject: [release-branch.go1.1] net: fix dial race on plan9 and windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ««« CL 9159043 / f1ddc3ce3dfe net: fix dial race on plan9 and windows Fixes #5349. R=golang-dev, lucio.dere, dsymonds, bradfitz, iant, adg, dave, r CC=golang-dev https://golang.org/cl/9159043 »»» R=golang-dev CC=golang-dev https://golang.org/cl/9315043 --- src/pkg/net/dial_gen.go | 18 +++++++++++++++--- src/pkg/net/dial_gen_test.go | 11 +++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 src/pkg/net/dial_gen_test.go diff --git a/src/pkg/net/dial_gen.go b/src/pkg/net/dial_gen.go index 0a3277de46..19f8681682 100644 --- a/src/pkg/net/dial_gen.go +++ b/src/pkg/net/dial_gen.go @@ -10,14 +10,23 @@ import ( "time" ) +var testingIssue5349 bool // used during tests + // resolveAndDialChannel is the simple pure-Go implementation of // resolveAndDial, still used on operating systems where the deadline // hasn't been pushed down into the pollserver. (Plan 9 and some old // versions of Windows) func resolveAndDialChannel(net, addr string, localAddr Addr, deadline time.Time) (Conn, error) { - timeout := deadline.Sub(time.Now()) - if timeout < 0 { - timeout = 0 + var timeout time.Duration + if !deadline.IsZero() { + timeout = deadline.Sub(time.Now()) + } + if timeout <= 0 { + ra, err := resolveAddr("dial", net, addr, noDeadline) + if err != nil { + return nil, err + } + return dial(net, addr, localAddr, ra, noDeadline) } t := time.NewTimer(timeout) defer t.Stop() @@ -28,6 +37,9 @@ func resolveAndDialChannel(net, addr string, localAddr Addr, deadline time.Time) ch := make(chan pair, 1) resolvedAddr := make(chan Addr, 1) go func() { + if testingIssue5349 { + time.Sleep(time.Millisecond) + } ra, err := resolveAddr("dial", net, addr, noDeadline) if err != nil { ch <- pair{nil, err} diff --git a/src/pkg/net/dial_gen_test.go b/src/pkg/net/dial_gen_test.go new file mode 100644 index 0000000000..c857acd06d --- /dev/null +++ b/src/pkg/net/dial_gen_test.go @@ -0,0 +1,11 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows plan9 + +package net + +func init() { + testingIssue5349 = true +} -- cgit v1.2.3-54-g00ecf