From: Steven Barth Date: Tue, 1 Jul 2014 08:05:30 +0000 (+0200) Subject: DHCPv4: send DHCPNAK if requested addr != leased addr X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=4267915aef64aae345972c77148b11759a172b14;p=oweals%2Fodhcpd.git DHCPv4: send DHCPNAK if requested addr != leased addr --- diff --git a/src/dhcpv4.c b/src/dhcpv4.c index 1fac8a1..b8d64ce 100644 --- a/src/dhcpv4.c +++ b/src/dhcpv4.c @@ -331,6 +331,10 @@ static void handle_dhcpv4(void *addr, void *data, size_t len, return; } else if (reqmsg == DHCPV4_MSG_DISCOVER) { msg = DHCPV4_MSG_OFFER; + } else if (reqmsg == DHCPV4_MSG_REQUEST && reqaddr.s_addr && + reqaddr.s_addr != htonl(lease->addr)) { + msg = DHCPV4_MSG_NAK; + lease = NULL; } if (reqmsg == DHCPV4_MSG_DECLINE || reqmsg == DHCPV4_MSG_RELEASE) @@ -401,7 +405,7 @@ static void handle_dhcpv4(void *addr, void *data, size_t len, dest.sin_addr = req->ciaddr; dest.sin_port = htons(DHCPV4_CLIENT_PORT); } else if ((ntohs(req->flags) & DHCPV4_FLAG_BROADCAST) || - req->hlen != reply.hlen) { + req->hlen != reply.hlen || !reply.yiaddr.s_addr) { dest.sin_addr.s_addr = INADDR_BROADCAST; dest.sin_port = htons(DHCPV4_CLIENT_PORT); } else {