@param[in] Dst The pointer to the cache buffer for DHCPv6 packet.\r
@param[in] Src The pointer to the DHCPv6 packet to be cached.\r
\r
+ @retval EFI_SUCCESS Packet is copied.\r
+ @retval EFI_BUFFER_TOO_SMALL Cache buffer is not big enough to hold the packet.\r
+\r
**/\r
-VOID\r
+EFI_STATUS\r
HttpBootCacheDhcp6Packet (\r
IN EFI_DHCP6_PACKET *Dst,\r
IN EFI_DHCP6_PACKET *Src\r
)\r
{\r
- ASSERT (Dst->Size >= Src->Length);\r
+ if (Dst->Size < Src->Length) {\r
+ return EFI_BUFFER_TOO_SMALL;\r
+ }\r
\r
CopyMem (&Dst->Dhcp6, &Src->Dhcp6, Src->Length);\r
Dst->Length = Src->Length;\r
+ \r
+ return EFI_SUCCESS;\r
}\r
\r
/**\r
@param[in] Private The pointer to HTTP_BOOT_PRIVATE_DATA.\r
@param[in] RcvdOffer The pointer to the received offer packet.\r
\r
+ @retval EFI_SUCCESS Cache and parse the packet successfully.\r
+ @retval Others Operation failed.\r
+\r
**/\r
-VOID\r
+EFI_STATUS\r
HttpBootCacheDhcp6Offer (\r
IN HTTP_BOOT_PRIVATE_DATA *Private,\r
IN EFI_DHCP6_PACKET *RcvdOffer\r
HTTP_BOOT_DHCP6_PACKET_CACHE *Cache6;\r
EFI_DHCP6_PACKET *Offer;\r
HTTP_BOOT_OFFER_TYPE OfferType;\r
+ EFI_STATUS Status;\r
\r
Cache6 = &Private->OfferBuffer[Private->OfferNum].Dhcp6;\r
Offer = &Cache6->Packet.Offer;\r
//\r
// Cache the content of DHCPv6 packet firstly.\r
//\r
- HttpBootCacheDhcp6Packet(Offer, RcvdOffer);\r
+ Status = HttpBootCacheDhcp6Packet(Offer, RcvdOffer);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
\r
//\r
// Validate the DHCPv6 packet, and parse the options and offer type.\r
//\r
if (EFI_ERROR (HttpBootParseDhcp6Packet (Cache6))) {\r
- return ;\r
+ return EFI_ABORTED;\r
}\r
\r
//\r
ASSERT (Private->OfferCount[OfferType] < HTTP_BOOT_OFFER_MAX_NUM);\r
Private->OfferIndex[OfferType][Private->OfferCount[OfferType]] = Private->OfferNum;\r
Private->OfferCount[OfferType]++;\r
- Private->OfferNum++; \r
+ Private->OfferNum++;\r
+ \r
+ return EFI_SUCCESS;\r
}\r
\r
/**\r
HTTP_BOOT_PRIVATE_DATA *Private;\r
EFI_DHCP6_PACKET *SelectAd;\r
EFI_STATUS Status;\r
- if ((Dhcp6Event != Dhcp6RcvdAdvertise) && (Dhcp6Event != Dhcp6SelectAdvertise)) {\r
- return EFI_SUCCESS;\r
- }\r
\r
ASSERT (Packet != NULL);\r
\r
\r
case Dhcp6RcvdAdvertise:\r
Status = EFI_NOT_READY;\r
+ if (Packet->Length > HTTP_BOOT_DHCP6_PACKET_MAX_SIZE) {\r
+ //\r
+ // Ignore the incoming packets which exceed the maximum length.\r
+ //\r
+ break;\r
+ }\r
if (Private->OfferNum < HTTP_BOOT_OFFER_MAX_NUM) {\r
//\r
// Cache the dhcp offers to OfferBuffer[] for select later, and record\r
// the OfferIndex and OfferCount.\r
+ // If error happens, just ignore this packet and continue to wait more offer.\r
//\r
HttpBootCacheDhcp6Offer (Private, Packet);\r
}\r