summaryrefslogtreecommitdiffstats
path: root/NetworkPkg/UefiPxeBcDxe/PxeBcBoot.c
diff options
context:
space:
mode:
Diffstat (limited to 'NetworkPkg/UefiPxeBcDxe/PxeBcBoot.c')
-rw-r--r--NetworkPkg/UefiPxeBcDxe/PxeBcBoot.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcBoot.c b/NetworkPkg/UefiPxeBcDxe/PxeBcBoot.c
index 10bbb06f75..d062a52607 100644
--- a/NetworkPkg/UefiPxeBcDxe/PxeBcBoot.c
+++ b/NetworkPkg/UefiPxeBcDxe/PxeBcBoot.c
@@ -482,7 +482,20 @@ PxeBcDhcp4BootInfo (
Cache4 = &Private->DhcpAck.Dhcp4;
}
- ASSERT (Cache4->OptList[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL);
+ if (Cache4->OptList[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] == NULL) {
+ //
+ // This should never happen in a correctly configured DHCP / PXE
+ // environment. One misconfiguration that can cause it is two DHCP servers
+ // mistakenly running on the same network segment at the same time, and
+ // racing each other in answering DHCP requests. Thus, the DHCP packets
+ // that the edk2 PXE client considers "belonging together" may actually be
+ // entirely independent, coming from two (competing) DHCP servers.
+ //
+ // Try to deal with this gracefully. Note that this check is not
+ // comprehensive, as we don't try to identify all such errors.
+ //
+ return EFI_PROTOCOL_ERROR;
+ }
//
// Parse the boot server address.
@@ -612,7 +625,20 @@ PxeBcDhcp6BootInfo (
Cache6 = &Private->DhcpAck.Dhcp6;
}
- ASSERT (Cache6->OptList[PXEBC_DHCP6_IDX_BOOT_FILE_URL] != NULL);
+ if (Cache6->OptList[PXEBC_DHCP6_IDX_BOOT_FILE_URL] == NULL) {
+ //
+ // This should never happen in a correctly configured DHCP / PXE
+ // environment. One misconfiguration that can cause it is two DHCP servers
+ // mistakenly running on the same network segment at the same time, and
+ // racing each other in answering DHCP requests. Thus, the DHCP packets
+ // that the edk2 PXE client considers "belonging together" may actually be
+ // entirely independent, coming from two (competing) DHCP servers.
+ //
+ // Try to deal with this gracefully. Note that this check is not
+ // comprehensive, as we don't try to identify all such errors.
+ //
+ return EFI_PROTOCOL_ERROR;
+ }
//
// Set the station address to IP layer.