Skip to content

Commit 03761ed

Browse files
net: don't reject null mx records
Bypass hostname validity checking when a null mx record is returned as, defined in RFC 7505. Updates #46979 Change-Id: Ibe683bd6b47333a8ff30909fb2680ec8e10696ef Reviewed-on: https://go-review.googlesource.com/c/go/+/332094 Trust: Roland Shoemaker <[email protected]> Trust: Katie Hockman <[email protected]> Run-TryBot: Roland Shoemaker <[email protected]> TryBot-Result: Go Bot <[email protected]> Reviewed-by: Katie Hockman <[email protected]>
1 parent 877688c commit 03761ed

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

src/net/dnsclient_unix_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1957,3 +1957,43 @@ func TestCVE202133195(t *testing.T) {
19571957
t.Errorf("LookupAddr returned unexpected error, got %q, want %q", err, expected)
19581958
}
19591959
}
1960+
1961+
func TestNullMX(t *testing.T) {
1962+
fake := fakeDNSServer{
1963+
rh: func(n, _ string, q dnsmessage.Message, _ time.Time) (dnsmessage.Message, error) {
1964+
r := dnsmessage.Message{
1965+
Header: dnsmessage.Header{
1966+
ID: q.Header.ID,
1967+
Response: true,
1968+
RCode: dnsmessage.RCodeSuccess,
1969+
},
1970+
Questions: q.Questions,
1971+
Answers: []dnsmessage.Resource{
1972+
{
1973+
Header: dnsmessage.ResourceHeader{
1974+
Name: q.Questions[0].Name,
1975+
Type: dnsmessage.TypeMX,
1976+
Class: dnsmessage.ClassINET,
1977+
},
1978+
Body: &dnsmessage.MXResource{
1979+
MX: dnsmessage.MustNewName("."),
1980+
},
1981+
},
1982+
},
1983+
}
1984+
return r, nil
1985+
},
1986+
}
1987+
r := Resolver{PreferGo: true, Dial: fake.DialContext}
1988+
rrset, err := r.LookupMX(context.Background(), "golang.org")
1989+
if err != nil {
1990+
t.Fatalf("LookupMX: %v", err)
1991+
}
1992+
if want := []*MX{&MX{Host: "."}}; !reflect.DeepEqual(rrset, want) {
1993+
records := []string{}
1994+
for _, rr := range rrset {
1995+
records = append(records, fmt.Sprintf("%v", rr))
1996+
}
1997+
t.Errorf("records = [%v]; want [%v]", strings.Join(records, " "), want[0])
1998+
}
1999+
}

src/net/lookup.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,9 @@ func (r *Resolver) LookupMX(ctx context.Context, name string) ([]*MX, error) {
500500
if mx == nil {
501501
continue
502502
}
503-
if !isDomainName(mx.Host) {
503+
// Bypass the hostname validity check for targets which contain only a dot,
504+
// as this is used to represent a 'Null' MX record.
505+
if mx.Host != "." && !isDomainName(mx.Host) {
504506
return nil, &DNSError{Err: "MX target is invalid", Name: name}
505507
}
506508
}

0 commit comments

Comments
 (0)