mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-30 17:53:21 -04:00 
			
		
		
		
	Fix zone parser error handling (#6680)
Signed-off-by: Nathan Currier <nathan.currier@broadcom.com>
This commit is contained in:
		| @@ -136,10 +136,6 @@ func Parse(f io.Reader, origin, fileName string, serial int64) (*Zone, error) { | |||||||
| 	z := NewZone(origin, fileName) | 	z := NewZone(origin, fileName) | ||||||
| 	seenSOA := false | 	seenSOA := false | ||||||
| 	for rr, ok := zp.Next(); ok; rr, ok = zp.Next() { | 	for rr, ok := zp.Next(); ok; rr, ok = zp.Next() { | ||||||
| 		if err := zp.Err(); err != nil { |  | ||||||
| 			return nil, err |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if !seenSOA { | 		if !seenSOA { | ||||||
| 			if s, ok := rr.(*dns.SOA); ok { | 			if s, ok := rr.(*dns.SOA); ok { | ||||||
| 				seenSOA = true | 				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()) | 		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 | 	return z, nil | ||||||
| } | } | ||||||
|   | |||||||
| @@ -29,3 +29,31 @@ www          IN  A      192.168.0.14 | |||||||
| mail         IN  A      192.168.0.15 | mail         IN  A      192.168.0.15 | ||||||
| imap         IN  CNAME  mail | 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 | ||||||
|  | ` | ||||||
|   | |||||||
| @@ -66,10 +66,6 @@ func Parse(f io.Reader, origin, fileName string) (*file.Zone, error) { | |||||||
| 	seenSOA := false | 	seenSOA := false | ||||||
|  |  | ||||||
| 	for rr, ok := zp.Next(); ok; rr, ok = zp.Next() { | 	for rr, ok := zp.Next(); ok; rr, ok = zp.Next() { | ||||||
| 		if err := zp.Err(); err != nil { |  | ||||||
| 			return nil, err |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		switch rr.(type) { | 		switch rr.(type) { | ||||||
| 		case *dns.DNSKEY, *dns.RRSIG, *dns.CDNSKEY, *dns.CDS: | 		case *dns.DNSKEY, *dns.RRSIG, *dns.CDNSKEY, *dns.CDS: | ||||||
| 			continue | 			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) | 		return nil, fmt.Errorf("file %q has no SOA record", fileName) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if err := zp.Err(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return z, nil | 	return z, nil | ||||||
| } | } | ||||||
|   | |||||||
| @@ -133,10 +133,6 @@ func resign(rd io.Reader, now time.Time) (why error) { | |||||||
| 	i := 0 | 	i := 0 | ||||||
|  |  | ||||||
| 	for rr, ok := zp.Next(); ok; rr, ok = zp.Next() { | 	for rr, ok := zp.Next(); ok; rr, ok = zp.Next() { | ||||||
| 		if err := zp.Err(); err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		switch x := rr.(type) { | 		switch x := rr.(type) { | ||||||
| 		case *dns.RRSIG: | 		case *dns.RRSIG: | ||||||
| 			if x.TypeCovered != dns.TypeSOA { | 			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) { | func signAndLog(s *Signer, why error) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user