/** @file\r
The implementation of the ARP protocol.\r
- \r
-Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
-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
// 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
if (ConfigData->SwAddressType == IPV4_ETHER_PROTO_TYPE) {\r
CopyMem (&Ip, ConfigData->StationAddress, sizeof (IP4_ADDR));\r
\r
- if (!NetIp4IsUnicast (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