diff --git a/dns/dnsmessage/message.go b/dns/dnsmessage/message.go index b3cadf22..3826c627 100644 --- a/dns/dnsmessage/message.go +++ b/dns/dnsmessage/message.go @@ -280,6 +280,9 @@ type ResourceBody interface { } func (r *Resource) pack(msg []byte, compression map[string]int) ([]byte, error) { + if r.Body == nil { + return msg, &nestedError{"Resource", errors.New("nil resource body")} + } oldMsg := msg r.Header.Type = r.Body.realType() msg, length, err := r.Header.pack(msg, compression) diff --git a/dns/dnsmessage/message_test.go b/dns/dnsmessage/message_test.go index bf826bee..2b2c8f1b 100644 --- a/dns/dnsmessage/message_test.go +++ b/dns/dnsmessage/message_test.go @@ -534,6 +534,45 @@ func TestBuilder(t *testing.T) { } } +func TestResourcePack(t *testing.T) { + for _, m := range []Message{ + { + Questions: []Question{ + { + Name: mustNewName("."), + Type: TypeAAAA, + Class: ClassINET, + }, + }, + Answers: []Resource{{ResourceHeader{}, nil}}, + }, + { + Questions: []Question{ + { + Name: mustNewName("."), + Type: TypeAAAA, + Class: ClassINET, + }, + }, + Authorities: []Resource{{ResourceHeader{}, (*NSResource)(nil)}}, + }, + { + Questions: []Question{ + { + Name: mustNewName("."), + Type: TypeA, + Class: ClassINET, + }, + }, + Additionals: []Resource{{ResourceHeader{}, nil}}, + }, + } { + if _, err := m.Pack(); err == nil { + t.Errorf("should fail: %v", m) + } + } +} + func BenchmarkParsing(b *testing.B) { b.ReportAllocs()