summaryrefslogtreecommitdiffhomepage
path: root/dhcpv4
diff options
context:
space:
mode:
Diffstat (limited to 'dhcpv4')
-rw-r--r--dhcpv4/server4/conn.go3
-rw-r--r--dhcpv4/server4/server_test.go11
2 files changed, 14 insertions, 0 deletions
diff --git a/dhcpv4/server4/conn.go b/dhcpv4/server4/conn.go
index d62a5ac..3e49669 100644
--- a/dhcpv4/server4/conn.go
+++ b/dhcpv4/server4/conn.go
@@ -43,6 +43,9 @@ func NewIPv4UDPConn(iface string, addr *net.UDPAddr) (*net.UDPConn, error) {
}
// Bind to the port.
saddr := unix.SockaddrInet4{Port: addr.Port}
+ if addr.IP != nil && addr.IP.To4() == nil {
+ return nil, fmt.Errorf("wrong address family (expected v4) for %s", addr.IP)
+ }
copy(saddr.Addr[:], addr.IP.To4())
if err := unix.Bind(fd, &saddr); err != nil {
return nil, fmt.Errorf("cannot bind to port %d: %v", addr.Port, err)
diff --git a/dhcpv4/server4/server_test.go b/dhcpv4/server4/server_test.go
index da2b199..43314ad 100644
--- a/dhcpv4/server4/server_test.go
+++ b/dhcpv4/server4/server_test.go
@@ -116,3 +116,14 @@ func TestServer(t *testing.T) {
require.Equal(t, ifaces[0].HardwareAddr, p.ClientHWAddr)
}
}
+
+func TestBadAddrFamily(t *testing.T) {
+ saddr := &net.UDPAddr{
+ IP: net.IPv6loopback,
+ Port: 0,
+ }
+ _, err := NewServer("", saddr, DORAHandler)
+ if err == nil {
+ t.Fatal("Expected server4.NewServer to fail with an IPv6 address")
+ }
+}