aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2023-03-08 00:43:33 +0000
committerMichael Brown <mcb30@ipxe.org>2023-03-14 11:35:30 +0000
commit8f1c1201199a924eeba31494be5aa6bf13eb3fa0 (patch)
tree7f42f39cbd8bbfc834da9bb85a2602d084a5f844
parent54fcb7c29ce2fabe109286e3c4dfeb297e0f3916 (diff)
downloadipxe-8f1c1201199a924eeba31494be5aa6bf13eb3fa0.zip
ipxe-8f1c1201199a924eeba31494be5aa6bf13eb3fa0.tar.gz
ipxe-8f1c1201199a924eeba31494be5aa6bf13eb3fa0.tar.bz2
[dhcp] Unregister ProxyDHCP and PXEBS settings on a successful DHCPACK
When a DHCP transaction does not result in the registration of a new "proxydhcp" or "pxebs" settings block, any existing settings blocks are currently left unaltered. This can cause surprising behaviour. For example: when chainloading iPXE, the "proxydhcp" and "pxebs" settings blocks may be prepopulated using cached values from the previous PXE bootloader. If iPXE performs a subsequent DHCP request, then the DHCP or ProxyDHCP servers may choose to respond differently to iPXE. The response may choose to omit the ProxyDHCP or PXEBS stages, in which case no new "proxydhcp" or "pxebs" settings blocks may be registered. This will result in iPXE using a combination of both old and new DHCP responses. Fix by assuming that a successful DHCPACK effectively acquires ownership of the "proxydhcp" and "pxebs" settings blocks, and that any existing settings blocks should therefore be unregistered. Reported-by: Henry Tung <htung@palantir.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/net/udp/dhcp.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/net/udp/dhcp.c b/src/net/udp/dhcp.c
index a1a481e..bd2c4a1 100644
--- a/src/net/udp/dhcp.c
+++ b/src/net/udp/dhcp.c
@@ -601,6 +601,12 @@ static void dhcp_request_rx ( struct dhcp_session *dhcp,
return;
}
+ /* Unregister any existing ProxyDHCP or PXEBS settings */
+ if ( ( settings = find_settings ( PROXYDHCP_SETTINGS_NAME ) ) != NULL )
+ unregister_settings ( settings );
+ if ( ( settings = find_settings ( PXEBS_SETTINGS_NAME ) ) != NULL )
+ unregister_settings ( settings );
+
/* Perform ProxyDHCP if applicable */
if ( dhcp->proxy_offer /* Have ProxyDHCP offer */ &&
( ! dhcp->no_pxedhcp ) /* ProxyDHCP not disabled */ ) {