@@ -295,11 +295,12 @@ func writeDomain(buffer *bytes.Buffer, domain string) error {
295295 return nil
296296}
297297
298- func readDomain (data []byte , buffer * bytes.Buffer ) (string , error ) {
298+ func readDomain (data []byte , buffer * bytes.Buffer , exitEarlyOnError bool ) (string , error ) {
299299 currentBuffer := buffer
300300 parts := make ([]string , 0 )
301301 visitedOffsets := make (map [uint16 ]struct {})
302302
303+ containsIllegalCharacters := false
303304 pointerJustVisited := false
304305 totalLength := 0
305306 for {
@@ -360,7 +361,11 @@ func readDomain(data []byte, buffer *bytes.Buffer) (string, error) {
360361
361362 label := string (section )
362363 if ! labelRegex .MatchString (label ) {
363- return "" , fmt .Errorf ("illegal characters in label" )
364+ containsIllegalCharacters = true
365+
366+ if exitEarlyOnError {
367+ return "" , fmt .Errorf ("illegal characters in label" )
368+ }
364369 }
365370
366371 parts = append (parts , label )
@@ -376,6 +381,10 @@ func readDomain(data []byte, buffer *bytes.Buffer) (string, error) {
376381 name = strings .Join (parts , "." )
377382 }
378383
384+ if containsIllegalCharacters {
385+ return "" , FormatError {Domain : name }
386+ }
387+
379388 return name , nil
380389}
381390
@@ -544,7 +553,7 @@ func readClass(buffer *bytes.Buffer) (ClassType, error) {
544553}
545554
546555func readEDNS (data []byte , buffer * bytes.Buffer ) (uint16 , error ) {
547- name , err := readDomain (data , buffer )
556+ name , err := readDomain (data , buffer , true )
548557 if err != nil {
549558 return 0 , err
550559 }
@@ -575,6 +584,11 @@ func readEDNS(data []byte, buffer *bytes.Buffer) (uint16, error) {
575584 return 0 , err
576585 }
577586
587+ version := (extendedRCODEAndFlags >> 16 ) & 0xFF
588+ if version != 0 {
589+ return 0 , fmt .Errorf ("EDNS version must be 0" )
590+ }
591+
578592 // According to RFC 6891 section 6.1.2 any option codes not understood must be ignored.
579593 // None are currently implemented.
580594 _ , err = readArray16 (buffer )
0 commit comments