From 46bf7f31069137aee8a82bc4f8287ce60117652c Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Tue, 13 Jun 2017 12:51:52 -0700 Subject: [PATCH] middleware/file: consider no SOA a fatal error (#734) Don't load a zone with a SOA record, barf with 'no SOA record' error. --- middleware/file/file.go | 6 +++++- middleware/file/file_test.go | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/middleware/file/file.go b/middleware/file/file.go index 4df7427c1..8a4cd27e2 100644 --- a/middleware/file/file.go +++ b/middleware/file/file.go @@ -126,13 +126,17 @@ func Parse(f io.Reader, origin, fileName string, serial int64) (*Zone, error) { if s.Serial == uint32(serial) { // same zone return nil, fmt.Errorf("no change in serial: %d", serial) } + seenSOA = true } - seenSOA = true } if err := z.Insert(x.RR); err != nil { return nil, err } } + if !seenSOA { + return nil, fmt.Errorf("file %q has no SOA record", fileName) + } + return z, nil } diff --git a/middleware/file/file_test.go b/middleware/file/file_test.go index d5762683d..ae17624f9 100644 --- a/middleware/file/file_test.go +++ b/middleware/file/file_test.go @@ -10,3 +10,22 @@ func BenchmarkParseInsert(b *testing.B) { Parse(strings.NewReader(dbMiekENTNL), testzone, "stdin", 0) } } + +func TestParseNoSOA(t *testing.T) { + _, err := Parse(strings.NewReader(dbNoSOA), "example.org.", "stdin", 0) + if err == nil { + t.Fatalf("zone %q should have failed to load", "example.org.") + } + if !strings.Contains(err.Error(), "no SOA record") { + t.Fatalf("zone %q should have failed to load with no soa error: %s", "example.org.", err) + } +} + +const dbNoSOA = ` +$TTL 1M +$ORIGIN example.org. + +www IN A 192.168.0.14 +mail IN A 192.168.0.15 +imap IN CNAME mail +`