|
|
@@ -91,6 +91,7 @@ var (
|
|
|
errTooManyAdditionals = errors.New("too many Additionals to pack (>65535)")
|
|
|
errNonCanonicalName = errors.New("name is not in canonical format (it must end with a .)")
|
|
|
errStringTooLong = errors.New("character string exceeds maximum length (255)")
|
|
|
+ errCompressedSRV = errors.New("compressed name in SRV resource data")
|
|
|
)
|
|
|
|
|
|
// Internal constants.
|
|
|
@@ -1610,6 +1611,10 @@ func (n *Name) pack(msg []byte, compression map[string]int, compressionOff int)
|
|
|
|
|
|
// unpack unpacks a domain name.
|
|
|
func (n *Name) unpack(msg []byte, off int) (int, error) {
|
|
|
+ return n.unpackCompressed(msg, off, true /* allowCompression */)
|
|
|
+}
|
|
|
+
|
|
|
+func (n *Name) unpackCompressed(msg []byte, off int, allowCompression bool) (int, error) {
|
|
|
// currOff is the current working offset.
|
|
|
currOff := off
|
|
|
|
|
|
@@ -1645,6 +1650,9 @@ Loop:
|
|
|
name = append(name, '.')
|
|
|
currOff = endOff
|
|
|
case 0xC0: // Pointer
|
|
|
+ if !allowCompression {
|
|
|
+ return off, errCompressedSRV
|
|
|
+ }
|
|
|
if currOff >= len(msg) {
|
|
|
return off, errInvalidPtr
|
|
|
}
|
|
|
@@ -2044,7 +2052,7 @@ func unpackSRVResource(msg []byte, off int) (SRVResource, error) {
|
|
|
return SRVResource{}, &nestedError{"Port", err}
|
|
|
}
|
|
|
var target Name
|
|
|
- if _, err := target.unpack(msg, off); err != nil {
|
|
|
+ if _, err := target.unpackCompressed(msg, off, false /* allowCompression */); err != nil {
|
|
|
return SRVResource{}, &nestedError{"Target", err}
|
|
|
}
|
|
|
return SRVResource{priority, weight, port, target}, nil
|