/** @file\r
The implementation of the ARP protocol.\r
- \r
-Copyright (c) 2006 - 2009, Intel Corporation.<BR>\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at<BR>\r
-http://opensource.org/licenses/bsd-license.php\r
\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
CopyMem (&Instance->ArpProto, &mEfiArpProtocolTemplate, sizeof (Instance->ArpProto));\r
\r
Instance->Configured = FALSE;\r
- Instance->Destroyed = FALSE;\r
+ Instance->InDestroy = FALSE;\r
\r
InitializeListHead (&Instance->List);\r
}\r
// Status is EFI_SUCCESS, process the received frame.\r
//\r
RxData = RxToken->Packet.RxData;\r
- Head = (ARP_HEAD *) RxData->PacketData;\r
+ //\r
+ // Sanity check.\r
+ //\r
+ if (RxData->DataLength < sizeof (ARP_HEAD)) {\r
+ //\r
+ // Restart the receiving if packet size is not correct.\r
+ //\r
+ goto RESTART_RECEIVE;\r
+ }\r
\r
//\r
// Convert the byte order of the multi-byte fields.\r
//\r
+ Head = (ARP_HEAD *) RxData->PacketData;\r
Head->HwType = NTOHS (Head->HwType);\r
Head->ProtoType = NTOHS (Head->ProtoType);\r
Head->OpCode = NTOHS (Head->OpCode);\r
\r
+ if (RxData->DataLength < (sizeof (ARP_HEAD) + 2 * Head->HwAddrLen + 2 * Head->ProtoAddrLen)) {\r
+ goto RESTART_RECEIVE;\r
+ }\r
+\r
if ((Head->HwType != ArpService->SnpMode.IfType) ||\r
(Head->HwAddrLen != ArpService->SnpMode.HwAddressSize) ||\r
(RxData->ProtocolType != ARP_ETHER_PROTO_TYPE)) {\r
\r
/**\r
Process the already sent arp packets.\r
- \r
+\r
@param[in] Context Pointer to the context data registerd to the\r
Event.\r
\r
//\r
// Free the allocated memory and close the event.\r
//\r
- gBS->FreePool (TxData->FragmentTable[0].FragmentBuffer);\r
- gBS->FreePool (TxData);\r
+ FreePool (TxData->FragmentTable[0].FragmentBuffer);\r
+ FreePool (TxData);\r
gBS->CloseEvent (TxToken->Event);\r
- gBS->FreePool (TxToken);\r
+ FreePool (TxToken);\r
}\r
\r
/**\r
ASSERT (IsListEmpty (&CacheEntry->UserRequestList));\r
\r
RemoveEntryList (&CacheEntry->List);\r
- gBS->FreePool (CacheEntry);\r
+ FreePool (CacheEntry);\r
} else {\r
//\r
// resend the ARP request.\r
// Time out, remove it.\r
//\r
RemoveEntryList (&CacheEntry->List);\r
- gBS->FreePool (CacheEntry);\r
+ FreePool (CacheEntry);\r
} else {\r
//\r
// Update the DecayTime.\r
// Time out, remove it.\r
//\r
RemoveEntryList (&CacheEntry->List);\r
- gBS->FreePool (CacheEntry);\r
+ FreePool (CacheEntry);\r
} else {\r
//\r
// Update the DecayTime.\r
IN NET_ARP_ADDRESS *AddressTwo\r
)\r
{\r
+ ASSERT (AddressOne != NULL && AddressTwo != NULL);\r
+\r
if ((AddressOne->Type != AddressTwo->Type) ||\r
(AddressOne->Length != AddressTwo->Length)) {\r
//\r
// Remove this user request and free the context data.\r
//\r
RemoveEntryList (&Context->List);\r
- gBS->FreePool (Context);\r
+ FreePool (Context);\r
\r
Count++;\r
}\r
if (ConfigData->SwAddressType == IPV4_ETHER_PROTO_TYPE) {\r
CopyMem (&Ip, ConfigData->StationAddress, sizeof (IP4_ADDR));\r
\r
- if (!Ip4IsUnicast (NTOHL (Ip), 0)) {\r
+ if (IP4_IS_UNSPECIFIED (Ip) || IP4_IS_LOCAL_BROADCAST (Ip)) {\r
//\r
- // The station address is not a valid IPv4 unicast address.\r
+ // The station address should not be zero or broadcast address.\r
//\r
return EFI_INVALID_PARAMETER;\r
}\r
//\r
// Free the buffer previously allocated to hold the station address.\r
//\r
- gBS->FreePool (OldConfigData->StationAddress);\r
+ FreePool (OldConfigData->StationAddress);\r
}\r
\r
Instance->Configured = FALSE;\r
CLEAN_EXIT:\r
\r
if (Packet != NULL) {\r
- gBS->FreePool (Packet);\r
+ FreePool (Packet);\r
}\r
\r
if (TxData != NULL) {\r
- gBS->FreePool (TxData);\r
+ FreePool (TxData);\r
}\r
\r
if (TxToken->Event != NULL) {\r
gBS->CloseEvent (TxToken->Event);\r
}\r
\r
- gBS->FreePool (TxToken);\r
+ FreePool (TxToken);\r
}\r
\r
\r
//\r
RemoveEntryList (&CacheEntry->List);\r
ASSERT (IsListEmpty (&CacheEntry->UserRequestList));\r
- gBS->FreePool (CacheEntry);\r
+ FreePool (CacheEntry);\r
\r
Count++;\r
}\r
// No user requests any more, remove this request cache entry.\r
//\r
RemoveEntryList (&CacheEntry->List);\r
- gBS->FreePool (CacheEntry);\r
+ FreePool (CacheEntry);\r
}\r
}\r
}\r