From d7de30e5e47ded29599c4ef2ba37ddbf3913f4b0 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 21 Jan 2009 00:55:42 +0000 Subject: [PATCH] [dhcp] Allow for missing server ID in ProxyDHCPACK The Linux PXE server (http://www.kano.org.uk/projects/pxe) does not set the server identifier in its ProxyDHCP responses. If the server ID is missing, do not treat this as an error. This resolves the "vague and unsettling memory" mentioned in commit fdb8481d ("[dhcp] Verify server identifier on ProxyDHCPACKs"). Note that we already accept ProxyDHCPOFFERs without a server identifier; they get treated as potential BOOTP packets. --- src/net/udp/dhcp.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/net/udp/dhcp.c b/src/net/udp/dhcp.c index 2ef8c084..40670232 100644 --- a/src/net/udp/dhcp.c +++ b/src/net/udp/dhcp.c @@ -845,16 +845,20 @@ static void dhcp_rx_proxydhcpack ( struct dhcp_session *dhcp, struct in_addr ack_server_id = { 0 }; int rc; - /* Verify server ID matches */ + /* Verify server ID matches, if present */ assert ( dhcp->proxydhcpoffer != NULL ); - dhcppkt_fetch ( &dhcp->proxydhcpoffer->dhcppkt, DHCP_SERVER_IDENTIFIER, - &offer_server_id, sizeof ( offer_server_id ) ); - dhcppkt_fetch ( &proxydhcpack->dhcppkt, DHCP_SERVER_IDENTIFIER, - &ack_server_id, sizeof ( ack_server_id ) ); - if ( offer_server_id.s_addr != ack_server_id.s_addr ) { - DBGC ( dhcp, "DHCP %p ignoring ProxyDHCPACK with wrong server " - "ID %s\n", dhcp, inet_ntoa ( ack_server_id ) ); - return; + if ( ( rc = dhcppkt_fetch ( &proxydhcpack->dhcppkt, + DHCP_SERVER_IDENTIFIER, &ack_server_id, + sizeof ( ack_server_id ) ) ) > 0 ) { + dhcppkt_fetch ( &dhcp->proxydhcpoffer->dhcppkt, + DHCP_SERVER_IDENTIFIER, &offer_server_id, + sizeof ( offer_server_id ) ); + if ( offer_server_id.s_addr != ack_server_id.s_addr ) { + DBGC ( dhcp, "DHCP %p ignoring ProxyDHCPACK with " + "wrong server ID %s\n", + dhcp, inet_ntoa ( ack_server_id ) ); + return; + } } /* Rename settings */