Skip to content

Commit a6df1ce

Browse files
mwwatersbradfitz
authored andcommitted
net: concatenate multiple TXT strings in single TXT record
When go resolver was changed to use dnsmessage.Parser, LookupTXT returned two strings in one record as two different records. This change reverts back to concatenating multiple strings in a single TXT record. Fixes #27763 Change-Id: Ice226fcb2be4be58853de34ed35b4627acb429ea Reviewed-on: https://go-review.googlesource.com/136955 Reviewed-by: Ian Gudger <[email protected]> Reviewed-by: Brad Fitzpatrick <[email protected]> Run-TryBot: Ian Gudger <[email protected]> TryBot-Result: Gobot Gobot <[email protected]>
1 parent 31d19c0 commit a6df1ce

File tree

2 files changed

+66
-3
lines changed

2 files changed

+66
-3
lines changed

src/net/dnsclient_unix_test.go

+53
Original file line numberDiff line numberDiff line change
@@ -1568,3 +1568,56 @@ func TestDNSDialTCP(t *testing.T) {
15681568
t.Fatal("exhange failed:", err)
15691569
}
15701570
}
1571+
1572+
// Issue 27763: verify that two strings in one TXT record are concatenated.
1573+
func TestTXTRecordTwoStrings(t *testing.T) {
1574+
fake := fakeDNSServer{
1575+
rh: func(n, _ string, q dnsmessage.Message, _ time.Time) (dnsmessage.Message, error) {
1576+
r := dnsmessage.Message{
1577+
Header: dnsmessage.Header{
1578+
ID: q.Header.ID,
1579+
Response: true,
1580+
RCode: dnsmessage.RCodeSuccess,
1581+
},
1582+
Questions: q.Questions,
1583+
Answers: []dnsmessage.Resource{
1584+
{
1585+
Header: dnsmessage.ResourceHeader{
1586+
Name: q.Questions[0].Name,
1587+
Type: dnsmessage.TypeA,
1588+
Class: dnsmessage.ClassINET,
1589+
},
1590+
Body: &dnsmessage.TXTResource{
1591+
TXT: []string{"string1 ", "string2"},
1592+
},
1593+
},
1594+
{
1595+
Header: dnsmessage.ResourceHeader{
1596+
Name: q.Questions[0].Name,
1597+
Type: dnsmessage.TypeA,
1598+
Class: dnsmessage.ClassINET,
1599+
},
1600+
Body: &dnsmessage.TXTResource{
1601+
TXT: []string{"onestring"},
1602+
},
1603+
},
1604+
},
1605+
}
1606+
return r, nil
1607+
},
1608+
}
1609+
r := Resolver{PreferGo: true, Dial: fake.DialContext}
1610+
txt, err := r.lookupTXT(context.Background(), "golang.org")
1611+
if err != nil {
1612+
t.Fatal("LookupTXT failed:", err)
1613+
}
1614+
if want := 2; len(txt) != want {
1615+
t.Fatalf("len(txt), got %d, want %d", len(txt), want)
1616+
}
1617+
if want := "string1 string2"; txt[0] != want {
1618+
t.Errorf("txt[0], got %q, want %q", txt[0], want)
1619+
}
1620+
if want := "onestring"; txt[1] != want {
1621+
t.Errorf("txt[1], got %q, want %q", txt[1], want)
1622+
}
1623+
}

src/net/lookup_unix.go

+13-3
Original file line numberDiff line numberDiff line change
@@ -300,11 +300,21 @@ func (r *Resolver) lookupTXT(ctx context.Context, name string) ([]string, error)
300300
Server: server,
301301
}
302302
}
303+
// Multiple strings in one TXT record need to be
304+
// concatenated without separator to be consistent
305+
// with previous Go resolver.
306+
n := 0
307+
for _, s := range txt.TXT {
308+
n += len(s)
309+
}
310+
txtJoin := make([]byte, 0, n)
311+
for _, s := range txt.TXT {
312+
txtJoin = append(txtJoin, s...)
313+
}
303314
if len(txts) == 0 {
304-
txts = txt.TXT
305-
} else {
306-
txts = append(txts, txt.TXT...)
315+
txts = make([]string, 0, 1)
307316
}
317+
txts = append(txts, string(txtJoin))
308318
}
309319
return txts, nil
310320
}

0 commit comments

Comments
 (0)