Implement address truncation as specified in the draft
This commit is contained in:
parent
3517449bc9
commit
54519d1a4d
20
edns.go
20
edns.go
|
@ -119,13 +119,13 @@ func (rr *RR_OPT) SetDo() {
|
||||||
rr.Hdr.Ttl = uint32(b1)<<24 | uint32(b2)<<16 | uint32(b3)<<8 | uint32(b4)
|
rr.Hdr.Ttl = uint32(b1)<<24 | uint32(b2)<<16 | uint32(b3)<<8 | uint32(b4)
|
||||||
}
|
}
|
||||||
|
|
||||||
// EDNS0 defines a EDNS0 Option
|
// EDNS0 defines an EDNS0 Option.
|
||||||
type EDNS0 interface {
|
type EDNS0 interface {
|
||||||
// Option return the option code for the option.
|
// Option returns the option code for the option.
|
||||||
Option() uint16
|
Option() uint16
|
||||||
// Pack returns the bytes of the option data.
|
// Pack returns the bytes of the option data.
|
||||||
Pack() ([]byte, error)
|
Pack() ([]byte, error)
|
||||||
// Unpack sets the data as found in the packet. Is also sets
|
// Unpack sets the data as found in the buffer. Is also sets
|
||||||
// the length of the slice as the length of the option data.
|
// the length of the slice as the length of the option data.
|
||||||
Unpack([]byte)
|
Unpack([]byte)
|
||||||
// String returns the string representation of the option.
|
// String returns the string representation of the option.
|
||||||
|
@ -176,9 +176,11 @@ func (e *EDNS0_SUBNET) Pack() ([]byte, error) {
|
||||||
b[3] = e.SourceScope
|
b[3] = e.SourceScope
|
||||||
switch e.Family {
|
switch e.Family {
|
||||||
case 1:
|
case 1:
|
||||||
// just copy? TODO (also in msg.go...)
|
if e.SourceNetmask > net.IPv4len * 8 {
|
||||||
|
return nil, errors.New("bad netmask")
|
||||||
|
}
|
||||||
ip := make([]byte, net.IPv4len)
|
ip := make([]byte, net.IPv4len)
|
||||||
a := e.Address.To4()
|
a := e.Address.To4().Mask( net.CIDRMask(int(e.SourceNetmask), net.IPv4len * 8) )
|
||||||
for i := 0; i < net.IPv4len; i++ {
|
for i := 0; i < net.IPv4len; i++ {
|
||||||
if i+1 > len(e.Address) {
|
if i+1 > len(e.Address) {
|
||||||
break
|
break
|
||||||
|
@ -187,12 +189,16 @@ func (e *EDNS0_SUBNET) Pack() ([]byte, error) {
|
||||||
}
|
}
|
||||||
b = append(b, ip...)
|
b = append(b, ip...)
|
||||||
case 2:
|
case 2:
|
||||||
|
if e.SourceNetmask > net.IPv6len * 8 {
|
||||||
|
return nil, errors.New("bad netmask")
|
||||||
|
}
|
||||||
ip := make([]byte, net.IPv6len)
|
ip := make([]byte, net.IPv6len)
|
||||||
|
a := e.Address.Mask( net.CIDRMask(int(e.SourceNetmask), net.IPv6len * 8) )
|
||||||
for i := 0; i < net.IPv6len; i++ {
|
for i := 0; i < net.IPv6len; i++ {
|
||||||
if i+1 > len(e.Address) {
|
if i+1 > len(e.Address) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
ip[i] = e.Address[i]
|
ip[i] = a[i]
|
||||||
}
|
}
|
||||||
b = append(b, ip...)
|
b = append(b, ip...)
|
||||||
default:
|
default:
|
||||||
|
@ -202,7 +208,7 @@ func (e *EDNS0_SUBNET) Pack() ([]byte, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *EDNS0_SUBNET) Unpack(b []byte) {
|
func (e *EDNS0_SUBNET) Unpack(b []byte) {
|
||||||
// TODO: length of b
|
// TODO: length of b (overflow)
|
||||||
e.Family, _ = unpackUint16(b, 0)
|
e.Family, _ = unpackUint16(b, 0)
|
||||||
e.SourceNetmask = b[2]
|
e.SourceNetmask = b[2]
|
||||||
e.SourceScope = b[3]
|
e.SourceScope = b[3]
|
||||||
|
|
Loading…
Reference in New Issue