Handle DHCPINFORM from clients behind a DHCP relay.
authorreyk <reyk@openbsd.org>
Tue, 11 Jul 2017 10:28:24 +0000 (10:28 +0000)
committerreyk <reyk@openbsd.org>
Tue, 11 Jul 2017 10:28:24 +0000 (10:28 +0000)
The dhcpinform() function has assumed that ciaddr matches the packet's
IP source address and didn't consider a relay, such as dhcrelay(8) -
indicated by giaddr, has forwarded the request.

Tested by landry@
OK krw@

usr.sbin/dhcpd/dhcp.c

index e55f4d4..2380980 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: dhcp.c,v 1.56 2017/04/24 14:58:36 krw Exp $ */
+/*     $OpenBSD: dhcp.c,v 1.57 2017/07/11 10:28:24 reyk Exp $ */
 
 /*
  * Copyright (c) 1995, 1996, 1997, 1998, 1999
@@ -527,7 +527,7 @@ dhcpinform(struct packet *packet)
         * not all clients are standards compliant.
         */
        cip.len = 4;
-       if (packet->raw->ciaddr.s_addr) {
+       if (packet->raw->ciaddr.s_addr && !packet->raw->giaddr.s_addr) {
                if (memcmp(&packet->raw->ciaddr.s_addr,
                    packet->client_addr.iabuf, 4) != 0) {
                        log_info("DHCPINFORM from %s but ciaddr %s is not "