svn commit: r330692 - stable/11/sbin/dhclient

David Bright dab at FreeBSD.org
Fri Mar 9 14:38:47 UTC 2018


Author: dab
Date: Fri Mar  9 14:38:46 2018
New Revision: 330692
URL: https://svnweb.freebsd.org/changeset/base/330692

Log:
  MFC r330085:
  
  dhclient violates RFC2131 when sending early DHCPREQUEST message to re-obtain old IP
  
  When dhclient first starts, if an old IP address exists in the
  dhclient.leases file, dhclient(8) sends early DHCPREQUEST message(s)
  in an attempt to re-obtain the old IP address again. These messages
  contain the old IP as a requested-IP-address option in the message
  body (correct) but also use the old IP address as the packet's source
  IP (incorrect).
  
  RFC2131 sec 4.1 states:
  
    DHCP messages broadcast by a client prior to that client obtaining
    its IP address must have the source address field in the IP header
    set to 0.
  
  The use of the old IP as the packet's source address is incorrect if
  (a) the computer is now on a different network or (b) it is on the
  same network, but the old IP has been reallocated to another host.
  
  Fix dhclient to use 0.0.0.0 as the source IP in this circumstance
  without removing any existing functionality. Any previously-used old
  IP is still requested in the body of an early DHCPREQUEST message.
  
  PR:             199378
  Submitted by:   J.R. Oldroyd <fbsd at opal.com>
  Reported by:    J.R. Oldroyd <fbsd at opal.com>
  Sponsored by:   Dell EMC

Modified:
  stable/11/sbin/dhclient/dhclient.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sbin/dhclient/dhclient.c
==============================================================================
--- stable/11/sbin/dhclient/dhclient.c	Fri Mar  9 14:34:42 2018	(r330691)
+++ stable/11/sbin/dhclient/dhclient.c	Fri Mar  9 14:38:46 2018	(r330692)
@@ -1478,7 +1478,8 @@ cancel:
 		memcpy(&to.s_addr, ip->client->destination.iabuf,
 		    sizeof(to.s_addr));
 
-	if (ip->client->state != S_REQUESTING)
+	if (ip->client->state != S_REQUESTING &&
+	    ip->client->state != S_REBOOTING)
 		memcpy(&from, ip->client->active->address.iabuf,
 		    sizeof(from));
 	else


More information about the svn-src-all mailing list