From b6cf58d5b82898a2c92d50aead07163d5bc3c184 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 22 Nov 2017 16:15:11 -0500 Subject: [PATCH] net: fix LookupTXT of long records on Windows The response to a TXT lookup is a sequence of RRs, each of which contains a sequence of string fragments. The correct handling of the response is to do: for each rr { list = append(list, strings.Join(rr.fragments, "")) } (like in at dnsRR_TXT.Walk, used on most platforms). The Windows code incorrectly does: for each rr { list = append(list, rr.fragments...) } This CL fixes it to concatenate fragments, as it must. Fixes #21472. Change-Id: I78cce96f172e5e90da9a212b0343457f6d5f92e8 Reviewed-on: https://go-review.googlesource.com/79555 Run-TryBot: Russ Cox Reviewed-by: Ian Lance Taylor TryBot-Result: Gobot Gobot --- src/net/lookup_test.go | 21 +++++++++++++++++++++ src/net/lookup_windows.go | 5 +++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/net/lookup_test.go b/src/net/lookup_test.go index 68a7abe95d..4a9f6c664d 100644 --- a/src/net/lookup_test.go +++ b/src/net/lookup_test.go @@ -9,7 +9,9 @@ import ( "context" "fmt" "internal/testenv" + "reflect" "runtime" + "sort" "strings" "testing" "time" @@ -303,6 +305,25 @@ func TestLookupGoogleHost(t *testing.T) { } } +func TestLookupLongTXT(t *testing.T) { + if testenv.Builder() == "" { + testenv.MustHaveExternalNetwork(t) + } + + txts, err := LookupTXT("golang.rsc.io") + if err != nil { + t.Fatal(err) + } + sort.Strings(txts) + want := []string{ + strings.Repeat("abcdefghijklmnopqrstuvwxyABCDEFGHJIKLMNOPQRSTUVWXY", 10), + "gophers rule", + } + if !reflect.DeepEqual(txts, want) { + t.Fatalf("LookupTXT golang.rsc.io incorrect\nhave %q\nwant %q", txts, want) + } +} + var lookupGoogleIPTests = []struct { name string }{ diff --git a/src/net/lookup_windows.go b/src/net/lookup_windows.go index 0036d89d15..ac1f9b431a 100644 --- a/src/net/lookup_windows.go +++ b/src/net/lookup_windows.go @@ -279,10 +279,11 @@ func (*Resolver) lookupTXT(ctx context.Context, name string) ([]string, error) { txts := make([]string, 0, 10) for _, p := range validRecs(r, syscall.DNS_TYPE_TEXT, name) { d := (*syscall.DNSTXTData)(unsafe.Pointer(&p.Data[0])) + s := "" for _, v := range (*[1 << 10]*uint16)(unsafe.Pointer(&(d.StringArray[0])))[:d.StringCount] { - s := syscall.UTF16ToString((*[1 << 20]uint16)(unsafe.Pointer(v))[:]) - txts = append(txts, s) + s += syscall.UTF16ToString((*[1 << 20]uint16)(unsafe.Pointer(v))[:]) } + txts = append(txts, s) } return txts, nil } -- 2.50.0