From beab0fc5e2ea7c676968991b1ae8e1fc72aef19f Mon Sep 17 00:00:00 2001 From: jcarsey <jcarsey@6f19259b-4bc3-4df7-8a09-765794883524> Date: Mon, 10 Oct 2011 17:26:25 +0000 Subject: 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 --- ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c | 186 +++++++++++---------- ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c | 14 +- .../Library/UefiShellLevel2CommandsLib/TimeDate.c | 10 +- 3 files changed, 114 insertions(+), 96 deletions(-) (limited to 'ShellPkg/Library/UefiShellLevel2CommandsLib') 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; } } -- cgit v1.2.3