diff options
-rw-r--r-- | middleware/file/file.go | 6 | ||||
-rw-r--r-- | middleware/file/file_test.go | 19 |
2 files changed, 24 insertions, 1 deletions
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 +` |