Use copy instead of loop in EDNS0_SUBNET.unpack (#825)
This commit is contained in:
parent
8eab0120c4
commit
11fb61cb84
18
edns.go
18
edns.go
|
@ -273,22 +273,16 @@ func (e *EDNS0_SUBNET) unpack(b []byte) error {
|
||||||
if e.SourceNetmask > net.IPv4len*8 || e.SourceScope > net.IPv4len*8 {
|
if e.SourceNetmask > net.IPv4len*8 || e.SourceScope > net.IPv4len*8 {
|
||||||
return errors.New("dns: bad netmask")
|
return errors.New("dns: bad netmask")
|
||||||
}
|
}
|
||||||
addr := make([]byte, net.IPv4len)
|
addr := make(net.IP, net.IPv4len)
|
||||||
for i := 0; i < net.IPv4len && 4+i < len(b); i++ {
|
copy(addr, b[4:])
|
||||||
addr[i] = b[4+i]
|
e.Address = addr.To16()
|
||||||
}
|
|
||||||
e.Address = net.IPv4(addr[0], addr[1], addr[2], addr[3])
|
|
||||||
case 2:
|
case 2:
|
||||||
if e.SourceNetmask > net.IPv6len*8 || e.SourceScope > net.IPv6len*8 {
|
if e.SourceNetmask > net.IPv6len*8 || e.SourceScope > net.IPv6len*8 {
|
||||||
return errors.New("dns: bad netmask")
|
return errors.New("dns: bad netmask")
|
||||||
}
|
}
|
||||||
addr := make([]byte, net.IPv6len)
|
addr := make(net.IP, net.IPv6len)
|
||||||
for i := 0; i < net.IPv6len && 4+i < len(b); i++ {
|
copy(addr, b[4:])
|
||||||
addr[i] = b[4+i]
|
e.Address = addr
|
||||||
}
|
|
||||||
e.Address = net.IP{addr[0], addr[1], addr[2], addr[3], addr[4],
|
|
||||||
addr[5], addr[6], addr[7], addr[8], addr[9], addr[10],
|
|
||||||
addr[11], addr[12], addr[13], addr[14], addr[15]}
|
|
||||||
default:
|
default:
|
||||||
return errors.New("dns: bad address family")
|
return errors.New("dns: bad address family")
|
||||||
}
|
}
|
||||||
|
|
42
edns_test.go
42
edns_test.go
|
@ -1,6 +1,9 @@
|
||||||
package dns
|
package dns
|
||||||
|
|
||||||
import "testing"
|
import (
|
||||||
|
"net"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
func TestOPTTtl(t *testing.T) {
|
func TestOPTTtl(t *testing.T) {
|
||||||
e := &OPT{}
|
e := &OPT{}
|
||||||
|
@ -63,8 +66,8 @@ func TestOPTTtl(t *testing.T) {
|
||||||
|
|
||||||
e.SetExtendedRcode(42)
|
e.SetExtendedRcode(42)
|
||||||
// ExtendedRcode has the last 4 bits set to 0.
|
// ExtendedRcode has the last 4 bits set to 0.
|
||||||
if e.ExtendedRcode() != 42 & 0xFFFFFFF0 {
|
if e.ExtendedRcode() != 42&0xFFFFFFF0 {
|
||||||
t.Errorf("set 42, expected %d, got %d", 42 & 0xFFFFFFF0, e.ExtendedRcode())
|
t.Errorf("set 42, expected %d, got %d", 42&0xFFFFFFF0, e.ExtendedRcode())
|
||||||
}
|
}
|
||||||
|
|
||||||
// This will reset the 8 upper bits of the extended rcode
|
// This will reset the 8 upper bits of the extended rcode
|
||||||
|
@ -73,3 +76,36 @@ func TestOPTTtl(t *testing.T) {
|
||||||
t.Errorf("Setting a non-extended rcode is expected to set extended rcode to 0, got: %d", e.ExtendedRcode())
|
t.Errorf("Setting a non-extended rcode is expected to set extended rcode to 0, got: %d", e.ExtendedRcode())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestEDNS0_SUBNETUnpack(t *testing.T) {
|
||||||
|
for _, ip := range []net.IP{
|
||||||
|
net.IPv4(0xde, 0xad, 0xbe, 0xef),
|
||||||
|
net.ParseIP("192.0.2.1"),
|
||||||
|
net.ParseIP("2001:db8::68"),
|
||||||
|
} {
|
||||||
|
var s1 EDNS0_SUBNET
|
||||||
|
s1.Address = ip
|
||||||
|
|
||||||
|
if ip.To4() == nil {
|
||||||
|
s1.Family = 2
|
||||||
|
s1.SourceNetmask = net.IPv6len * 8
|
||||||
|
} else {
|
||||||
|
s1.Family = 1
|
||||||
|
s1.SourceNetmask = net.IPv4len * 8
|
||||||
|
}
|
||||||
|
|
||||||
|
b, err := s1.pack()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to pack: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var s2 EDNS0_SUBNET
|
||||||
|
if err := s2.unpack(b); err != nil {
|
||||||
|
t.Fatalf("failed to unpack: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !ip.Equal(s2.Address) {
|
||||||
|
t.Errorf("address different after unpacking; expected %s, got %s", ip, s2.Address)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue