diff --git a/plugin/file/file.go b/plugin/file/file.go index a6f5e68ac..468b80a98 100644 --- a/plugin/file/file.go +++ b/plugin/file/file.go @@ -136,10 +136,6 @@ func Parse(f io.Reader, origin, fileName string, serial int64) (*Zone, error) { z := NewZone(origin, fileName) seenSOA := false for rr, ok := zp.Next(); ok; rr, ok = zp.Next() { - if err := zp.Err(); err != nil { - return nil, err - } - if !seenSOA { if s, ok := rr.(*dns.SOA); ok { seenSOA = true @@ -163,5 +159,9 @@ func Parse(f io.Reader, origin, fileName string, serial int64) (*Zone, error) { return nil, fmt.Errorf("failed to parse file %q for origin %s with error %v", fileName, origin, zp.Err()) } + if err := zp.Err(); err != nil { + return nil, err + } + return z, nil } diff --git a/plugin/file/file_test.go b/plugin/file/file_test.go index 0e4050e38..ee4048e5c 100644 --- a/plugin/file/file_test.go +++ b/plugin/file/file_test.go @@ -29,3 +29,31 @@ www IN A 192.168.0.14 mail IN A 192.168.0.15 imap IN CNAME mail ` + +func TestParseSyntaxError(t *testing.T) { + _, err := Parse(strings.NewReader(dbSyntaxError), "example.org.", "stdin", 0) + if err == nil { + t.Fatalf("Zone %q should have failed to load", "example.org.") + } + if !strings.Contains(err.Error(), "\"invalid\"") { + t.Fatalf("Zone %q should have failed with syntax error: %s", "example.org.", err) + } +} + +const dbSyntaxError = ` +$TTL 1M +$ORIGIN example.org. + +@ IN SOA ns1.example.com. admin.example.com. ( + 2005011437 ; Serial + 1200 ; Refresh + 144 ; Retry + 1814400 ; Expire + 2h ) ; Minimum +@ IN NS ns1.example.com. + +# invalid comment +www IN A 192.168.0.14 +mail IN A 192.168.0.15 +imap IN CNAME mail +` diff --git a/plugin/sign/file.go b/plugin/sign/file.go index 194ab69ae..ad3f18e7e 100644 --- a/plugin/sign/file.go +++ b/plugin/sign/file.go @@ -66,10 +66,6 @@ func Parse(f io.Reader, origin, fileName string) (*file.Zone, error) { seenSOA := false for rr, ok := zp.Next(); ok; rr, ok = zp.Next() { - if err := zp.Err(); err != nil { - return nil, err - } - switch rr.(type) { case *dns.DNSKEY, *dns.RRSIG, *dns.CDNSKEY, *dns.CDS: continue @@ -88,5 +84,9 @@ func Parse(f io.Reader, origin, fileName string) (*file.Zone, error) { return nil, fmt.Errorf("file %q has no SOA record", fileName) } + if err := zp.Err(); err != nil { + return nil, err + } + return z, nil } diff --git a/plugin/sign/signer.go b/plugin/sign/signer.go index 95ce94b52..9c4062c30 100644 --- a/plugin/sign/signer.go +++ b/plugin/sign/signer.go @@ -133,10 +133,6 @@ func resign(rd io.Reader, now time.Time) (why error) { i := 0 for rr, ok := zp.Next(); ok; rr, ok = zp.Next() { - if err := zp.Err(); err != nil { - return err - } - switch x := rr.(type) { case *dns.RRSIG: if x.TypeCovered != dns.TypeSOA { @@ -166,7 +162,7 @@ func resign(rd io.Reader, now time.Time) (why error) { } } - return nil + return zp.Err() } func signAndLog(s *Signer, why error) {