[PATCH 1/1] efi_loader: fix handling of DHCP acknowledge

Heinrich Schuchardt heinrich.schuchardt at canonical.com
Sat Nov 26 17:10:56 CET 2022


The dhcp command may be executed after the first UEFI command.
We should still update the EFI_PXE_BASE_CODE_PROTOCOL.

Don't leak content of prior acknowledge packages.

Handle out of memory.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
---
 lib/efi_loader/efi_net.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/lib/efi_loader/efi_net.c b/lib/efi_loader/efi_net.c
index 69276b275d..96a5bcca27 100644
--- a/lib/efi_loader/efi_net.c
+++ b/lib/efi_loader/efi_net.c
@@ -30,6 +30,7 @@ static uchar **receive_buffer;
 static size_t *receive_lengths;
 static int rx_packet_idx;
 static int rx_packet_num;
+static struct efi_net_obj *netobj;
 
 /*
  * The notification function of this event is called in every timer cycle
@@ -660,10 +661,16 @@ void efi_net_set_dhcp_ack(void *pkt, int len)
 {
 	int maxsize = sizeof(*dhcp_ack);
 
-	if (!dhcp_ack)
+	if (!dhcp_ack) {
 		dhcp_ack = malloc(maxsize);
-
+		if (!dhcp_ack)
+			return;
+	}
+	memset(dhcp_ack, 0, maxsize);
 	memcpy(dhcp_ack, pkt, min(len, maxsize));
+
+	if (netobj)
+		netobj->pxe_mode.dhcp_ack = *dhcp_ack;
 }
 
 /**
@@ -853,7 +860,6 @@ static efi_status_t EFIAPI efi_pxe_base_code_set_packets(
  */
 efi_status_t efi_net_register(void)
 {
-	struct efi_net_obj *netobj = NULL;
 	efi_status_t r;
 	int i;
 
@@ -982,6 +988,7 @@ failure_to_add_protocol:
 	return r;
 out_of_resources:
 	free(netobj);
+	netobj = NULL;
 	free(transmit_buffer);
 	if (receive_buffer)
 		for (i = 0; i < ETH_PACKETS_BATCH_RECV; i++)
-- 
2.37.2



More information about the U-Boot mailing list