Skip to content

Commit 9e4638a

Browse files
mateusz834neild
authored andcommitted
net: discard unrooted 254 byte names, not rooted ones
Fixes #54285 Change-Id: I20d4d6b9d0532d8a344582b99d446352ae94edcf GitHub-Last-Rev: ad13374 GitHub-Pull-Request: #54293 Reviewed-on: https://go-review.googlesource.com/c/go/+/421674 TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Damien Neil <[email protected]> Run-TryBot: Damien Neil <[email protected]> Reviewed-by: Than McIntosh <[email protected]>
1 parent a526ec1 commit 9e4638a

File tree

2 files changed

+129
-1
lines changed

2 files changed

+129
-1
lines changed

src/net/dnsclient_unix.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,7 @@ func (conf *dnsConfig) nameList(name string) []string {
482482
// Check name length (see isDomainName).
483483
l := len(name)
484484
rooted := l > 0 && name[l-1] == '.'
485-
if l > 254 || l == 254 && rooted {
485+
if l > 254 || l == 254 && !rooted {
486486
return nil
487487
}
488488

src/net/dnsclient_unix_test.go

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2216,3 +2216,131 @@ func TestDNSPacketSize(t *testing.T) {
22162216
t.Errorf("lookup failed: %v", err)
22172217
}
22182218
}
2219+
2220+
func TestLongDNSNames(t *testing.T) {
2221+
const longDNSsuffix = ".go.dev."
2222+
const longDNSsuffixNoEndingDot = ".go.dev"
2223+
2224+
var longDNSPrefix = strings.Repeat("verylongdomainlabel.", 20)
2225+
2226+
var longDNSNamesTests = []struct {
2227+
req string
2228+
fail bool
2229+
}{
2230+
{req: longDNSPrefix[:255-len(longDNSsuffix)] + longDNSsuffix, fail: true},
2231+
{req: longDNSPrefix[:254-len(longDNSsuffix)] + longDNSsuffix},
2232+
{req: longDNSPrefix[:253-len(longDNSsuffix)] + longDNSsuffix},
2233+
2234+
{req: longDNSPrefix[:253-len(longDNSsuffixNoEndingDot)] + longDNSsuffixNoEndingDot},
2235+
{req: longDNSPrefix[:254-len(longDNSsuffixNoEndingDot)] + longDNSsuffixNoEndingDot, fail: true},
2236+
}
2237+
2238+
fake := fakeDNSServer{
2239+
rh: func(_, _ string, q dnsmessage.Message, _ time.Time) (dnsmessage.Message, error) {
2240+
r := dnsmessage.Message{
2241+
Header: dnsmessage.Header{
2242+
ID: q.Header.ID,
2243+
Response: true,
2244+
RCode: dnsmessage.RCodeSuccess,
2245+
},
2246+
Questions: q.Questions,
2247+
Answers: []dnsmessage.Resource{
2248+
{
2249+
Header: dnsmessage.ResourceHeader{
2250+
Name: q.Questions[0].Name,
2251+
Type: q.Questions[0].Type,
2252+
Class: dnsmessage.ClassINET,
2253+
},
2254+
},
2255+
},
2256+
}
2257+
2258+
switch q.Questions[0].Type {
2259+
case dnsmessage.TypeA:
2260+
r.Answers[0].Body = &dnsmessage.AResource{A: TestAddr}
2261+
case dnsmessage.TypeAAAA:
2262+
r.Answers[0].Body = &dnsmessage.AAAAResource{AAAA: TestAddr6}
2263+
case dnsmessage.TypeTXT:
2264+
r.Answers[0].Body = &dnsmessage.TXTResource{TXT: []string{"."}}
2265+
case dnsmessage.TypeMX:
2266+
r.Answers[0].Body = &dnsmessage.MXResource{
2267+
MX: dnsmessage.MustNewName("go.dev."),
2268+
}
2269+
case dnsmessage.TypeNS:
2270+
r.Answers[0].Body = &dnsmessage.NSResource{
2271+
NS: dnsmessage.MustNewName("go.dev."),
2272+
}
2273+
case dnsmessage.TypeSRV:
2274+
r.Answers[0].Body = &dnsmessage.SRVResource{
2275+
Target: dnsmessage.MustNewName("go.dev."),
2276+
}
2277+
default:
2278+
panic("unknown dnsmessage type")
2279+
}
2280+
2281+
return r, nil
2282+
},
2283+
}
2284+
2285+
r := &Resolver{PreferGo: true, Dial: fake.DialContext}
2286+
2287+
methodTests := []string{"CNAME", "Host", "IP", "IPAddr", "MX", "NS", "NetIP", "SRV", "TXT"}
2288+
query := func(t string, req string) error {
2289+
switch t {
2290+
case "CNAME":
2291+
_, err := r.LookupCNAME(context.Background(), req)
2292+
return err
2293+
case "Host":
2294+
_, err := r.LookupHost(context.Background(), req)
2295+
return err
2296+
case "IP":
2297+
_, err := r.LookupIP(context.Background(), "ip", req)
2298+
return err
2299+
case "IPAddr":
2300+
_, err := r.LookupIPAddr(context.Background(), req)
2301+
return err
2302+
case "MX":
2303+
_, err := r.LookupMX(context.Background(), req)
2304+
return err
2305+
case "NS":
2306+
_, err := r.LookupNS(context.Background(), req)
2307+
return err
2308+
case "NetIP":
2309+
_, err := r.LookupNetIP(context.Background(), "ip", req)
2310+
return err
2311+
case "SRV":
2312+
const service = "service"
2313+
const proto = "proto"
2314+
req = req[len(service)+len(proto)+4:]
2315+
_, _, err := r.LookupSRV(context.Background(), service, proto, req)
2316+
return err
2317+
case "TXT":
2318+
_, err := r.LookupTXT(context.Background(), req)
2319+
return err
2320+
}
2321+
panic("unknown query method")
2322+
}
2323+
2324+
for i, v := range longDNSNamesTests {
2325+
for _, testName := range methodTests {
2326+
err := query(testName, v.req)
2327+
if v.fail {
2328+
if err == nil {
2329+
t.Errorf("%v: Lookup%v: unexpected success", i, testName)
2330+
break
2331+
}
2332+
2333+
expectedErr := DNSError{Err: errNoSuchHost.Error(), Name: v.req, IsNotFound: true}
2334+
var dnsErr *DNSError
2335+
errors.As(err, &dnsErr)
2336+
if dnsErr == nil || *dnsErr != expectedErr {
2337+
t.Errorf("%v: Lookup%v: unexpected error: %v", i, testName, err)
2338+
}
2339+
break
2340+
}
2341+
if err != nil {
2342+
t.Errorf("%v: Lookup%v: unexpected error: %v", i, testName, err)
2343+
}
2344+
}
2345+
}
2346+
}

0 commit comments

Comments
 (0)