]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.15] net: don't reject null mx records
authorRoland Shoemaker <roland@golang.org>
Wed, 30 Jun 2021 21:28:18 +0000 (14:28 -0700)
committerRoland Shoemaker <roland@golang.org>
Thu, 8 Jul 2021 16:45:40 +0000 (16:45 +0000)
Bypass hostname validity checking when a null mx record is returned as,
defined in RFC 7505.

Updates #46979
Updates #47012

Change-Id: Ibe683bd6b47333a8ff30909fb2680ec8e10696ef
Reviewed-on: https://go-review.googlesource.com/c/go/+/332094
Trust: Roland Shoemaker <roland@golang.org>
Trust: Katie Hockman <katie@golang.org>
Run-TryBot: Roland Shoemaker <roland@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Katie Hockman <katie@golang.org>
(cherry picked from commit 03761ede028d811dd7d7cf8a2690d4bfa2771d85)
Reviewed-on: https://go-review.googlesource.com/c/go/+/332372
Run-TryBot: Katie Hockman <katie@golang.org>

src/net/dnsclient_unix_test.go
src/net/lookup.go

index f646629912a3d34d03c61d425ec1aa9aa7cee5b5..f0f6e577ad14c89d5426da2ca40dbda637634ee1 100644 (file)
@@ -1957,3 +1957,43 @@ func TestCVE202133195(t *testing.T) {
                t.Errorf("LookupAddr returned unexpected error, got %q, want %q", err, expected)
        }
 }
+
+func TestNullMX(t *testing.T) {
+       fake := fakeDNSServer{
+               rh: func(n, _ 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.TypeMX,
+                                                       Class: dnsmessage.ClassINET,
+                                               },
+                                               Body: &dnsmessage.MXResource{
+                                                       MX: dnsmessage.MustNewName("."),
+                                               },
+                                       },
+                               },
+                       }
+                       return r, nil
+               },
+       }
+       r := Resolver{PreferGo: true, Dial: fake.DialContext}
+       rrset, err := r.LookupMX(context.Background(), "golang.org")
+       if err != nil {
+               t.Fatalf("LookupMX: %v", err)
+       }
+       if want := []*MX{&MX{Host: "."}}; !reflect.DeepEqual(rrset, want) {
+               records := []string{}
+               for _, rr := range rrset {
+                       records = append(records, fmt.Sprintf("%v", rr))
+               }
+               t.Errorf("records = [%v]; want [%v]", strings.Join(records, " "), want[0])
+       }
+}
index 0660268249bc765186a4443273bd111266e8a280..01c81dbaaf58fb64f28d0d35c435725ceadbc6a9 100644 (file)
@@ -488,7 +488,9 @@ func (r *Resolver) LookupMX(ctx context.Context, name string) ([]*MX, error) {
                if mx == nil {
                        continue
                }
-               if !isDomainName(mx.Host) {
+               // Bypass the hostname validity check for targets which contain only a dot,
+               // as this is used to represent a 'Null' MX record.
+               if mx.Host != "." && !isDomainName(mx.Host) {
                        return nil, &DNSError{Err: "MX target is invalid", Name: name}
                }
        }