]> Cypherpunks repositories - gostls13.git/commitdiff
net: fix LookupTXT of long records on Windows
authorRuss Cox <rsc@golang.org>
Wed, 22 Nov 2017 21:15:11 +0000 (16:15 -0500)
committerRuss Cox <rsc@golang.org>
Thu, 23 Nov 2017 01:17:18 +0000 (01:17 +0000)
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 <rsc@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/net/lookup_test.go
src/net/lookup_windows.go

index 68a7abe95dfbf13124b25be9add619ab815fba02..4a9f6c664d04584a53495cc3d1776ddb73114714 100644 (file)
@@ -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
 }{
index 0036d89d150dc6910729e845d0c2a114ca49cd97..ac1f9b431accff7b0b4d4e84353f25aa2be264b4 100644 (file)
@@ -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
 }