From beab0fc5e2ea7c676968991b1ae8e1fc72aef19f Mon Sep 17 00:00:00 2001 From: jcarsey Date: Mon, 10 Oct 2011 17:26:25 +0000 Subject: [PATCH] ShellPkg: Verify memory allocations without ASSERT. signed-off-by: jcarsey reviewed-by: geekboy15a git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12522 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Library/UefiShellLevel2CommandsLib/Cd.c | 186 +++++++++--------- .../Library/UefiShellLevel2CommandsLib/Mv.c | 14 +- .../UefiShellLevel2CommandsLib/TimeDate.c | 10 +- ShellPkg/Library/UefiShellLib/UefiShellLib.c | 65 ++++-- 4 files changed, 160 insertions(+), 115 deletions(-) diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c index c753702e81..74beb093c4 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c @@ -96,78 +96,47 @@ ShellCommandRunCd ( } } else { Param1Copy = CatSPrint(NULL, L"%s", Param1, NULL); - Param1Copy = PathCleanUpDirectories(Param1Copy); - if (StrCmp(Param1Copy, L".") == 0) { - // - // nothing to do... change to current directory - // - } else if (StrCmp(Param1Copy, L"..") == 0) { - // - // Change up one directory... - // - Directory = ShellGetCurrentDir(NULL); - if (Directory == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle); - ShellStatus = SHELL_NOT_FOUND; - } else { - Drive = GetFullyQualifiedPath(Directory); - PathRemoveLastItem(Drive); - } - if (ShellStatus == SHELL_SUCCESS && Drive != NULL) { + if (Param1Copy != NULL) { + Param1Copy = PathCleanUpDirectories(Param1Copy); + } + if (Param1Copy != NULL) { + if (StrCmp(Param1Copy, L".") == 0) { // - // change directory on current drive letter + // nothing to do... change to current directory // - Status = gEfiShellProtocol->SetCurDir(NULL, Drive); - if (Status == EFI_NOT_FOUND) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_CD_NF), gShellLevel2HiiHandle); - ShellStatus = SHELL_NOT_FOUND; - } - } - } else if (StrCmp(Param1Copy, L"\\") == 0) { - // - // Move to root of current drive - // - Directory = ShellGetCurrentDir(NULL); - if (Directory == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle); - ShellStatus = SHELL_NOT_FOUND; - } else { - Drive = GetFullyQualifiedPath(Directory); - while (PathRemoveLastItem(Drive)) ; - } - if (ShellStatus == SHELL_SUCCESS && Drive != NULL) { + } else if (StrCmp(Param1Copy, L"..") == 0) { // - // change directory on current drive letter + // Change up one directory... // - Status = gEfiShellProtocol->SetCurDir(NULL, Drive); - if (Status == EFI_NOT_FOUND) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_CD_NF), gShellLevel2HiiHandle); + Directory = ShellGetCurrentDir(NULL); + if (Directory == NULL) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle); ShellStatus = SHELL_NOT_FOUND; - } - } - } else if (StrStr(Param1Copy, L":") == NULL) { - if (ShellGetCurrentDir(NULL) == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle); - ShellStatus = SHELL_NOT_FOUND; - } else { - ASSERT((Drive == NULL && DriveSize == 0) || (Drive != NULL)); - Drive = StrnCatGrow(&Drive, &DriveSize, ShellGetCurrentDir(NULL), 0); - if (*Param1Copy == L'\\') { - while (PathRemoveLastItem(Drive)) ; - Drive = StrnCatGrow(&Drive, &DriveSize, Param1Copy+1, 0); } else { - Drive = StrnCatGrow(&Drive, &DriveSize, Param1Copy, 0); + Drive = GetFullyQualifiedPath(Directory); + PathRemoveLastItem(Drive); } + if (ShellStatus == SHELL_SUCCESS && Drive != NULL) { + // + // change directory on current drive letter + // + Status = gEfiShellProtocol->SetCurDir(NULL, Drive); + if (Status == EFI_NOT_FOUND) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_CD_NF), gShellLevel2HiiHandle); + ShellStatus = SHELL_NOT_FOUND; + } + } + } else if (StrCmp(Param1Copy, L"\\") == 0) { // - // Verify that this is a valid directory + // Move to root of current drive // - Status = gEfiShellProtocol->OpenFileByName(Drive, &Handle, EFI_FILE_MODE_READ); - if (EFI_ERROR(Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_DIR_NF), gShellLevel2HiiHandle, Drive); - ShellStatus = SHELL_NOT_FOUND; - } else if (EFI_ERROR(FileHandleIsDirectory(Handle))) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NOT_DIR), gShellLevel2HiiHandle, Drive); + Directory = ShellGetCurrentDir(NULL); + if (Directory == NULL) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle); ShellStatus = SHELL_NOT_FOUND; + } else { + Drive = GetFullyQualifiedPath(Directory); + while (PathRemoveLastItem(Drive)) ; } if (ShellStatus == SHELL_SUCCESS && Drive != NULL) { // @@ -179,42 +148,77 @@ ShellCommandRunCd ( ShellStatus = SHELL_NOT_FOUND; } } - if (Handle != NULL) { - gEfiShellProtocol->CloseFile(Handle); - DEBUG_CODE(Handle = NULL;); + } else if (StrStr(Param1Copy, L":") == NULL) { + if (ShellGetCurrentDir(NULL) == NULL) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle); + ShellStatus = SHELL_NOT_FOUND; + } else { + ASSERT((Drive == NULL && DriveSize == 0) || (Drive != NULL)); + Drive = StrnCatGrow(&Drive, &DriveSize, ShellGetCurrentDir(NULL), 0); + if (*Param1Copy == L'\\') { + while (PathRemoveLastItem(Drive)) ; + Drive = StrnCatGrow(&Drive, &DriveSize, Param1Copy+1, 0); + } else { + Drive = StrnCatGrow(&Drive, &DriveSize, Param1Copy, 0); + } + // + // Verify that this is a valid directory + // + Status = gEfiShellProtocol->OpenFileByName(Drive, &Handle, EFI_FILE_MODE_READ); + if (EFI_ERROR(Status)) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_DIR_NF), gShellLevel2HiiHandle, Drive); + ShellStatus = SHELL_NOT_FOUND; + } else if (EFI_ERROR(FileHandleIsDirectory(Handle))) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NOT_DIR), gShellLevel2HiiHandle, Drive); + ShellStatus = SHELL_NOT_FOUND; + } + if (ShellStatus == SHELL_SUCCESS && Drive != NULL) { + // + // change directory on current drive letter + // + Status = gEfiShellProtocol->SetCurDir(NULL, Drive); + if (Status == EFI_NOT_FOUND) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_CD_NF), gShellLevel2HiiHandle); + ShellStatus = SHELL_NOT_FOUND; + } + } + if (Handle != NULL) { + gEfiShellProtocol->CloseFile(Handle); + DEBUG_CODE(Handle = NULL;); + } } - } - } else { - // - // change directory on other drive letter - // - Drive = AllocateZeroPool(StrSize(Param1Copy)); - if (Drive == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellLevel2HiiHandle); - ShellStatus = SHELL_OUT_OF_RESOURCES; } else { - Drive = StrCpy(Drive, Param1Copy); - Path = StrStr(Drive, L":"); - ASSERT(Path != NULL); - if (*(Path+1) == CHAR_NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_CD_NF), gShellLevel2HiiHandle); - ShellStatus = SHELL_NOT_FOUND; + // + // change directory on other drive letter + // + Drive = AllocateZeroPool(StrSize(Param1Copy)); + if (Drive == NULL) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellLevel2HiiHandle); + ShellStatus = SHELL_OUT_OF_RESOURCES; } else { - *(Path+1) = CHAR_NULL; - if (Path == Drive + StrLen(Drive)) { + Drive = StrCpy(Drive, Param1Copy); + Path = StrStr(Drive, L":"); + ASSERT(Path != NULL); + if (*(Path+1) == CHAR_NULL) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_CD_NF), gShellLevel2HiiHandle); ShellStatus = SHELL_NOT_FOUND; } else { - Status = gEfiShellProtocol->SetCurDir(Drive, Path+2); - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_CD_PRINT), gShellLevel2HiiHandle, ShellGetCurrentDir(Drive)); + *(Path+1) = CHAR_NULL; + if (Path == Drive + StrLen(Drive)) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_CD_NF), gShellLevel2HiiHandle); + ShellStatus = SHELL_NOT_FOUND; + } else { + Status = gEfiShellProtocol->SetCurDir(Drive, Path+2); + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_CD_PRINT), gShellLevel2HiiHandle, ShellGetCurrentDir(Drive)); + } + } + if (Status == EFI_NOT_FOUND) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_CD_NF), gShellLevel2HiiHandle); + Status = SHELL_NOT_FOUND; + } else if (EFI_ERROR(Status)) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_DIR_NF), gShellLevel2HiiHandle, Param1Copy); + Status = SHELL_NOT_FOUND; } - } - if (Status == EFI_NOT_FOUND) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_CD_NF), gShellLevel2HiiHandle); - Status = SHELL_NOT_FOUND; - } else if (EFI_ERROR(Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_DIR_NF), gShellLevel2HiiHandle, Param1Copy); - Status = SHELL_NOT_FOUND; } } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c index b83eede5a9..a93ef33c03 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c @@ -120,9 +120,10 @@ IsValidMove( @param[in, out] DestPathPointer A pointer to the callee allocated final path. @param[in] Cwd A pointer to the current working directory. - @retval EFI_INVALID_PARAMETR The DestDir could not be resolved to a location. - @retval EFI_INVALID_PARAMETR The DestDir could be resolved to more than 1 location. - @retval EFI_SUCCESS The operation was sucessful. + @retval SHELL_INVALID_PARAMETER The DestDir could not be resolved to a location. + @retval SHELL_INVALID_PARAMETER The DestDir could be resolved to more than 1 location. + @retval SHELL_INVALID_PARAMETER Cwd is required and is NULL. + @retval SHELL_SUCCESS The operation was sucessful. **/ SHELL_STATUS EFIAPI @@ -143,6 +144,9 @@ GetDestinationLocation( DestPath = NULL; if (StrStr(DestDir, L"\\") == DestDir) { + if (Cwd == NULL) { + return SHELL_INVALID_PARAMETER; + } DestPath = AllocateZeroPool(StrSize(Cwd)); if (DestPath == NULL) { return (SHELL_OUT_OF_RESOURCES); @@ -161,6 +165,10 @@ GetDestinationLocation( // Not existing... must be renaming // if ((TempLocation = StrStr(DestDir, L":")) == NULL) { + if (Cwd == NULL) { + ShellCloseFileMetaArg(&DestList); + return (SHELL_INVALID_PARAMETER); + } NewSize = StrSize(Cwd); NewSize += StrSize(DestDir); DestPath = AllocateZeroPool(NewSize); diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c index 44e83ba254..aa40bbf22f 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c @@ -179,6 +179,7 @@ ShellCommandRunDate ( EFI_TIME TheTime; CHAR16 *ProblemParam; SHELL_STATUS ShellStatus; + CONST CHAR16 *Param1; ShellStatus = SHELL_SUCCESS; ProblemParam = NULL; @@ -238,9 +239,14 @@ ShellCommandRunDate ( // // perform level 3 operation here. // - ShellStatus = CheckAndSetDate(ShellCommandLineGetRawValue(Package, 1)); + Param1 = ShellCommandLineGetRawValue(Package, 1); + if (Param1 == NULL) { + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ShellStatus = CheckAndSetDate(Param1); + } if (ShellStatus != SHELL_SUCCESS) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, 1)); + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, Param1); ShellStatus = SHELL_INVALID_PARAMETER; } } diff --git a/ShellPkg/Library/UefiShellLib/UefiShellLib.c b/ShellPkg/Library/UefiShellLib/UefiShellLib.c index 06e2386378..474aecb7ae 100644 --- a/ShellPkg/Library/UefiShellLib/UefiShellLib.c +++ b/ShellPkg/Library/UefiShellLib/UefiShellLib.c @@ -84,6 +84,8 @@ ShellIsDecimalDigitCharacter ( Helper function to find ShellEnvironment2 for constructor. @param[in] ImageHandle A copy of the calling image's handle. + + @retval EFI_OUT_OF_RESOURCES Memory allocation failed. **/ EFI_STATUS EFIAPI @@ -123,7 +125,9 @@ ShellFindSE2 ( // if (Status == EFI_BUFFER_TOO_SMALL) { Buffer = (EFI_HANDLE*)AllocateZeroPool(BufferSize); - ASSERT(Buffer != NULL); + if (Buffer == NULL) { + return (EFI_OUT_OF_RESOURCES); + } Status = gBS->LocateHandle (ByProtocol, &gEfiShellEnvironment2Guid, NULL, // ignored for ByProtocol @@ -1360,8 +1364,9 @@ InternalShellConvertFileListType ( // allocate a new EFI_SHELL_FILE_INFO object // NewInfo = AllocateZeroPool(sizeof(EFI_SHELL_FILE_INFO)); - ASSERT(NewInfo != NULL); if (NewInfo == NULL) { + ShellCloseFileMetaArg(&(EFI_SHELL_FILE_INFO*)ListHead); + ListHead = NULL; break; } @@ -1384,9 +1389,11 @@ InternalShellConvertFileListType ( // // make sure all the memory allocations were sucessful // - ASSERT(NewInfo->FullName != NULL); - ASSERT(NewInfo->FileName != NULL); - ASSERT(NewInfo->Info != NULL); + if (NULL == NewInfo->FullName || NewInfo->FileName == NULL || NewInfo->Info == NULL) { + ShellCloseFileMetaArg(&(EFI_SHELL_FILE_INFO*)ListHead); + ListHead = NULL; + break; + } // // Copt the strings and structure @@ -1612,7 +1619,6 @@ ShellFindFilePath ( Size = StrSize(Path); Size += StrSize(FileName); TestPath = AllocateZeroPool(Size); - ASSERT(TestPath != NULL); if (TestPath == NULL) { return (NULL); } @@ -1719,7 +1725,6 @@ ShellFindFilePathEx ( Size = StrSize(FileName); Size += StrSize(FileExtension); TestPath = AllocateZeroPool(Size); - ASSERT(TestPath != NULL); if (TestPath == NULL) { return (NULL); } @@ -1934,8 +1939,9 @@ InternalCommandLineParse ( // *CheckPackage = (LIST_ENTRY*)AllocateZeroPool(sizeof(LIST_ENTRY)); if (*CheckPackage == NULL) { - return EFI_OUT_OF_RESOURCES; + return (EFI_OUT_OF_RESOURCES); } + InitializeListHead(*CheckPackage); // @@ -1958,9 +1964,17 @@ InternalCommandLineParse ( // this is a flag // CurrentItemPackage = AllocateZeroPool(sizeof(SHELL_PARAM_PACKAGE)); - ASSERT(CurrentItemPackage != NULL); + if (CurrentItemPackage == NULL) { + ShellCommandLineFreeVarList(*CheckPackage); + *CheckPackage = NULL; + return (EFI_OUT_OF_RESOURCES); + } CurrentItemPackage->Name = AllocateZeroPool(StrSize(Argv[LoopCounter])); - ASSERT(CurrentItemPackage->Name != NULL); + if (CurrentItemPackage->Name == NULL) { + ShellCommandLineFreeVarList(*CheckPackage); + *CheckPackage = NULL; + return (EFI_OUT_OF_RESOURCES); + } StrCpy(CurrentItemPackage->Name, Argv[LoopCounter]); CurrentItemPackage->Type = CurrentItemType; CurrentItemPackage->OriginalPosition = (UINTN)(-1); @@ -2024,11 +2038,19 @@ InternalCommandLineParse ( TempPointer++; } CurrentItemPackage = AllocateZeroPool(sizeof(SHELL_PARAM_PACKAGE)); - ASSERT(CurrentItemPackage != NULL); + if (CurrentItemPackage == NULL) { + ShellCommandLineFreeVarList(*CheckPackage); + *CheckPackage = NULL; + return (EFI_OUT_OF_RESOURCES); + } CurrentItemPackage->Name = NULL; CurrentItemPackage->Type = TypePosition; CurrentItemPackage->Value = AllocateZeroPool(StrSize(TempPointer)); - ASSERT(CurrentItemPackage->Value != NULL); + if (CurrentItemPackage->Value == NULL) { + ShellCommandLineFreeVarList(*CheckPackage); + *CheckPackage = NULL; + return (EFI_OUT_OF_RESOURCES); + } StrCpy(CurrentItemPackage->Value, TempPointer); CurrentItemPackage->OriginalPosition = Count++; InsertHeadList(*CheckPackage, &CurrentItemPackage->Link); @@ -2038,8 +2060,9 @@ InternalCommandLineParse ( // if (ProblemParam != NULL) { *ProblemParam = AllocateZeroPool(StrSize(Argv[LoopCounter])); - ASSERT(*ProblemParam != NULL); - StrCpy(*ProblemParam, Argv[LoopCounter]); + if (*ProblemParam != NULL) { + StrCpy(*ProblemParam, Argv[LoopCounter]); + } } ShellCommandLineFreeVarList(*CheckPackage); *CheckPackage = NULL; @@ -2504,7 +2527,9 @@ ShellCopySearchAndReplace( Replace = StrnCatGrow(&Replace, NULL, ReplaceWith, 0); } else { Replace = AllocateZeroPool(StrSize(ReplaceWith) + 2*sizeof(CHAR16)); - UnicodeSPrint(Replace, StrSize(ReplaceWith) + 2*sizeof(CHAR16), L"\"%s\"", ReplaceWith); + if (Replace != NULL) { + UnicodeSPrint(Replace, StrSize(ReplaceWith) + 2*sizeof(CHAR16), L"\"%s\"", ReplaceWith); + } } if (Replace == NULL) { return (EFI_OUT_OF_RESOURCES); @@ -3092,11 +3117,9 @@ StrnCatGrow ( NewSize += 2 * Count * sizeof(CHAR16); } *Destination = ReallocatePool(*CurrentSize, NewSize, *Destination); - ASSERT(*Destination != NULL); *CurrentSize = NewSize; } else { *Destination = AllocateZeroPool((Count+1)*sizeof(CHAR16)); - ASSERT(*Destination != NULL); } // @@ -3831,7 +3854,8 @@ ShellIsHexOrDecimalNumber ( @param[in, out] Ascii Boolean value for indicating whether the file is Ascii (TRUE) or UCS2 (FALSE). - @return The line of text from the file. + @return The line of text from the file. + @retval NULL There was not enough memory available. @sa ShellFileHandleReadLine **/ @@ -3852,9 +3876,12 @@ ShellFileHandleReturnLine( Status = ShellFileHandleReadLine(Handle, RetVal, &Size, FALSE, Ascii); if (Status == EFI_BUFFER_TOO_SMALL) { RetVal = AllocateZeroPool(Size); + if (RetVal == NULL) { + return (NULL); + } Status = ShellFileHandleReadLine(Handle, RetVal, &Size, FALSE, Ascii); + } - ASSERT_EFI_ERROR(Status); if (EFI_ERROR(Status) && (RetVal != NULL)) { FreePool(RetVal); RetVal = NULL; -- 2.39.2