From f66b03bae9ba01574a4888352d14272b040a9002 Mon Sep 17 00:00:00 2001 From: Mateusz Poliwczak Date: Fri, 5 Aug 2022 14:45:43 +0200 Subject: [PATCH 1/7] 254 char FQDN fix --- src/net/dnsclient_unix.go | 3 +- src/net/dnsclient_unix_test.go | 67 ++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/src/net/dnsclient_unix.go b/src/net/dnsclient_unix.go index 088c81adee9277..4f879f931479c8 100644 --- a/src/net/dnsclient_unix.go +++ b/src/net/dnsclient_unix.go @@ -482,7 +482,7 @@ func (conf *dnsConfig) nameList(name string) []string { // Check name length (see isDomainName). l := len(name) rooted := l > 0 && name[l-1] == '.' - if l > 254 || l == 254 && rooted { + if l > 254 || l == 254 && !rooted { return nil } @@ -644,6 +644,7 @@ func (r *Resolver) goLookupIPCNAMEOrder(ctx context.Context, network, name strin return <-lane } } + var lastErr error for _, fqdn := range conf.nameList(name) { for _, qtype := range qtypes { diff --git a/src/net/dnsclient_unix_test.go b/src/net/dnsclient_unix_test.go index 415c53e1e7826c..07acfe194abd2b 100644 --- a/src/net/dnsclient_unix_test.go +++ b/src/net/dnsclient_unix_test.go @@ -2216,3 +2216,70 @@ func TestDNSPacketSize(t *testing.T) { t.Errorf("lookup failed: %v", err) } } + +func TestLongDnsNames(t *testing.T) { + const longDNSsuffix = ".go.dev." + const longDNSsuffixNoEndingDot = ".go.dev" + + var longDNSPrefix = strings.Repeat("verylongdomainlabel.", 20) + + var longDNSNamesTests = []struct { + req string + fail bool + }{ + {req: longDNSPrefix[:255-len(longDNSsuffix)] + longDNSsuffix, fail: true}, + {req: longDNSPrefix[:254-len(longDNSsuffix)] + longDNSsuffix}, + {req: longDNSPrefix[:253-len(longDNSsuffix)] + longDNSsuffix}, + + {req: longDNSPrefix[:253-len(longDNSsuffixNoEndingDot)] + longDNSsuffixNoEndingDot}, + {req: longDNSPrefix[:254-len(longDNSsuffixNoEndingDot)] + longDNSsuffixNoEndingDot, fail: true}, + } + + fake := fakeDNSServer{ + rh: func(_, _ string, q dnsmessage.Message, _ time.Time) (dnsmessage.Message, error) { + r := dnsmessage.Message{ + Header: dnsmessage.Header{ + ID: q.Header.ID, + Response: true, + RCode: dnsmessage.RCodeSuccess, + }, + Questions: q.Questions, + Answers: []dnsmessage.Resource{ + { + Header: dnsmessage.ResourceHeader{ + Name: q.Questions[0].Name, + Type: dnsmessage.TypeTXT, + Class: dnsmessage.ClassINET, + }, + Body: &dnsmessage.TXTResource{ + TXT: []string{"."}, + }, + }, + }, + } + + return r, nil + }, + } + + r := &Resolver{PreferGo: true, Dial: fake.DialContext} + for i, v := range longDNSNamesTests { + _, err := r.LookupTXT(context.Background(), v.req) + if v.fail { + if err == nil { + t.Errorf("%v: unexpected success", i) + break + } + + var dnsErr *DNSError + errors.As(err, &dnsErr) + if dnsErr == nil || dnsErr.Err != errNoSuchHost.Error() { + t.Errorf("%v: unexpected error: %v", i, err) + break + } + } + if !v.fail && err != nil { + t.Errorf("%v: unexpected error: %v", i, err) + } + } +} From 7be5dcd508df07f4f4f9b0ae6d8c4a6ce7669475 Mon Sep 17 00:00:00 2001 From: Mateusz Poliwczak Date: Fri, 5 Aug 2022 14:58:07 +0200 Subject: [PATCH 2/7] readability test fix --- src/net/dnsclient_unix_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/net/dnsclient_unix_test.go b/src/net/dnsclient_unix_test.go index 07acfe194abd2b..bc0b446e607d06 100644 --- a/src/net/dnsclient_unix_test.go +++ b/src/net/dnsclient_unix_test.go @@ -2275,10 +2275,10 @@ func TestLongDnsNames(t *testing.T) { errors.As(err, &dnsErr) if dnsErr == nil || dnsErr.Err != errNoSuchHost.Error() { t.Errorf("%v: unexpected error: %v", i, err) - break } + break } - if !v.fail && err != nil { + if err != nil { t.Errorf("%v: unexpected error: %v", i, err) } } From 42e70de2d8a0ef289ee6b14b03a2370a32d132b2 Mon Sep 17 00:00:00 2001 From: Mateusz Poliwczak Date: Fri, 5 Aug 2022 15:01:31 +0200 Subject: [PATCH 3/7] remove empty line, added by mistake --- src/net/dnsclient_unix.go | 1 - 1 file changed, 1 deletion(-) diff --git a/src/net/dnsclient_unix.go b/src/net/dnsclient_unix.go index 4f879f931479c8..cc0bf244eab34c 100644 --- a/src/net/dnsclient_unix.go +++ b/src/net/dnsclient_unix.go @@ -644,7 +644,6 @@ func (r *Resolver) goLookupIPCNAMEOrder(ctx context.Context, network, name strin return <-lane } } - var lastErr error for _, fqdn := range conf.nameList(name) { for _, qtype := range qtypes { From aebcd086f1df73bcb94427a523e9628ebae5cd78 Mon Sep 17 00:00:00 2001 From: Mateusz Poliwczak Date: Fri, 5 Aug 2022 15:09:32 +0200 Subject: [PATCH 4/7] update error check in test --- src/net/dnsclient_unix_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/net/dnsclient_unix_test.go b/src/net/dnsclient_unix_test.go index bc0b446e607d06..d2303c177f780c 100644 --- a/src/net/dnsclient_unix_test.go +++ b/src/net/dnsclient_unix_test.go @@ -2271,9 +2271,10 @@ func TestLongDnsNames(t *testing.T) { break } + expectedErr := DNSError{Err: errNoSuchHost.Error(), Name: v.req, IsNotFound: true} var dnsErr *DNSError errors.As(err, &dnsErr) - if dnsErr == nil || dnsErr.Err != errNoSuchHost.Error() { + if dnsErr == nil || *dnsErr != expectedErr { t.Errorf("%v: unexpected error: %v", i, err) } break From 19cc132d78f64fe14e7ddef4ebaa0e5d601c4e18 Mon Sep 17 00:00:00 2001 From: Mateusz Poliwczak Date: Fri, 5 Aug 2022 16:02:49 +0200 Subject: [PATCH 5/7] more lookup tests --- src/net/dnsclient_unix_test.go | 97 +++++++++++++++++++++++++++------- 1 file changed, 79 insertions(+), 18 deletions(-) diff --git a/src/net/dnsclient_unix_test.go b/src/net/dnsclient_unix_test.go index d2303c177f780c..3be3c9b3dc0490 100644 --- a/src/net/dnsclient_unix_test.go +++ b/src/net/dnsclient_unix_test.go @@ -2248,39 +2248,100 @@ func TestLongDnsNames(t *testing.T) { { Header: dnsmessage.ResourceHeader{ Name: q.Questions[0].Name, - Type: dnsmessage.TypeTXT, + Type: q.Questions[0].Type, Class: dnsmessage.ClassINET, }, - Body: &dnsmessage.TXTResource{ - TXT: []string{"."}, - }, }, }, } + switch q.Questions[0].Type { + case dnsmessage.TypeA: + r.Answers[0].Body = &dnsmessage.AResource{A: TestAddr} + case dnsmessage.TypeAAAA: + r.Answers[0].Body = &dnsmessage.AAAAResource{AAAA: TestAddr6} + case dnsmessage.TypeTXT: + r.Answers[0].Body = &dnsmessage.TXTResource{TXT: []string{"."}} + case dnsmessage.TypeMX: + r.Answers[0].Body = &dnsmessage.MXResource{ + MX: dnsmessage.MustNewName("go.dev."), + } + case dnsmessage.TypeNS: + r.Answers[0].Body = &dnsmessage.NSResource{ + NS: dnsmessage.MustNewName("go.dev."), + } + case dnsmessage.TypeSRV: + r.Answers[0].Body = &dnsmessage.SRVResource{ + Target: dnsmessage.MustNewName("go.dev."), + } + default: + panic("unknown dnsmessage type") + } + return r, nil }, } r := &Resolver{PreferGo: true, Dial: fake.DialContext} + + methodTests := []string{"CNAME", "Host", "IP", "IPAddr", "MX", "NS", "NetIP", "SRV", "TXT"} + query := func(t string, req string) error { + switch t { + case "CNAME": + _, err := r.LookupCNAME(context.Background(), req) + return err + case "Host": + _, err := r.LookupHost(context.Background(), req) + return err + case "IP": + _, err := r.LookupIP(context.Background(), "ip", req) + return err + case "IPAddr": + _, err := r.LookupIPAddr(context.Background(), req) + return err + case "MX": + _, err := r.LookupMX(context.Background(), req) + return err + case "NS": + _, err := r.LookupNS(context.Background(), req) + return err + case "NetIP": + _, err := r.LookupNetIP(context.Background(), "ip", req) + return err + case "SRV": + const service = "service" + const proto = "proto" + req = req[len(service)+len(proto)+4:] + _, _, err := r.LookupSRV(context.Background(), service, proto, req) + return err + case "TXT": + _, err := r.LookupTXT(context.Background(), req) + return err + } + panic("unknown query method") + } + for i, v := range longDNSNamesTests { - _, err := r.LookupTXT(context.Background(), v.req) - if v.fail { - if err == nil { - t.Errorf("%v: unexpected success", i) + for _, testName := range methodTests { + //_, err := r.LookupHost(context.Background(), v.req) + err := query(testName, v.req) + if v.fail { + if err == nil { + t.Errorf("%v: Lookup%v: unexpected success", i, testName) + break + } + + expectedErr := DNSError{Err: errNoSuchHost.Error(), Name: v.req, IsNotFound: true} + var dnsErr *DNSError + errors.As(err, &dnsErr) + if dnsErr == nil || *dnsErr != expectedErr { + t.Errorf("%v: Lookup%v: unexpected error: %v", i, testName, err) + } break } - - expectedErr := DNSError{Err: errNoSuchHost.Error(), Name: v.req, IsNotFound: true} - var dnsErr *DNSError - errors.As(err, &dnsErr) - if dnsErr == nil || *dnsErr != expectedErr { - t.Errorf("%v: unexpected error: %v", i, err) + if err != nil { + t.Errorf("%v: Lookup%v: unexpected error: %v", i, testName, err) } - break - } - if err != nil { - t.Errorf("%v: unexpected error: %v", i, err) } } } From 3866c1c9595347e32471d114e2b369349cf7cebf Mon Sep 17 00:00:00 2001 From: Mateusz Poliwczak Date: Fri, 5 Aug 2022 16:34:34 +0200 Subject: [PATCH 6/7] remove comment --- src/net/dnsclient_unix_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/src/net/dnsclient_unix_test.go b/src/net/dnsclient_unix_test.go index 3be3c9b3dc0490..83106c46d68ab2 100644 --- a/src/net/dnsclient_unix_test.go +++ b/src/net/dnsclient_unix_test.go @@ -2323,7 +2323,6 @@ func TestLongDnsNames(t *testing.T) { for i, v := range longDNSNamesTests { for _, testName := range methodTests { - //_, err := r.LookupHost(context.Background(), v.req) err := query(testName, v.req) if v.fail { if err == nil { From ad1337450caeaab80755d2951dd01422a906eacc Mon Sep 17 00:00:00 2001 From: Mateusz Poliwczak Date: Sat, 6 Aug 2022 07:37:46 +0200 Subject: [PATCH 7/7] capitalize DNS in test name --- src/net/dnsclient_unix_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/net/dnsclient_unix_test.go b/src/net/dnsclient_unix_test.go index 83106c46d68ab2..17798e434b146f 100644 --- a/src/net/dnsclient_unix_test.go +++ b/src/net/dnsclient_unix_test.go @@ -2217,7 +2217,7 @@ func TestDNSPacketSize(t *testing.T) { } } -func TestLongDnsNames(t *testing.T) { +func TestLongDNSNames(t *testing.T) { const longDNSsuffix = ".go.dev." const longDNSsuffixNoEndingDot = ".go.dev"