MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.c | 62 +++++++++++++++++++++- MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.h | 21 +++++++- .../Universal/Network/Ip4Dxe/Ip4Config2Impl.c | 12 ++++- MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.c | 8 +-- MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.c | 62 +--------------------- 5 files changed, 94 insertions(+), 71 deletions(-)
v2:
* Add the check in Ip4Config2SetDefaultIf to avoid the DHCP configuration
case.
Ip4config2 doesn't check the validity of Ip/Netmask pair, which
leads to the invalid combination of Ip and Netmask setting.
This patch is to resolve the issue.
Cc: Hegde Nagaraj P <nagaraj-p.hegde@hpe.com>
Cc: Subramanian Sriram <sriram-s@hpe.com>
Cc: Ye Ting <ting.ye@intel.com>
Cc: Fu Siyuan <siyuan.fu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Wu Jiaxin <jiaxin.wu@intel.com>
---
MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.c | 62 +++++++++++++++++++++-
MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.h | 21 +++++++-
.../Universal/Network/Ip4Dxe/Ip4Config2Impl.c | 12 ++++-
MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.c | 8 +--
MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.c | 62 +---------------------
5 files changed, 94 insertions(+), 71 deletions(-)
diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.c b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.c
index 004a8bc..7c7d182 100644
--- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.c
+++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.c
@@ -1,8 +1,8 @@
/** @file
-Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
@@ -265,5 +265,65 @@ Ip4NtohHead (
Head->Src = NTOHL (Head->Src);
Head->Dst = NTOHL (Head->Dst);
return Head;
}
+
+
+/**
+ Validate that Ip/Netmask pair is OK to be used as station
+ address. Only continuous netmasks are supported. and check
+ that StationAddress is a unicast address on the newtwork.
+
+ @param[in] Ip The IP address to validate.
+ @param[in] Netmask The netmaks of the IP.
+
+ @retval TRUE The Ip/Netmask pair is valid.
+ @retval FALSE The Ip/Netmask pair is invalid.
+
+**/
+BOOLEAN
+Ip4StationAddressValid (
+ IN IP4_ADDR Ip,
+ IN IP4_ADDR Netmask
+ )
+{
+ IP4_ADDR NetBrdcastMask;
+ INTN Len;
+ INTN Type;
+
+ //
+ // Only support the station address with 0.0.0.0/0 to enable DHCP client.
+ //
+ if (Netmask == IP4_ALLZERO_ADDRESS) {
+ return (BOOLEAN) (Ip == IP4_ALLZERO_ADDRESS);
+ }
+
+ //
+ // Only support the continuous net masks
+ //
+ if ((Len = NetGetMaskLength (Netmask)) == (IP4_MASK_MAX + 1)) {
+ return FALSE;
+ }
+
+ //
+ // Station address can't be class D or class E address
+ //
+ if ((Type = NetGetIpClass (Ip)) > IP4_ADDR_CLASSC) {
+ return FALSE;
+ }
+
+ //
+ // Station address can't be subnet broadcast/net broadcast address
+ //
+ if ((Ip == (Ip & Netmask)) || (Ip == (Ip | ~Netmask))) {
+ return FALSE;
+ }
+
+ NetBrdcastMask = gIp4AllMasks[MIN (Len, Type << 3)];
+
+ if (Ip == (Ip | ~NetBrdcastMask)) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
\ No newline at end of file
diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.h b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.h
index d38857c..9689f37 100644
--- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.h
+++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.h
@@ -1,9 +1,9 @@
/** @file
Common definition for IP4.
-Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
@@ -199,6 +199,25 @@ Ip4GetMulticastMac (
IP4_HEAD *
Ip4NtohHead (
IN IP4_HEAD *Head
);
+
+/**
+ Validate that Ip/Netmask pair is OK to be used as station
+ address. Only continuous netmasks are supported. and check
+ that StationAddress is a unicast address on the newtwork.
+
+ @param[in] Ip The IP address to validate.
+ @param[in] Netmask The netmaks of the IP.
+
+ @retval TRUE The Ip/Netmask pair is valid.
+ @retval FALSE The Ip/Netmask pair is invalid.
+
+**/
+BOOLEAN
+Ip4StationAddressValid (
+ IN IP4_ADDR Ip,
+ IN IP4_ADDR Netmask
+ );
+
#endif
diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c
index 6c7ac68..f4dfbb6 100644
--- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c
+++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c
@@ -607,10 +607,17 @@ Ip4Config2SetDefaultIf (
EFI_STATUS Status;
IP4_SERVICE *IpSb;
IpSb = IP4_SERVICE_FROM_IP4_CONFIG2_INSTANCE (Instance);
+ //
+ // Check whether the StationAddress/SubnetMask pair is valid.
+ //
+ if (!Ip4StationAddressValid (StationAddress, SubnetMask)) {
+ return EFI_INVALID_PARAMETER;
+ }
+
Status = Ip4Config2SetDefaultAddr (IpSb, StationAddress, SubnetMask);
if (EFI_ERROR (Status)) {
return Status;
}
@@ -1250,11 +1257,14 @@ Ip4Config2SetMaunualAddress (
NewAddress = *((EFI_IP4_CONFIG2_MANUAL_ADDRESS *) Data);
StationAddress = EFI_NTOHL (NewAddress.Address);
SubnetMask = EFI_NTOHL (NewAddress.SubnetMask);
- if (NetGetMaskLength (SubnetMask) == IP4_MASK_NUM) {
+ //
+ // Check whether the StationAddress/SubnetMask pair is valid.
+ //
+ if (!Ip4StationAddressValid (StationAddress, SubnetMask)) {
return EFI_INVALID_PARAMETER;
}
//
// Store the new data, and init the DataItem status to EFI_NOT_READY because
diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.c b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.c
index b0cc6a3..7512a00 100644
--- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.c
+++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.c
@@ -1,9 +1,9 @@
/** @file
Implement IP4 pesudo interface.
-Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
@@ -558,19 +558,13 @@ Ip4SetAddress (
IN IP4_ADDR SubnetMask
)
{
EFI_ARP_CONFIG_DATA ArpConfig;
EFI_STATUS Status;
- INTN Len;
NET_CHECK_SIGNATURE (Interface, IP4_INTERFACE_SIGNATURE);
- Len = NetGetMaskLength (SubnetMask);
- if (Len == IP4_MASK_NUM) {
- return EFI_INVALID_PARAMETER;
- }
-
//
// Set the ip/netmask, then compute the subnet broadcast
// and network broadcast for easy access. When computing
// nework broadcast, the subnet mask is most like longer
// than the default netmask (not subneted) as defined in
diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.c b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.c
index 91f1a67..5aa3ea1 100644
--- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.c
+++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.c
@@ -1,8 +1,8 @@
/** @file
-Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
@@ -808,70 +808,10 @@ Ip4CleanProtocol (
return EFI_SUCCESS;
}
/**
- Validate that Ip/Netmask pair is OK to be used as station
- address. Only continuous netmasks are supported. and check
- that StationAddress is a unicast address on the newtwork.
-
- @param[in] Ip The IP address to validate.
- @param[in] Netmask The netmaks of the IP.
-
- @retval TRUE The Ip/Netmask pair is valid.
- @retval FALSE The Ip/Netmask pair is invalid.
-
-**/
-BOOLEAN
-Ip4StationAddressValid (
- IN IP4_ADDR Ip,
- IN IP4_ADDR Netmask
- )
-{
- IP4_ADDR NetBrdcastMask;
- INTN Len;
- INTN Type;
-
- //
- // Only support the station address with 0.0.0.0/0 to enable DHCP client.
- //
- if (Netmask == IP4_ALLZERO_ADDRESS) {
- return (BOOLEAN) (Ip == IP4_ALLZERO_ADDRESS);
- }
-
- //
- // Only support the continuous net masks
- //
- if ((Len = NetGetMaskLength (Netmask)) == (IP4_MASK_MAX + 1)) {
- return FALSE;
- }
-
- //
- // Station address can't be class D or class E address
- //
- if ((Type = NetGetIpClass (Ip)) > IP4_ADDR_CLASSC) {
- return FALSE;
- }
-
- //
- // Station address can't be subnet broadcast/net broadcast address
- //
- if ((Ip == (Ip & Netmask)) || (Ip == (Ip | ~Netmask))) {
- return FALSE;
- }
-
- NetBrdcastMask = gIp4AllMasks[MIN (Len, Type << 3)];
-
- if (Ip == (Ip | ~NetBrdcastMask)) {
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-/**
Assigns an IPv4 address and subnet mask to this EFI IPv4 Protocol driver instance.
The Configure() function is used to set, change, or reset the operational
parameters and filter settings for this EFI IPv4 Protocol instance. Until these
parameters have been set, no network traffic can be sent or received by this
--
1.9.5.msysgit.1
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Reviewed-by: Sriram Subramanian <sriram-s@hpe.com> -----Original Message----- From: Jiaxin Wu [mailto:jiaxin.wu@intel.com] Sent: Thursday, March 16, 2017 11:18 AM To: edk2-devel@lists.01.org Cc: Hegde, Nagaraj P <nagaraj-p.hegde@hpe.com>; Subramanian, Sriram <sriram-s@hpe.com>; Ye Ting <ting.ye@intel.com>; Fu Siyuan <siyuan.fu@intel.com>; Wu Jiaxin <jiaxin.wu@intel.com> Subject: [PATCH v2] MdeModulePkg/Ip4Dxe: Add Ip/Netmask pair check for Ip4Config2 v2: * Add the check in Ip4Config2SetDefaultIf to avoid the DHCP configuration case. Ip4config2 doesn't check the validity of Ip/Netmask pair, which leads to the invalid combination of Ip and Netmask setting. This patch is to resolve the issue. Cc: Hegde Nagaraj P <nagaraj-p.hegde@hpe.com> Cc: Subramanian Sriram <sriram-s@hpe.com> Cc: Ye Ting <ting.ye@intel.com> Cc: Fu Siyuan <siyuan.fu@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Wu Jiaxin <jiaxin.wu@intel.com> --- MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.c | 62 +++++++++++++++++++++- MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.h | 21 +++++++- .../Universal/Network/Ip4Dxe/Ip4Config2Impl.c | 12 ++++- MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.c | 8 +-- MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.c | 62 +--------------------- 5 files changed, 94 insertions(+), 71 deletions(-) diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.c b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.c index 004a8bc..7c7d182 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.c +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.c @@ -1,8 +1,8 @@ /** @file -Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved.<BR> +Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR> This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php @@ -265,5 +265,65 @@ Ip4NtohHead ( Head->Src = NTOHL (Head->Src); Head->Dst = NTOHL (Head->Dst); return Head; } + + +/** + Validate that Ip/Netmask pair is OK to be used as station + address. Only continuous netmasks are supported. and check + that StationAddress is a unicast address on the newtwork. + + @param[in] Ip The IP address to validate. + @param[in] Netmask The netmaks of the IP. + + @retval TRUE The Ip/Netmask pair is valid. + @retval FALSE The Ip/Netmask pair is invalid. + +**/ +BOOLEAN +Ip4StationAddressValid ( + IN IP4_ADDR Ip, + IN IP4_ADDR Netmask + ) +{ + IP4_ADDR NetBrdcastMask; + INTN Len; + INTN Type; + + // + // Only support the station address with 0.0.0.0/0 to enable DHCP client. + // + if (Netmask == IP4_ALLZERO_ADDRESS) { + return (BOOLEAN) (Ip == IP4_ALLZERO_ADDRESS); + } + + // + // Only support the continuous net masks + // + if ((Len = NetGetMaskLength (Netmask)) == (IP4_MASK_MAX + 1)) { + return FALSE; + } + + // + // Station address can't be class D or class E address + // + if ((Type = NetGetIpClass (Ip)) > IP4_ADDR_CLASSC) { + return FALSE; + } + + // + // Station address can't be subnet broadcast/net broadcast address + // + if ((Ip == (Ip & Netmask)) || (Ip == (Ip | ~Netmask))) { + return FALSE; + } + + NetBrdcastMask = gIp4AllMasks[MIN (Len, Type << 3)]; + + if (Ip == (Ip | ~NetBrdcastMask)) { + return FALSE; + } + + return TRUE; +} \ No newline at end of file diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.h b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.h index d38857c..9689f37 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.h +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.h @@ -1,9 +1,9 @@ /** @file Common definition for IP4. -Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved.<BR> +Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR> This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php @@ -199,6 +199,25 @@ Ip4GetMulticastMac ( IP4_HEAD * Ip4NtohHead ( IN IP4_HEAD *Head ); + +/** + Validate that Ip/Netmask pair is OK to be used as station + address. Only continuous netmasks are supported. and check + that StationAddress is a unicast address on the newtwork. + + @param[in] Ip The IP address to validate. + @param[in] Netmask The netmaks of the IP. + + @retval TRUE The Ip/Netmask pair is valid. + @retval FALSE The Ip/Netmask pair is invalid. + +**/ +BOOLEAN +Ip4StationAddressValid ( + IN IP4_ADDR Ip, + IN IP4_ADDR Netmask + ); + #endif diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c index 6c7ac68..f4dfbb6 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c @@ -607,10 +607,17 @@ Ip4Config2SetDefaultIf ( EFI_STATUS Status; IP4_SERVICE *IpSb; IpSb = IP4_SERVICE_FROM_IP4_CONFIG2_INSTANCE (Instance); + // + // Check whether the StationAddress/SubnetMask pair is valid. + // + if (!Ip4StationAddressValid (StationAddress, SubnetMask)) { + return EFI_INVALID_PARAMETER; + } + Status = Ip4Config2SetDefaultAddr (IpSb, StationAddress, SubnetMask); if (EFI_ERROR (Status)) { return Status; } @@ -1250,11 +1257,14 @@ Ip4Config2SetMaunualAddress ( NewAddress = *((EFI_IP4_CONFIG2_MANUAL_ADDRESS *) Data); StationAddress = EFI_NTOHL (NewAddress.Address); SubnetMask = EFI_NTOHL (NewAddress.SubnetMask); - if (NetGetMaskLength (SubnetMask) == IP4_MASK_NUM) { + // + // Check whether the StationAddress/SubnetMask pair is valid. + // + if (!Ip4StationAddressValid (StationAddress, SubnetMask)) { return EFI_INVALID_PARAMETER; } // // Store the new data, and init the DataItem status to EFI_NOT_READY because diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.c b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.c index b0cc6a3..7512a00 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.c +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.c @@ -1,9 +1,9 @@ /** @file Implement IP4 pesudo interface. -Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved.<BR> +Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR> This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php @@ -558,19 +558,13 @@ Ip4SetAddress ( IN IP4_ADDR SubnetMask ) { EFI_ARP_CONFIG_DATA ArpConfig; EFI_STATUS Status; - INTN Len; NET_CHECK_SIGNATURE (Interface, IP4_INTERFACE_SIGNATURE); - Len = NetGetMaskLength (SubnetMask); - if (Len == IP4_MASK_NUM) { - return EFI_INVALID_PARAMETER; - } - // // Set the ip/netmask, then compute the subnet broadcast // and network broadcast for easy access. When computing // nework broadcast, the subnet mask is most like longer // than the default netmask (not subneted) as defined in diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.c b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.c index 91f1a67..5aa3ea1 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.c +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.c @@ -1,8 +1,8 @@ /** @file -Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved.<BR> +Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR> This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php @@ -808,70 +808,10 @@ Ip4CleanProtocol ( return EFI_SUCCESS; } /** - Validate that Ip/Netmask pair is OK to be used as station - address. Only continuous netmasks are supported. and check - that StationAddress is a unicast address on the newtwork. - - @param[in] Ip The IP address to validate. - @param[in] Netmask The netmaks of the IP. - - @retval TRUE The Ip/Netmask pair is valid. - @retval FALSE The Ip/Netmask pair is invalid. - -**/ -BOOLEAN -Ip4StationAddressValid ( - IN IP4_ADDR Ip, - IN IP4_ADDR Netmask - ) -{ - IP4_ADDR NetBrdcastMask; - INTN Len; - INTN Type; - - // - // Only support the station address with 0.0.0.0/0 to enable DHCP client. - // - if (Netmask == IP4_ALLZERO_ADDRESS) { - return (BOOLEAN) (Ip == IP4_ALLZERO_ADDRESS); - } - - // - // Only support the continuous net masks - // - if ((Len = NetGetMaskLength (Netmask)) == (IP4_MASK_MAX + 1)) { - return FALSE; - } - - // - // Station address can't be class D or class E address - // - if ((Type = NetGetIpClass (Ip)) > IP4_ADDR_CLASSC) { - return FALSE; - } - - // - // Station address can't be subnet broadcast/net broadcast address - // - if ((Ip == (Ip & Netmask)) || (Ip == (Ip | ~Netmask))) { - return FALSE; - } - - NetBrdcastMask = gIp4AllMasks[MIN (Len, Type << 3)]; - - if (Ip == (Ip | ~NetBrdcastMask)) { - return FALSE; - } - - return TRUE; -} - - -/** Assigns an IPv4 address and subnet mask to this EFI IPv4 Protocol driver instance. The Configure() function is used to set, change, or reset the operational parameters and filter settings for this EFI IPv4 Protocol instance. Until these parameters have been set, no network traffic can be sent or received by this -- 1.9.5.msysgit.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
© 2016 - 2024 Red Hat, Inc.