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