From 5f213e854036e475b2a38ffb9f7521ee1b2bb2a5 Mon Sep 17 00:00:00 2001 From: Qiu Shumin Date: Fri, 8 Apr 2016 15:41:06 +0800 Subject: ShellPkg: Fix Shell ASSERT when mv file with cwd is NULL. Shell will ASSERT when doing the following operation: "" Shell> mv fs2:\file1 fs2:\file2 "" This patch add NULL pointer check to fix this issue. Fixes: https://github.com/tianocore/edk2/issues/76 Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Qiu Shumin Reviewed-by: Jaben Carsey Reviewed-by: Ruiyu Ni (cherry picked from commit 64ee6ed72ad5c1e4b7c9a96f419c3592e93314ad) --- ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c | 29 +++++++++++++----------- 1 file changed, 16 insertions(+), 13 deletions(-) (limited to 'ShellPkg') diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c index 29efb1c6fe..d02a6ae5f5 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c @@ -483,18 +483,21 @@ ValidateAndMoveFiles( Response = *Resp; Attr = 0; CleanFilePathStr = NULL; + FullCwd = NULL; - FullCwd = AllocateZeroPool(StrSize(Cwd) + sizeof(CHAR16)); - if (FullCwd == NULL) { - return SHELL_OUT_OF_RESOURCES; - } else { - StrCpyS(FullCwd, StrSize(Cwd)/sizeof(CHAR16)+1, Cwd); - StrCatS(FullCwd, StrSize(Cwd)/sizeof(CHAR16)+1, L"\\"); - } + if (Cwd != NULL) { + FullCwd = AllocateZeroPool(StrSize(Cwd) + sizeof(CHAR16)); + if (FullCwd == NULL) { + return SHELL_OUT_OF_RESOURCES; + } else { + StrCpyS(FullCwd, StrSize(Cwd)/sizeof(CHAR16)+1, Cwd); + StrCatS(FullCwd, StrSize(Cwd)/sizeof(CHAR16)+1, L"\\"); + } + } Status = ShellLevel2StripQuotes (DestParameter, &CleanFilePathStr); if (EFI_ERROR (Status)) { - FreePool (FullCwd); + SHELL_FREE_NON_NULL(FullCwd); if (Status == EFI_OUT_OF_RESOURCES) { return SHELL_OUT_OF_RESOURCES; } else { @@ -511,7 +514,7 @@ ValidateAndMoveFiles( FreePool (CleanFilePathStr); if (ShellStatus != SHELL_SUCCESS) { - FreePool (FullCwd); + SHELL_FREE_NON_NULL (FullCwd); return (ShellStatus); } DestPath = PathCleanUpDirectories(DestPath); @@ -526,7 +529,7 @@ ValidateAndMoveFiles( SHELL_FREE_NON_NULL(DestPath); SHELL_FREE_NON_NULL(HiiOutput); SHELL_FREE_NON_NULL(HiiResultOk); - FreePool (FullCwd); + SHELL_FREE_NON_NULL(FullCwd); return (SHELL_OUT_OF_RESOURCES); } @@ -588,7 +591,7 @@ ValidateAndMoveFiles( // // indicate to stop everything // - FreePool(FullCwd); + SHELL_FREE_NON_NULL(FullCwd); return (SHELL_ABORTED); case ShellPromptResponseAll: *Resp = Response; @@ -599,7 +602,7 @@ ValidateAndMoveFiles( break; default: FreePool(Response); - FreePool(FullCwd); + SHELL_FREE_NON_NULL(FullCwd); return SHELL_ABORTED; } Status = ShellDeleteFileByName(FullDestPath!=NULL? FullDestPath:DestPath); @@ -646,7 +649,7 @@ ValidateAndMoveFiles( SHELL_FREE_NON_NULL(DestPath); SHELL_FREE_NON_NULL(HiiOutput); SHELL_FREE_NON_NULL(HiiResultOk); - FreePool (FullCwd); + SHELL_FREE_NON_NULL(FullCwd); return (ShellStatus); } -- cgit v1.2.3