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>
"context"
"fmt"
"internal/testenv"
+ "reflect"
"runtime"
+ "sort"
"strings"
"testing"
"time"
}
}
+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
}{
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
}