From 63d55bb98a5fa3018378d06c50784e463c6e999a Mon Sep 17 00:00:00 2001 From: lgao4 Date: Wed, 8 Apr 2009 00:56:51 +0000 Subject: [PATCH] Replace BufToHexString by UnicodeValueToString Replace HexStringToBuf by StrHexToUint64 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8034 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Universal/HiiDatabaseDxe/ConfigRouting.c | 124 +++++++++++--- .../Universal/HiiDatabaseDxe/Database.c | 2 +- .../Universal/HiiDatabaseDxe/HiiDatabase.h | 21 ++- .../HiiDatabaseDxe/HiiDatabaseDxe.inf | 4 +- MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.c | 60 ------- MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.h | 39 ----- .../Universal/HiiDatabaseDxe/String.c | 46 +++++- .../Universal/Network/IScsiDxe/IScsiConfig.c | 40 ++--- .../Universal/Network/IScsiDxe/IScsiMisc.c | 151 +++++++++--------- .../Universal/SetupBrowserDxe/InputHandler.c | 8 +- .../Universal/SetupBrowserDxe/Setup.c | 139 +++++++++++++--- MdeModulePkg/Universal/SetupBrowserDxe/Ui.c | 24 ++- 12 files changed, 396 insertions(+), 262 deletions(-) delete mode 100644 MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.c delete mode 100644 MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.h diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c index d55fdf4366..4b8a70629d 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c @@ -80,6 +80,10 @@ GetDevicePath ( UINTN Length; EFI_STRING PathHdr; EFI_STRING DevicePathString; + UINT8 *DevicePathBuffer; + CHAR16 TemStr[2]; + UINTN Index; + UINT8 DigitUint8; if (String == NULL || DevicePath == NULL) { return EFI_INVALID_PARAMETER; @@ -114,21 +118,52 @@ GetDevicePath ( // as the device path resides in RAM memory. // Translate the data into binary. // - Length /= 2; - *DevicePath = (UINT8 *) AllocateZeroPool (Length); - if (*DevicePath == NULL) { + DevicePathBuffer = (UINT8 *) AllocateZeroPool ((Length + 1) / 2); + if (DevicePathBuffer == NULL) { FreePool (DevicePathString); return EFI_OUT_OF_RESOURCES; } - HexStringToBufInReverseOrder (*DevicePath, &Length, DevicePathString); + ZeroMem (TemStr, sizeof (TemStr)); + for (Index = 0; DevicePathString[Index] != L'\0'; Index ++) { + TemStr[0] = DevicePathString[Index]; + DigitUint8 = (UINT8) StrHexToUint64 (TemStr); + if ((Index & 1) == 0) { + DevicePathBuffer [Index/2] = DigitUint8; + } else { + DevicePathBuffer [Index/2] = (UINT8) ((DevicePathBuffer [Index/2] << 4) + DigitUint8); + } + } FreePool (DevicePathString); + + *DevicePath = DevicePathBuffer; return EFI_SUCCESS; } +/** + Converts the unicode character of the string from uppercase to lowercase. + This is a internal function. + + @param Str String to be converted + +**/ +VOID +EFIAPI +HiiToLower ( + IN OUT CHAR16 *Str + ) +{ + CHAR16 *Ptr; + + for (Ptr = Str; *Ptr != L'\0'; Ptr++) { + if (*Ptr >= L'A' && *Ptr <= L'Z') { + *Ptr = (CHAR16) (*Ptr - L'A' + L'a'); + } + } +} /** Generate a sub string then output it. @@ -159,8 +194,11 @@ GenerateSubStr ( { UINTN Length; EFI_STRING Str; - EFI_STATUS Status; EFI_STRING StringHeader; + CHAR16 *TemString; + CHAR16 *TemName; + UINT8 *TemBuffer; + UINTN Index; ASSERT (String != NULL && SubStr != NULL); @@ -171,34 +209,55 @@ GenerateSubStr ( } Length = StrLen (String) + BufferLen * 2 + 1 + 1; - Str = AllocateZeroPool (Length * sizeof (CHAR16)); + Str = AllocateZeroPool (Length * sizeof (CHAR16)); ASSERT (Str != NULL); StrCpy (Str, String); Length = (BufferLen * 2 + 1) * sizeof (CHAR16); - Status = EFI_SUCCESS; StringHeader = Str + StrLen (String); + TemString = (CHAR16 *) StringHeader; switch (Flag) { case 1: - Status = BufInReverseOrderToHexString (StringHeader, (UINT8 *) Buffer, BufferLen); + // + // Convert Buffer to Hex String in reverse order + // + TemBuffer = ((UINT8 *) Buffer); + for (Index = 0; Index < BufferLen; Index ++, TemBuffer ++) { + TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2); + } break; case 2: - Status = UnicodeToConfigString (StringHeader, &Length, (CHAR16 *) Buffer); + // + // Check buffer is enough + // + TemName = (CHAR16 *) Buffer; + ASSERT (Length < ((StrLen (TemName) * 4 + 1) * sizeof (CHAR16))); + // + // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044" + // + for (; *TemName != L'\0'; TemName++) { + TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4); + } break; case 3: - Status = BufToHexString (StringHeader, &Length, (UINT8 *) Buffer, BufferLen); // - // Convert the uppercase to lowercase since is defined in lowercase format. + // Convert Buffer to Hex String // - ToLower (StringHeader); + TemBuffer = ((UINT8 *) Buffer) + BufferLen - 1; + for (Index = 0; Index < BufferLen; Index ++, TemBuffer --) { + TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2); + } break; default: break; } - ASSERT_EFI_ERROR (Status); + // + // Convert the uppercase to lowercase since is defined in lowercase format. + // + HiiToLower (StringHeader); StrCat (Str, L"&"); *SubStr = Str; @@ -344,14 +403,17 @@ GetValueOfNumber ( EFI_STRING Str; UINT8 *Buf; EFI_STATUS Status; + UINT8 DigitUint8; + UINTN Index; + CHAR16 TemStr[2]; ASSERT (StringPtr != NULL && Number != NULL && Len != NULL); - ASSERT (*StringPtr != 0); + ASSERT (*StringPtr != L'\0'); Buf = NULL; TmpPtr = StringPtr; - while (*StringPtr != 0 && *StringPtr != L'&') { + while (*StringPtr != L'\0' && *StringPtr != L'&') { StringPtr++; } *Len = StringPtr - TmpPtr; @@ -363,7 +425,7 @@ GetValueOfNumber ( goto Exit; } CopyMem (Str, TmpPtr, *Len * sizeof (CHAR16)); - *(Str + *Len) = 0; + *(Str + *Len) = L'\0'; Length = (Length + 1) / 2; Buf = (UINT8 *) AllocateZeroPool (Length); @@ -371,10 +433,17 @@ GetValueOfNumber ( Status = EFI_OUT_OF_RESOURCES; goto Exit; } - - Status = HexStringToBuf (Buf, &Length, Str, NULL); - if (EFI_ERROR (Status)) { - goto Exit; + + Length = *Len; + ZeroMem (TemStr, sizeof (TemStr)); + for (Index = 0; Index < Length; Index ++) { + TemStr[0] = Str[Length - Index - 1]; + DigitUint8 = (UINT8) StrHexToUint64 (TemStr); + if ((Index & 1) == 0) { + Buf [Index/2] = DigitUint8; + } else { + Buf [Index/2] = (UINT8) ((Buf [Index/2] << 4) + DigitUint8); + } } *Number = Buf; @@ -384,6 +453,7 @@ Exit: if (Str != NULL) { FreePool (Str); } + return Status; } @@ -959,6 +1029,9 @@ HiiBlockToConfig ( UINT8 *Value; EFI_STRING ValueStr; EFI_STRING ConfigElement; + UINTN Index; + UINT8 *TemBuffer; + CHAR16 *TemString; if (This == NULL || Progress == NULL || Config == NULL) { return EFI_INVALID_PARAMETER; @@ -1107,10 +1180,13 @@ HiiBlockToConfig ( Status = EFI_OUT_OF_RESOURCES; goto Exit; } - - Status = BufToHexString (ValueStr, &Length, Value, Width); - ASSERT_EFI_ERROR (Status); - ToLower (ValueStr); + + TemString = ValueStr; + TemBuffer = Value + Width - 1; + for (Index = 0; Index < Width; Index ++, TemBuffer --) { + TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2); + } + HiiToLower (ValueStr); FreePool (Value); Value = NULL; diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c b/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c index b1a3374991..1721d2f5e4 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c @@ -809,7 +809,7 @@ InsertStringPackage ( AsciiStrCpy (Language, (CHAR8 *) PackageHdr + HeaderSize - LanguageSize); for (Link = PackageList->StringPkgHdr.ForwardLink; Link != &PackageList->StringPkgHdr; Link = Link->ForwardLink) { StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE); - if (R8_EfiLibCompareLanguage (Language, StringPackage->StringPkgHdr->Language)) { + if (HiiCompareLanguage (Language, StringPackage->StringPkgHdr->Language)) { FreePool (Language); return EFI_UNSUPPORTED; } diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h b/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h index 04dbdc81f0..636db50f61 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h @@ -41,6 +41,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include #include +#include #define HII_DATABASE_NOTIFY_GUID \ @@ -1688,11 +1689,25 @@ HiiGetAltCfg ( ); +/** + Compare whether two names of languages are identical. + + @param Language1 Name of language 1 + @param Language2 Name of language 2 + + @retval TRUE same + @retval FALSE not same + +**/ +BOOLEAN +HiiCompareLanguage ( + IN CHAR8 *Language1, + IN CHAR8 *Language2 + ) +; + // // Global variables // extern EFI_EVENT gHiiKeyboardLayoutChanged; - -#include "R8Lib.h" - #endif diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf b/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf index ae584cca1b..cdb84d592f 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf @@ -36,9 +36,6 @@ String.c Database.c Font.c - R8Lib.h - R8Lib.c - [Packages] MdePkg/MdePkg.dec @@ -57,6 +54,7 @@ UefiLib PcdLib UefiRuntimeServicesTableLib + PrintLib [Protocols] gEfiDevicePathProtocolGuid ## SOMETIMES_CONSUMES diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.c b/MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.c deleted file mode 100644 index 7c3e9b8b35..0000000000 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.c +++ /dev/null @@ -1,60 +0,0 @@ -/** @file -Implement a utility function named R8_EfiLibCompareLanguage. - - Copyright (c) 2007 - 2008, Intel Corporation - - All rights reserved. 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 - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - - -**/ - -#include "HiiDatabase.h" - - -/** - Compare whether two names of languages are identical. - - @param Language1 Name of language 1 - @param Language2 Name of language 2 - - @retval TRUE same - @retval FALSE not same - -**/ -BOOLEAN -R8_EfiLibCompareLanguage ( - IN CHAR8 *Language1, - IN CHAR8 *Language2 - ) -{ - // - // Porting Guide: - // This library interface is simply obsolete. - // Include the source code to user code. - // - UINTN Index; - - for (Index = 0; (Language1[Index] != 0) && (Language2[Index] != 0); Index++) { - if (Language1[Index] != Language2[Index]) { - return FALSE; - } - } - - if (((Language1[Index] == 0) && (Language2[Index] == 0)) || - ((Language1[Index] == 0) && (Language2[Index] != ';')) || - ((Language1[Index] == ';') && (Language2[Index] != 0)) || - ((Language1[Index] == ';') && (Language2[Index] != ';'))) { - return TRUE; - } - - return FALSE; -} - - - diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.h b/MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.h deleted file mode 100644 index 22b2bc9d39..0000000000 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.h +++ /dev/null @@ -1,39 +0,0 @@ -/** @file -Implement a utility function named R8_EfiLibCompareLanguage. - - Copyright (c) 2007 - 2008, Intel Corporation - - All rights reserved. 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 - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - - -**/ - -#ifndef __R8_LIB_H__ -#define __R8_LIB_H__ - -/** - Compare whether two names of languages are identical. - - @param Language1 Name of language 1 - @param Language2 Name of language 2 - - @retval TRUE same - @retval FALSE not same - -**/ -BOOLEAN -R8_EfiLibCompareLanguage ( - IN CHAR8 *Language1, - IN CHAR8 *Language2 - ) -; - -#endif - - diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/String.c b/MdeModulePkg/Universal/HiiDatabaseDxe/String.c index c6edd87cfd..00ff6ce786 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/String.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/String.c @@ -1014,7 +1014,7 @@ HiiNewString ( Link = Link->ForwardLink ) { StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE); - if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) { + if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) { Matched = TRUE; break; } @@ -1353,7 +1353,7 @@ HiiGetString ( Link = Link->ForwardLink ) { StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE); - if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) { + if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) { Status = GetStringWorker (Private, StringPackage, StringId, String, StringSize, StringFontInfo); if (Status != EFI_NOT_FOUND) { return Status; @@ -1446,7 +1446,7 @@ HiiSetString ( Link = Link->ForwardLink ) { StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE); - if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) { + if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) { OldPackageLen = StringPackage->StringPkgHdr->Header.Length; Status = SetStringWorker ( Private, @@ -1635,7 +1635,7 @@ HiiGetSecondaryLanguages ( Link1 = Link1->ForwardLink ) { StringPackage = CR (Link1, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE); - if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) FirstLanguage)) { + if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) FirstLanguage)) { Languages = StringPackage->StringPkgHdr->Language; // // Language is a series of ';' terminated strings, first one is primary @@ -1663,3 +1663,41 @@ HiiGetSecondaryLanguages ( return EFI_INVALID_LANGUAGE; } +/** + Compare whether two names of languages are identical. + + @param Language1 Name of language 1 + @param Language2 Name of language 2 + + @retval TRUE same + @retval FALSE not same + +**/ +BOOLEAN +HiiCompareLanguage ( + IN CHAR8 *Language1, + IN CHAR8 *Language2 + ) +{ + // + // Porting Guide: + // This library interface is simply obsolete. + // Include the source code to user code. + // + UINTN Index; + + for (Index = 0; (Language1[Index] != 0) && (Language2[Index] != 0); Index++) { + if (Language1[Index] != Language2[Index]) { + return FALSE; + } + } + + if (((Language1[Index] == 0) && (Language2[Index] == 0)) || + ((Language1[Index] == 0) && (Language2[Index] != ';')) || + ((Language1[Index] == ';') && (Language2[Index] != 0)) || + ((Language1[Index] == ';') && (Language2[Index] != ';'))) { + return TRUE; + } + + return FALSE; +} diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c index 2bb0ba3df1..34942f752a 100644 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c +++ b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c @@ -64,21 +64,6 @@ IScsiIpToStr ( UnicodeSPrint ( Str, 2 * IP4_STR_MAX_SIZE, L"%d.%d.%d.%d", Ip->Addr[0], Ip->Addr[1], Ip->Addr[2], Ip->Addr[3]); } -/** - Pop up an invalid notify which displays the message in Warning. - - @param[in] Warning The warning message. -**/ -VOID -PopUpInvalidNotify ( - IN CHAR16 *Warning - ) -{ - EFI_INPUT_KEY Key; - - IfrLibCreatePopUp (1, &Key, Warning); -} - /** Update the list of iSCSI devices the iSCSI driver is controlling. @@ -512,6 +497,7 @@ IScsiFormCallback ( EFI_IP_ADDRESS SubnetMask; EFI_IP_ADDRESS Gateway; EFI_STATUS Status; + EFI_INPUT_KEY Key; Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This); @@ -534,7 +520,7 @@ IScsiFormCallback ( Status = gIScsiInitiatorName.Set (&gIScsiInitiatorName, &BufferSize, IScsiName); if (EFI_ERROR (Status)) { - PopUpInvalidNotify (L"Invalid iSCSI Name!"); + CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL); } break; @@ -543,7 +529,7 @@ IScsiFormCallback ( IScsiUnicodeStrToAsciiStr (IfrNvData->LocalIp, Ip4String); Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4); if (EFI_ERROR (Status) || !Ip4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) { - PopUpInvalidNotify (L"Invalid IP address!"); + CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL); Status = EFI_INVALID_PARAMETER; } else { CopyMem (&Private->Current->SessionConfigData.LocalIp, &HostIp.v4, sizeof (HostIp.v4)); @@ -555,7 +541,7 @@ IScsiFormCallback ( IScsiUnicodeStrToAsciiStr (IfrNvData->SubnetMask, Ip4String); Status = IScsiAsciiStrToIp (Ip4String, &SubnetMask.v4); if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) && (IScsiGetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) { - PopUpInvalidNotify (L"Invalid Subnet Mask!"); + CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Subnet Mask!", NULL); Status = EFI_INVALID_PARAMETER; } else { CopyMem (&Private->Current->SessionConfigData.SubnetMask, &SubnetMask.v4, sizeof (SubnetMask.v4)); @@ -567,7 +553,7 @@ IScsiFormCallback ( IScsiUnicodeStrToAsciiStr (IfrNvData->Gateway, Ip4String); Status = IScsiAsciiStrToIp (Ip4String, &Gateway.v4); if (EFI_ERROR (Status) || ((Gateway.Addr[0] != 0) && !Ip4IsUnicast (NTOHL (Gateway.Addr[0]), 0))) { - PopUpInvalidNotify (L"Invalid Gateway!"); + CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Gateway!", NULL); Status = EFI_INVALID_PARAMETER; } else { CopyMem (&Private->Current->SessionConfigData.Gateway, &Gateway.v4, sizeof (Gateway.v4)); @@ -579,7 +565,7 @@ IScsiFormCallback ( IScsiUnicodeStrToAsciiStr (IfrNvData->TargetIp, Ip4String); Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4); if (EFI_ERROR (Status) || !Ip4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) { - PopUpInvalidNotify (L"Invalid IP address!"); + CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL); Status = EFI_INVALID_PARAMETER; } else { CopyMem (&Private->Current->SessionConfigData.TargetIp, &HostIp.v4, sizeof (HostIp.v4)); @@ -591,7 +577,7 @@ IScsiFormCallback ( IScsiUnicodeStrToAsciiStr (IfrNvData->TargetName, IScsiName); Status = IScsiNormalizeName (IScsiName, AsciiStrLen (IScsiName)); if (EFI_ERROR (Status)) { - PopUpInvalidNotify (L"Invalid iSCSI Name!"); + CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL); } else { AsciiStrCpy (Private->Current->SessionConfigData.TargetName, IScsiName); } @@ -609,7 +595,7 @@ IScsiFormCallback ( IScsiUnicodeStrToAsciiStr (IfrNvData->BootLun, LunString); Status = IScsiAsciiStrToLun (LunString, (UINT8 *) &Lun); if (EFI_ERROR (Status)) { - PopUpInvalidNotify (L"Invalid LUN string!"); + CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid LUN string!", NULL); } else { CopyMem (Private->Current->SessionConfigData.BootLun, &Lun, sizeof (Lun)); } @@ -661,11 +647,11 @@ IScsiFormCallback ( if ((Gateway.Addr[0] != 0)) { if (SubnetMask.Addr[0] == 0) { - PopUpInvalidNotify (L"Gateway address is set but subnet mask is zero."); + CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Gateway address is set but subnet mask is zero.", NULL); Status = EFI_INVALID_PARAMETER; break; } else if (!IP4_NET_EQUAL (HostIp.Addr[0], Gateway.Addr[0], SubnetMask.Addr[0])) { - PopUpInvalidNotify (L"Local IP and Gateway are not in the same subnet."); + CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Local IP and Gateway are not in the same subnet.", NULL); Status = EFI_INVALID_PARAMETER; break; } @@ -677,7 +663,7 @@ IScsiFormCallback ( if (!Private->Current->SessionConfigData.TargetInfoFromDhcp) { CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.TargetIp, sizeof (HostIp.v4)); if (!Ip4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) { - PopUpInvalidNotify (L"Target IP is invalid!"); + CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Target IP is invalid!", NULL); Status = EFI_INVALID_PARAMETER; break; } @@ -685,7 +671,7 @@ IScsiFormCallback ( if (IfrNvData->CHAPType != ISCSI_CHAP_NONE) { if ((IfrNvData->CHAPName[0] == '\0') || (IfrNvData->CHAPSecret[0] == '\0')) { - PopUpInvalidNotify (L"CHAP Name or CHAP Secret is invalid!"); + CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"CHAP Name or CHAP Secret is invalid!", NULL); Status = EFI_INVALID_PARAMETER; break; } @@ -693,7 +679,7 @@ IScsiFormCallback ( if ((IfrNvData->CHAPType == ISCSI_CHAP_MUTUAL) && ((IfrNvData->ReverseCHAPName[0] == '\0') || (IfrNvData->ReverseCHAPSecret[0] == '\0')) ) { - PopUpInvalidNotify (L"Reverse CHAP Name or Reverse CHAP Secret is invalid!"); + CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Reverse CHAP Name or Reverse CHAP Secret is invalid!", NULL); Status = EFI_INVALID_PARAMETER; break; } diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c index dd110dfb30..5275638d13 100644 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c +++ b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c @@ -123,55 +123,64 @@ IScsiAsciiStrToLun ( OUT UINT8 *Lun ) { - UINT32 Index; - CHAR8 *LunUnitStr[4]; - CHAR8 Digit; - UINTN Temp; - + UINTN Index, IndexValue, IndexNum, SizeStr; + CHAR8 TemStr[2]; + UINT8 TemValue; + UINT16 Value [4]; + ZeroMem (Lun, 8); - ZeroMem (LunUnitStr, sizeof (LunUnitStr)); - - Index = 0; - LunUnitStr[0] = Str; - - if (!IsHexDigit ((UINT8 *) &Digit, *Str)) { - return EFI_INVALID_PARAMETER; - } - - while (*Str != '\0') { - // - // Legal representations of LUN: - // 4752-3A4F-6b7e-2F99, - // 6734-9-156f-127, - // 4186-9 - // - if (*Str == '-') { - *Str = '\0'; - Index++; - - if (*(Str + 1) != '\0') { - if (!IsHexDigit ((UINT8 *) &Digit, *(Str + 1))) { - return EFI_INVALID_PARAMETER; - } - - LunUnitStr[Index] = Str + 1; + ZeroMem (TemStr, 2); + ZeroMem ((UINT8 *) Value, sizeof (Value)); + SizeStr = AsciiStrLen (Str); + IndexValue = 0; + IndexNum = 0; + + for (Index = 0; Index < SizeStr; Index ++) { + TemStr[0] = Str[Index]; + TemValue = (UINT8) AsciiStrHexToUint64 (TemStr); + if (TemValue == 0 && TemStr[0] != '0') { + if ((TemStr[0] != '-') || (IndexNum == 0)) { + // + // Invalid Lun Char + // + return EFI_INVALID_PARAMETER; } - } else if (!IsHexDigit ((UINT8 *) &Digit, *Str)) { - return EFI_INVALID_PARAMETER; } - - Str++; - } - - for (Index = 0; (Index < 4) && (LunUnitStr[Index] != NULL); Index++) { - if (AsciiStrLen (LunUnitStr[Index]) > 4) { + + if ((TemValue == 0) && (TemStr[0] == '-')) { + // + // Next Lun value + // + if (++IndexValue >= 4) { + // + // Max 4 Lun value + // + return EFI_INVALID_PARAMETER; + } + // + // Restart str index for the next lun value + // + IndexNum = 0; + continue; + } + + if (++IndexNum > 4) { + // + // Each Lun Str can't exceed size 4, because it will be as UINT16 value + // return EFI_INVALID_PARAMETER; } - - Temp = AsciiStrHexToUintn (LunUnitStr[Index]); - *((UINT16 *) &Lun[Index * 2]) = HTONS (Temp); + + // + // Combine UINT16 value + // + Value[IndexValue] = (UINT16) ((Value[IndexValue] << 4) + TemValue); } - + + for (Index = 0; Index <= IndexValue; Index ++) { + *((UINT16 *) &Lun[Index * 2]) = HTONS (Value[Index]); + } + return EFI_SUCCESS; } @@ -434,52 +443,38 @@ IScsiHexToBin ( ) { UINTN Index; - UINT32 HexCount; - CHAR8 *HexBuf; + UINTN Length; UINT8 Digit; - UINT8 Byte; - - Digit = 0; + CHAR8 TemStr[2]; + + ZeroMem (TemStr, sizeof (TemStr)); // // Find out how many hex characters the string has. // - HexBuf = HexStr; - if ((HexBuf[0] == '0') && ((HexBuf[1] == 'x') || (HexBuf[1] == 'X'))) { - HexBuf += 2; - } - - for (Index = 0, HexCount = 0; IsHexDigit (&Digit, HexBuf[Index]); Index++, HexCount++) - ; - - if (HexCount == 0) { - *BinLength = 0; - return EFI_SUCCESS; - } - // - // Test if buffer is passed enough. - // - if (((HexCount + 1) / 2) > *BinLength) { - *BinLength = (HexCount + 1) / 2; - return EFI_BUFFER_TOO_SMALL; + if ((HexStr[0] == '0') && ((HexStr[1] == 'x') || (HexStr[1] == 'X'))) { + HexStr += 2; } + + Length = AsciiStrLen (HexStr); - *BinLength = (HexCount + 1) / 2; - - for (Index = 0; Index < HexCount; Index++) { - - IsHexDigit (&Digit, HexBuf[HexCount - 1 - Index]); - + for (Index = 0; Index < Length; Index ++) { + TemStr[0] = HexStr[Index]; + Digit = (UINT8) AsciiStrHexToUint64 (TemStr); + if (Digit == 0 && TemStr[0] != '0') { + // + // Invalid Lun Char + // + break; + } if ((Index & 1) == 0) { - Byte = Digit; + BinBuffer [Index/2] = Digit; } else { - Byte = BinBuffer[*BinLength - 1 - Index / 2]; - Byte &= 0x0F; - Byte = (UINT8) (Byte | (Digit << 4)); + BinBuffer [Index/2] = (UINT8) ((BinBuffer [Index/2] << 4) + Digit); } - - BinBuffer[*BinLength - 1 - Index / 2] = Byte; } + + *BinLength = (UINT32) ((Index + 1)/2); return EFI_SUCCESS; } diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/InputHandler.c b/MdeModulePkg/Universal/SetupBrowserDxe/InputHandler.c index 48f5815e43..3006d0597d 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/InputHandler.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/InputHandler.c @@ -605,7 +605,13 @@ EnterCarriageReturn: default: if (ManualInput) { if (HexInput) { - if (!IsHexDigit (&Digital, Key.UnicodeChar)) { + if ((Key.UnicodeChar >= L'0') && (Key.UnicodeChar <= L'9')) { + Digital = (UINT8) (Key.UnicodeChar - L'0'); + } else if ((Key.UnicodeChar >= L'A') && (Key.UnicodeChar <= L'F')) { + Digital = (UINT8) (Key.UnicodeChar - L'A' + 0x0A); + } else if ((Key.UnicodeChar >= L'a') && (Key.UnicodeChar <= L'f')) { + Digital = (UINT8) (Key.UnicodeChar - L'a' + 0x0A); + } else { UpdateStatusBar (INPUT_ERROR, Question->QuestionFlags, TRUE); break; } diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c index 7e948b3058..e617f2f367 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c @@ -1018,8 +1018,12 @@ GetQuestionValue ( CHAR16 *Value; CHAR16 *StringPtr; UINTN Length; + UINTN Index; + UINTN LengthStr; BOOLEAN IsBufferStorage; BOOLEAN IsString; + CHAR16 TemStr[5]; + UINT8 DigitUint8; Status = EFI_SUCCESS; @@ -1141,15 +1145,44 @@ GetQuestionValue ( if (EFI_ERROR (Status)) { return Status; } - + + LengthStr = StrLen (Value); + Status = EFI_SUCCESS; if (IsString) { // // Convert Config String to Unicode String, e.g "0041004200430044" => "ABCD" + // Add string tail char L'\0' into Length // - Length = StorageWidth + sizeof (CHAR16); - Status = ConfigStringToUnicode ((CHAR16 *) Dst, &Length, Value); + Length = StorageWidth + sizeof (CHAR16); + if (Length < ((LengthStr / 4 + 1) * 2)) { + Status = EFI_BUFFER_TOO_SMALL; + } else { + StringPtr = (CHAR16 *) Dst; + ZeroMem (TemStr, sizeof (TemStr)); + for (Index = 0; Index < LengthStr; Index += 4) { + StrnCpy (TemStr, Value + Index, 4); + StringPtr[Index/4] = (CHAR16) StrHexToUint64 (TemStr); + } + // + // Add tailing L'\0' character + // + StringPtr[Index/4] = L'\0'; + } } else { - Status = HexStringToBuf (Dst, &StorageWidth, Value, NULL); + if (StorageWidth < ((LengthStr + 1) / 2)) { + Status = EFI_BUFFER_TOO_SMALL; + } else { + ZeroMem (TemStr, sizeof (TemStr)); + for (Index = 0; Index < LengthStr; Index ++) { + TemStr[0] = Value[LengthStr - Index - 1]; + DigitUint8 = (UINT8) StrHexToUint64 (TemStr); + if ((Index & 1) == 0) { + Dst [Index/2] = DigitUint8; + } else { + Dst [Index/2] = (UINT8) ((Dst [Index/2] << 4) + DigitUint8); + } + } + } } FreePool (Value); @@ -1222,20 +1255,50 @@ GetQuestionValue ( } *StringPtr = L'\0'; + LengthStr = StrLen (Value); + Status = EFI_SUCCESS; if (!IsBufferStorage && IsString) { // // Convert Config String to Unicode String, e.g "0041004200430044" => "ABCD" + // Add string tail char L'\0' into Length // - Length = StorageWidth + sizeof (CHAR16); - Status = ConfigStringToUnicode ((CHAR16 *) Dst, &Length, Value); + Length = StorageWidth + sizeof (CHAR16); + if (Length < ((LengthStr / 4 + 1) * 2)) { + Status = EFI_BUFFER_TOO_SMALL; + } else { + StringPtr = (CHAR16 *) Dst; + ZeroMem (TemStr, sizeof (TemStr)); + for (Index = 0; Index < LengthStr; Index += 4) { + StrnCpy (TemStr, Value + Index, 4); + StringPtr[Index/4] = (CHAR16) StrHexToUint64 (TemStr); + } + // + // Add tailing L'\0' character + // + StringPtr[Index/4] = L'\0'; + } } else { - Status = HexStringToBuf (Dst, &StorageWidth, Value, NULL); - if (EFI_ERROR (Status)) { - FreePool (Result); - return Status; + if (StorageWidth < ((LengthStr + 1) / 2)) { + Status = EFI_BUFFER_TOO_SMALL; + } else { + ZeroMem (TemStr, sizeof (TemStr)); + for (Index = 0; Index < LengthStr; Index ++) { + TemStr[0] = Value[LengthStr - Index - 1]; + DigitUint8 = (UINT8) StrHexToUint64 (TemStr); + if ((Index & 1) == 0) { + Dst [Index/2] = DigitUint8; + } else { + Dst [Index/2] = (UINT8) ((Dst [Index/2] << 4) + DigitUint8); + } + } } } + if (EFI_ERROR (Status)) { + FreePool (Result); + return Status; + } + // // Synchronize Edit Buffer // @@ -1244,6 +1307,7 @@ GetQuestionValue ( } else { SetValueByName (Storage, Question->VariableName, Value); } + FreePool (Result); } @@ -1286,6 +1350,10 @@ SetQuestionValue ( UINTN Length; BOOLEAN IsBufferStorage; BOOLEAN IsString; + UINT8 *TemBuffer; + CHAR16 *TemName; + CHAR16 *TemString; + UINTN Index; Status = EFI_SUCCESS; @@ -1397,20 +1465,32 @@ SetQuestionValue ( } else { if (IsString) { // - // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044" + // Allocate enough string buffer. // Value = NULL; BufferLen = ((StrLen ((CHAR16 *) Src) * 4) + 1) * sizeof (CHAR16); Value = AllocateZeroPool (BufferLen); ASSERT (Value != NULL); - Status = UnicodeToConfigString (Value, &BufferLen, (CHAR16 *) Src); - ASSERT_EFI_ERROR (Status); + // + // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044" + // + TemName = (CHAR16 *) Src; + TemString = Value; + for (; *TemName != L'\0'; TemName++) { + TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4); + } } else { BufferLen = StorageWidth * 2 + 1; Value = AllocateZeroPool (BufferLen * sizeof (CHAR16)); ASSERT (Value != NULL); - BufToHexString (Value, &BufferLen, Src, StorageWidth); - ToLower (Value); + // + // Convert Buffer to Hex String + // + TemBuffer = Src + StorageWidth - 1; + TemString = Value; + for (Index = 0; Index < StorageWidth; Index ++, TemBuffer --) { + TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2); + } } Status = SetValueByName (Storage, Question->VariableName, Value); @@ -1446,17 +1526,34 @@ SetQuestionValue ( } Value = ConfigResp + StrLen (ConfigResp); + if (!IsBufferStorage && IsString) { // // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044" // - BufferLen = ((StrLen ((CHAR16 *) Src) * 4) + 1) * sizeof (CHAR16); - Status = UnicodeToConfigString (Value, &BufferLen, (CHAR16 *) Src); - ASSERT_EFI_ERROR (Status); + TemName = (CHAR16 *) Src; + TemString = Value; + for (; *TemName != L'\0'; TemName++) { + TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4); + } } else { - BufferLen = StorageWidth * 2 + 1; - BufToHexString (Value, &BufferLen, Src, StorageWidth); - ToLower (Value); + // + // Convert Buffer to Hex String + // + TemBuffer = Src + StorageWidth - 1; + TemString = Value; + for (Index = 0; Index < StorageWidth; Index ++, TemBuffer --) { + TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2); + } + } + + // + // Convert to lower char. + // + for (TemString = Value; *Value != L'\0'; Value++) { + if (*Value >= L'A' && *Value <= L'Z') { + *Value = (CHAR16) (*Value - L'A' + L'a'); + } } // diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Ui.c b/MdeModulePkg/Universal/SetupBrowserDxe/Ui.c index ae8d9a62d7..42074ca32b 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Ui.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Ui.c @@ -1506,6 +1506,9 @@ UiDisplayMenu ( UINT16 DefaultId; EFI_DEVICE_PATH_PROTOCOL *DevicePath; FORM_BROWSER_STATEMENT *Statement; + CHAR16 TemStr[2]; + UINT8 *DevicePathBuffer; + UINT8 DigitUint8; CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR)); @@ -2358,8 +2361,27 @@ UiDisplayMenu ( } BufferSize = StrLen (StringPtr) / 2; DevicePath = AllocatePool (BufferSize); + + // + // Convert from Device Path String to DevicePath Buffer in the reverse order. + // + DevicePathBuffer = (UINT8 *) DevicePath; + for (Index = 0; StringPtr[Index] != L'\0'; Index ++) { + TemStr[0] = StringPtr[Index]; + DigitUint8 = (UINT8) StrHexToUint64 (TemStr); + if (DigitUint8 == 0 && TemStr[0] != L'0') { + // + // Invalid Hex Char as the tail. + // + break; + } + if ((Index & 1) == 0) { + DevicePathBuffer [Index/2] = DigitUint8; + } else { + DevicePathBuffer [Index/2] = (UINT8) ((DevicePathBuffer [Index/2] << 4) + DigitUint8); + } + } - HexStringToBufInReverseOrder ((UINT8 *) DevicePath, &BufferSize, StringPtr); Selection->Handle = HiiLibDevicePathToHiiHandle (DevicePath); if (Selection->Handle == NULL) { // -- 2.39.2