mirror of
https://github.com/golang/go
synced 2024-11-18 14:54:40 -07:00
net: Forget lookups for canceled contexts
A sequential lookup using any non-canceled context has a risk of returning the result of the previous lookup for a canceled context (i.e. an error). This is already prevented for timed out context by forgetting the host immediately and extending this to also compare the error to `context.Canceled` resolves this issue. Fixes #22724 Change-Id: I7aafa1459a0de4dc5c4332988fbea23cbf4dba07 Reviewed-on: https://go-review.googlesource.com/77670 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
3a181dc7bc
commit
6a3d4be3b8
@ -200,7 +200,7 @@ func (r *Resolver) LookupIPAddr(ctx context.Context, host string) ([]IPAddr, err
|
||||
// rather than waiting for the current lookup to
|
||||
// complete. See issue 8602.
|
||||
ctxErr := ctx.Err()
|
||||
if ctxErr == context.DeadlineExceeded {
|
||||
if ctxErr == context.Canceled || ctxErr == context.DeadlineExceeded {
|
||||
lookupGroup.Forget(host)
|
||||
}
|
||||
err := mapErr(ctxErr)
|
||||
|
@ -739,3 +739,25 @@ func TestLookupNonLDH(t *testing.T) {
|
||||
t.Fatalf("lookup error = %v, want %v", err, errNoSuchHost)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLookupContextCancel(t *testing.T) {
|
||||
if runtime.GOOS == "nacl" {
|
||||
t.Skip("skip on NaCl")
|
||||
}
|
||||
|
||||
ctx, ctxCancel := context.WithCancel(context.Background())
|
||||
ctxCancel()
|
||||
|
||||
_, err := DefaultResolver.LookupIPAddr(ctx, "google.com")
|
||||
if err != errCanceled {
|
||||
testenv.SkipFlakyNet(t)
|
||||
t.Fatalf("unexpected error: %q", err)
|
||||
}
|
||||
|
||||
ctx = context.Background()
|
||||
|
||||
_, err = DefaultResolver.LookupIPAddr(ctx, "google.com")
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %q", err)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user