Index: Application/Shell/FileHandleWrappers.c
===================================================================
--- Application/Shell/FileHandleWrappers.c	(revision 15883)
+++ Application/Shell/FileHandleWrappers.c	(working copy)
@@ -509,21 +509,20 @@
         if (StrStr(CurrentString + TabPos, L":") == NULL) {
           Cwd = ShellInfoObject.NewEfiShellProtocol->GetCurDir(NULL);
           if (Cwd != NULL) {
-            StrCpy(TabStr, Cwd);
+            StrnCpy(TabStr, Cwd, (*BufferSize)/sizeof(CHAR16) - 1);
             if (TabStr[StrLen(TabStr)-1] == L'\\' && *(CurrentString + TabPos) == L'\\' ) {
               TabStr[StrLen(TabStr)-1] = CHAR_NULL;
             }
             StrnCat(TabStr, CurrentString + TabPos, (StringLen - TabPos) * sizeof (CHAR16));
           } else {
-            StrCpy(TabStr, L"");
+            *TabStr = CHAR_NULL;
             StrnCat(TabStr, CurrentString + TabPos, (StringLen - TabPos) * sizeof (CHAR16));
           }
         } else {
-          StrCpy(TabStr, CurrentString + TabPos);
+          StrnCpy(TabStr, CurrentString + TabPos, (*BufferSize)/sizeof(CHAR16) - 1);
         }
-        StrCat(TabStr, L"*");
+        StrnCat(TabStr, L"*", (*BufferSize)/sizeof(CHAR16) - 1 - StrLen(TabStr));
         FoundFileList = NULL;
-//        TabStr = PathCleanUpDirectories(TabStr);
         Status  = ShellInfoObject.NewEfiShellProtocol->FindFiles(TabStr, &FoundFileList);
         for ( TempStr = CurrentString
             ; *TempStr == L' '
@@ -1168,7 +1167,7 @@
   EnvFileInterface->Delete      = FileInterfaceEnvDelete;
   EnvFileInterface->Read        = FileInterfaceEnvRead;
 
-  StrCpy(EnvFileInterface->Name, EnvName);
+  StrnCpy(EnvFileInterface->Name, EnvName, StrLen(EnvName));
 
   //
   // Assign the different members for Volatile and Non-Volatile variables
Index: Application/Shell/Shell.c
===================================================================
--- Application/Shell/Shell.c	(revision 15883)
+++ Application/Shell/Shell.c	(working copy)
@@ -937,7 +937,7 @@
         continue;
       }
 
-      ShellInfoObject.ShellInitSettings.FileName = AllocateZeroPool(StrSize(CurrentArg));
+      ShellInfoObject.ShellInitSettings.FileName = AllocateCopyPool(StrSize(CurrentArg), CurrentArg);
       if (ShellInfoObject.ShellInitSettings.FileName == NULL) {
         return (EFI_OUT_OF_RESOURCES);
       }
@@ -945,8 +945,6 @@
       // We found `file-name`.
       //
       ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoStartup = 1;
-
-      StrCpy (ShellInfoObject.ShellInitSettings.FileName, CurrentArg);
       LoopVar++;
 
       // Add `file-name-options`
@@ -1027,10 +1025,10 @@
     if (FileStringPath == NULL) {
       return (EFI_OUT_OF_RESOURCES);
     }
-    StrCpy(FileStringPath, ShellInfoObject.ShellInitSettings.FileName);
+    StrnCpy(FileStringPath, ShellInfoObject.ShellInitSettings.FileName, NewSize/sizeof(CHAR16) -1);
     if (ShellInfoObject.ShellInitSettings.FileOptions != NULL) {
-      StrCat(FileStringPath, L" ");
-      StrCat(FileStringPath, ShellInfoObject.ShellInitSettings.FileOptions);
+      StrnCat(FileStringPath, L" ", NewSize/sizeof(CHAR16) - StrLen(FileStringPath) -1);
+      StrnCat(FileStringPath, ShellInfoObject.ShellInitSettings.FileOptions, NewSize/sizeof(CHAR16) - StrLen(FileStringPath) -1);
     }
     Status = RunCommand(FileStringPath, ExitStatus);
     FreePool(FileStringPath);
@@ -1247,9 +1245,8 @@
 
   Node = AllocateZeroPool(sizeof(BUFFER_LIST));
   ASSERT(Node != NULL);
-  Node->Buffer = AllocateZeroPool(StrSize(Buffer));
+  Node->Buffer = AllocateCopyPool(StrSize(Buffer), Buffer);
   ASSERT(Node->Buffer != NULL);
-  StrCpy(Node->Buffer, Buffer);
 
   InsertTailList(&ShellInfoObject.ViewingSettings.CommandHistory.Link, &Node->Link);
 }
@@ -1280,11 +1277,10 @@
     return (EFI_SUCCESS);
   }
   FreePool(*CommandString);
-  *CommandString = AllocateZeroPool(StrSize(NewString));
+  *CommandString = AllocateCopyPool(StrSize(NewString), NewString);
   if (*CommandString == NULL) {
     return (EFI_OUT_OF_RESOURCES);
   }
-  StrCpy(*CommandString, NewString);
   return (EFI_SUCCESS);
 }
 
@@ -1477,7 +1473,7 @@
   //
   // now do the replacements...
   //
-  NewCommandLine1 = AllocateZeroPool(NewSize);
+  NewCommandLine1 = AllocateCopyPool(NewSize, OriginalCommandLine);
   NewCommandLine2 = AllocateZeroPool(NewSize);
   ItemTemp        = AllocateZeroPool(ItemSize+(2*sizeof(CHAR16)));
   if (NewCommandLine1 == NULL || NewCommandLine2 == NULL || ItemTemp == NULL) {
@@ -1486,16 +1482,15 @@
     SHELL_FREE_NON_NULL(ItemTemp);
     return (NULL);
   }
-  StrCpy(NewCommandLine1, OriginalCommandLine);
   for (MasterEnvList = EfiShellGetEnv(NULL)
-    ;  MasterEnvList != NULL && *MasterEnvList != CHAR_NULL //&& *(MasterEnvList+1) != CHAR_NULL
+    ;  MasterEnvList != NULL && *MasterEnvList != CHAR_NULL
     ;  MasterEnvList += StrLen(MasterEnvList) + 1
    ){
-    StrCpy(ItemTemp, L"%");
-    StrCat(ItemTemp, MasterEnvList);
-    StrCat(ItemTemp, L"%");
+    StrnCpy(ItemTemp, L"%", 1);
+    StrnCat(ItemTemp, MasterEnvList, ((ItemSize+(2*sizeof(CHAR16)))/sizeof(CHAR16))-1 - StrLen(ItemTemp));
+    StrnCat(ItemTemp, L"%", ((ItemSize+(2*sizeof(CHAR16)))/sizeof(CHAR16))-1 - StrLen(ItemTemp));
     ShellCopySearchAndReplace(NewCommandLine1, NewCommandLine2, NewSize, ItemTemp, EfiShellGetEnv(MasterEnvList), TRUE, FALSE);
-    StrCpy(NewCommandLine1, NewCommandLine2);
+    StrnCpy(NewCommandLine1, NewCommandLine2, NewSize/sizeof(CHAR16)-1);
   }
   if (CurrentScriptFile != NULL) {
     for (AliasListNode = (ALIAS_LIST*)GetFirstNode(&CurrentScriptFile->SubstList)
@@ -1503,7 +1498,7 @@
       ;  AliasListNode = (ALIAS_LIST*)GetNextNode(&CurrentScriptFile->SubstList, &AliasListNode->Link)
    ){
     ShellCopySearchAndReplace(NewCommandLine1, NewCommandLine2, NewSize, AliasListNode->Alias, AliasListNode->CommandString, TRUE, FALSE);
-    StrCpy(NewCommandLine1, NewCommandLine2);
+    StrnCpy(NewCommandLine1, NewCommandLine2, NewSize/sizeof(CHAR16)-1);
     }
 
     //
@@ -1516,7 +1511,7 @@
   // Now cleanup any straggler intentionally ignored "%" characters
   //
   ShellCopySearchAndReplace(NewCommandLine1, NewCommandLine2, NewSize, L"^%", L"%", TRUE, FALSE);
-  StrCpy(NewCommandLine1, NewCommandLine2);
+  StrnCpy(NewCommandLine1, NewCommandLine2, NewSize/sizeof(CHAR16)-1);
   
   FreePool(NewCommandLine2);
   FreePool(ItemTemp);
@@ -1850,7 +1845,7 @@
       return (EFI_OUT_OF_RESOURCES);
     }
     TempWalker = (CHAR16*)Temp;
-    GetNextParameter(&TempWalker, &FirstParameter);
+    GetNextParameter(&TempWalker, &FirstParameter, StrSize(CmdLine));
 
     if (GetOperationType(FirstParameter) == Unknown_Invalid) {
       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SHELL_NOT_FOUND), ShellInfoObject.HiiHandle, FirstParameter);
@@ -2018,7 +2013,7 @@
   Walker = *CmdLine;
   while(Walker != NULL && *Walker != CHAR_NULL) {
     LastWalker = Walker;
-    GetNextParameter(&Walker, &CurrentParameter);
+    GetNextParameter(&Walker, &CurrentParameter, StrSize(*CmdLine));
     if (StrStr(CurrentParameter, L"-?") == CurrentParameter) {
       LastWalker[0] = L' ';
       LastWalker[1] = L' ';
@@ -2027,8 +2022,12 @@
         Status = EFI_OUT_OF_RESOURCES;
         break;
       }
-      StrCpy(NewCommandLine, L"help ");
-      StrCat(NewCommandLine, *CmdLine);
+
+      //
+      // We know the space is sufficient since we just calculated it.
+      //
+      StrnCpy(NewCommandLine, L"help ", 5);
+      StrnCat(NewCommandLine, *CmdLine, StrLen(*CmdLine));
       SHELL_FREE_NON_NULL(*CmdLine);
       *CmdLine = NewCommandLine;
       break;
@@ -2507,7 +2506,7 @@
     return (EFI_OUT_OF_RESOURCES);
   }
   TempWalker = CleanOriginal;
-  GetNextParameter(&TempWalker, &FirstParameter);
+  GetNextParameter(&TempWalker, &FirstParameter, StrSize(CleanOriginal));
 
   //
   // Depending on the first parameter we change the behavior
@@ -2703,7 +2702,7 @@
       ; // conditional increment in the body of the loop
   ){
     ASSERT(CommandLine2 != NULL);
-    StrCpy(CommandLine2, NewScriptFile->CurrentCommand->Cl);
+    StrnCpy(CommandLine2, NewScriptFile->CurrentCommand->Cl, PcdGet16(PcdShellPrintBufferSize)/sizeof(CHAR16)-1);
 
     //
     // NULL out comments
@@ -2722,7 +2721,7 @@
       //
       // Due to variability in starting the find and replace action we need to have both buffers the same.
       //
-      StrCpy(CommandLine, CommandLine2);
+      StrnCpy(CommandLine, CommandLine2, PcdGet16(PcdShellPrintBufferSize)/sizeof(CHAR16)-1);
 
       //
       // Remove the %0 to %9 from the command line (if we have some arguments)
@@ -2774,7 +2773,7 @@
       Status = ShellCopySearchAndReplace(CommandLine,  CommandLine2, PcdGet16 (PcdShellPrintBufferSize), L"%8", L"\"\"", FALSE, FALSE);
       Status = ShellCopySearchAndReplace(CommandLine2,  CommandLine, PcdGet16 (PcdShellPrintBufferSize), L"%9", L"\"\"", FALSE, FALSE);
 
-      StrCpy(CommandLine2, CommandLine);
+      StrnCpy(CommandLine2, CommandLine, PcdGet16(PcdShellPrintBufferSize)/sizeof(CHAR16)-1);
 
       LastCommand = NewScriptFile->CurrentCommand;
 
Index: Application/Shell/ShellEnvVar.c
===================================================================
--- Application/Shell/ShellEnvVar.c	(revision 15883)
+++ Application/Shell/ShellEnvVar.c	(working copy)
@@ -152,7 +152,7 @@
   if (VariableName == NULL) {
     return (EFI_OUT_OF_RESOURCES);
   }
-  StrCpy(VariableName, L"");
+  *VariableName = CHAR_NULL;
 
   while (!EFI_ERROR(Status)) {
     NameSize = (UINTN)MaxVarSize;
@@ -178,13 +178,12 @@
           }
         }
         if (!EFI_ERROR(Status) && VarList != NULL) {
-          VarList->Key = AllocateZeroPool(StrSize(VariableName));
+          VarList->Key = AllocateCopyPool(StrSize(VariableName), VariableName);
           if (VarList->Key == NULL) {
             SHELL_FREE_NON_NULL(VarList->Val);
             SHELL_FREE_NON_NULL(VarList);
             Status = EFI_OUT_OF_RESOURCES;
           } else {
-            StrCpy(VarList->Key, VariableName);
             InsertTailList(ListHead, &VarList->Link);
           }
         }
@@ -286,7 +285,6 @@
   UINTN         CurrentCount;
   ENV_VAR_LIST  *VarList;
   ENV_VAR_LIST  *Node;
-  UINTN         NewSize;
 
   VarList = NULL;
 
@@ -307,20 +305,44 @@
     }
     ASSERT(StrStr(CurrentString, L"=") != NULL);
     Node = AllocateZeroPool(sizeof(ENV_VAR_LIST));
-    ASSERT(Node != NULL);
+    if (Node == NULL) {
+      SetEnvironmentVariableList(&VarList->Link);
+      return (EFI_OUT_OF_RESOURCES);
+    }
+
     Node->Key = AllocateZeroPool((StrStr(CurrentString, L"=") - CurrentString + 1) * sizeof(CHAR16));
-    ASSERT(Node->Key != NULL);
+    if (Node->Key == NULL) {
+      SHELL_FREE_NON_NULL(Node);
+      SetEnvironmentVariableList(&VarList->Link);
+      return (EFI_OUT_OF_RESOURCES);
+    }
+
+    //
+    // Copy the string into the Key, leaving the last character allocated as NULL to terminate
+    //
     StrnCpy(Node->Key, CurrentString, StrStr(CurrentString, L"=") - CurrentString);
-    NewSize = StrSize(CurrentString);
-    NewSize -= StrLen(Node->Key) - 1;
-    Node->Val = AllocateZeroPool(NewSize);
-    ASSERT(Node->Val != NULL);
-    StrCpy(Node->Val, CurrentString + StrLen(Node->Key) + 1);
+
+    //
+    // ValueSize = TotalSize - already removed size - size for '=' + size for terminator (the last 2 items cancel each other)
+    //
+    Node->Val = AllocateCopyPool(StrSize(CurrentString) - StrSize(Node->Key), CurrentString + StrLen(Node->Key) + 1);
+    if (Node->Val == NULL) {
+      SHELL_FREE_NON_NULL(Node->Key);
+      SHELL_FREE_NON_NULL(Node);
+      SetEnvironmentVariableList(&VarList->Link);
+      return (EFI_OUT_OF_RESOURCES);
+    }
+
     Node->Atts = EFI_VARIABLE_BOOTSERVICE_ACCESS;
 
     if (VarList == NULL) {
       VarList = AllocateZeroPool(sizeof(ENV_VAR_LIST));
-      ASSERT(VarList != NULL);
+      if (VarList == NULL) {
+        SHELL_FREE_NON_NULL(Node->Key);
+        SHELL_FREE_NON_NULL(Node->Val);
+        SHELL_FREE_NON_NULL(Node);
+        return (EFI_OUT_OF_RESOURCES);
+      }
       InitializeListHead(&VarList->Link);
     }
     InsertTailList(&VarList->Link, &Node->Link);
Index: Application/Shell/ShellManParser.c
===================================================================
--- Application/Shell/ShellManParser.c	(revision 15883)
+++ Application/Shell/ShellManParser.c	(working copy)
@@ -1,7 +1,7 @@
 /** @file
   Provides interface to shell MAN file parser.
 
-  Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
   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
@@ -39,15 +39,12 @@
   // Fix the file name
   //
   if (StrnCmp(ManFileName+StrLen(ManFileName)-4, L".man", 4)==0) {
-    Buffer = AllocateZeroPool(StrSize(ManFileName));
-    if (Buffer != NULL) {
-      StrCpy(Buffer, ManFileName);
-    }
+    Buffer = AllocateCopyPool(StrSize(ManFileName), ManFileName);
   } else {
     Buffer = AllocateZeroPool(StrSize(ManFileName) + 4*sizeof(CHAR16));
     if (Buffer != NULL) {
-      StrCpy(Buffer, ManFileName);
-      StrCat(Buffer, L".man");
+      StrnCpy(Buffer, ManFileName, StrLen(ManFileName));
+      StrnCat(Buffer, L".man", 4);
     }
   }
   return (Buffer);
@@ -374,6 +371,7 @@
   CHAR16        *TitleString;
   CHAR16        *TitleEnd;
   CHAR16        *CurrentLocation;
+  UINTN         TitleLength;
 
   if ( Buffer     == NULL
     || Command    == NULL
@@ -384,13 +382,14 @@
 
   Status    = EFI_SUCCESS;
 
-  TitleString = AllocateZeroPool((7*sizeof(CHAR16)) + StrSize(Command));
+  TitleLength = (7*sizeof(CHAR16)) + StrSize(Command);
+  TitleString = AllocateZeroPool(TitleLength);
   if (TitleString == NULL) {
     return (EFI_OUT_OF_RESOURCES);
   }
-  StrCpy(TitleString, L".TH ");
-  StrCat(TitleString, Command);
-  StrCat(TitleString, L" 0 ");
+  StrnCpy(TitleString, L".TH ", TitleLength/sizeof(CHAR16) - 1);
+  StrnCat(TitleString, Command, TitleLength/sizeof(CHAR16) - 1 - StrLen(TitleString));
+  StrnCat(TitleString, L" 0 " , TitleLength/sizeof(CHAR16) - 1 - StrLen(TitleString));
 
   CurrentLocation = StrStr(*Buffer, TitleString);
   if (CurrentLocation == NULL){
@@ -467,6 +466,7 @@
   CHAR16      *TitleEnd;
   UINTN       TitleLen;
   BOOLEAN     Found;
+  UINTN       TitleSize;
 
   if ( Handle     == NULL
     || Command    == NULL
@@ -484,13 +484,14 @@
     return (EFI_OUT_OF_RESOURCES);
   }
 
-  TitleString = AllocateZeroPool((4*sizeof(CHAR16)) + StrSize(Command));
+  TitleSize = (4*sizeof(CHAR16)) + StrSize(Command);
+  TitleString = AllocateZeroPool(TitleSize);
   if (TitleString == NULL) {
     FreePool(ReadLine);
     return (EFI_OUT_OF_RESOURCES);
   }
-  StrCpy(TitleString, L".TH ");
-  StrCat(TitleString, Command);
+  StrnCpy(TitleString, L".TH ", TitleSize/sizeof(CHAR16) - 1);
+  StrnCat(TitleString, Command, TitleSize/sizeof(CHAR16) - 1 - StrLen(TitleString));
 
   TitleLen = StrLen(TitleString);
   for (;!ShellFileHandleEof(Handle);Size = 1024) {
@@ -526,7 +527,7 @@
           Status = EFI_OUT_OF_RESOURCES;
           break;
         }
-        StrCpy(*BriefDesc, TitleEnd);
+        StrnCpy(*BriefDesc, TitleEnd, (*BriefSize)/sizeof(CHAR16) - 1);
       }
       break;
     }
Index: Application/Shell/ShellParametersProtocol.c
===================================================================
--- Application/Shell/ShellParametersProtocol.c	(revision 15883)
+++ Application/Shell/ShellParametersProtocol.c	(working copy)
@@ -35,8 +35,9 @@
 VOID
 EFIAPI
 GetNextParameter(
-  CHAR16 **Walker,
-  CHAR16 **TempParameter
+  IN OUT CHAR16   **Walker,
+  IN OUT CHAR16   **TempParameter,
+  IN CONST UINTN  Length
   )
 {
   CHAR16 *NextDelim;
@@ -82,7 +83,7 @@
       //
       // found ""
       //
-      StrCpy(*TempParameter, L"");
+      *(*TempParameter) = CHAR_NULL;
       *Walker = NextDelim + 1;
     } else if (NextDelim != NULL) {
 
@@ -95,7 +96,7 @@
       //
       // last one... someone forgot the training quote!
       //
-      StrCpy(*TempParameter, *Walker);
+      StrnCpy(*TempParameter, *Walker, Length/sizeof(CHAR16) - 1);
       *Walker = NULL;
     }
     for (TempLoc = *TempParameter ; TempLoc != NULL && *TempLoc != CHAR_NULL ; TempLoc++) {
@@ -117,7 +118,7 @@
       //
       // last one.
       //
-      StrCpy(*TempParameter, *Walker);
+      StrnCpy(*TempParameter, *Walker, Length/sizeof(CHAR16) - 1);
       *Walker = NULL;
     }
     for (NextDelim = *TempParameter ; NextDelim != NULL && *NextDelim != CHAR_NULL ; NextDelim++) {
@@ -181,17 +182,10 @@
   for ( Count = 0
       , Walker = (CHAR16*)CommandLine
       ; Walker != NULL && *Walker != CHAR_NULL
-      ; GetNextParameter(&Walker, &TempParameter)
+      ; GetNextParameter(&Walker, &TempParameter, Size)
       , Count++
      );
 
-/*  Count = 0;
-  Walker = (CHAR16*)CommandLine;
-  while(Walker != NULL) {
-    GetNextParameter(&Walker, &TempParameter);
-    Count++;
-  }
-*/
   //
   // lets allocate the pointer array
   //
@@ -205,10 +199,12 @@
   Walker = (CHAR16*)CommandLine;
   while(Walker != NULL && *Walker != CHAR_NULL) {
     SetMem16(TempParameter, Size, CHAR_NULL);
-    GetNextParameter(&Walker, &TempParameter);
-    NewParam = AllocateZeroPool(StrSize(TempParameter));
-    ASSERT(NewParam != NULL);
-    StrCpy(NewParam, TempParameter);
+    GetNextParameter(&Walker, &TempParameter, Size);
+    NewParam = AllocateCopyPool(StrSize(TempParameter), TempParameter);
+    if (NewParam == NULL){
+      SHELL_FREE_NON_NULL(TempParameter);
+      return (EFI_OUT_OF_RESOURCES);
+    }
     ((CHAR16**)(*Argv))[(*Argc)] = NewParam;
     (*Argc)++;
   }
@@ -977,7 +973,7 @@
   //
   // re-populate the string to support any filenames that were in quotes.
   //
-  StrCpy(CommandLineCopy, NewCommandLine);
+  StrnCpy(CommandLineCopy, NewCommandLine, StrLen(NewCommandLine));
 
   if (FirstLocation != CommandLineCopy + StrLen(CommandLineCopy)
     && ((UINTN)(FirstLocation - CommandLineCopy) < StrLen(NewCommandLine))
Index: Application/Shell/ShellParametersProtocol.h
===================================================================
--- Application/Shell/ShellParametersProtocol.h	(revision 15883)
+++ Application/Shell/ShellParametersProtocol.h	(working copy)
@@ -190,13 +190,15 @@
   @param[in, out] Walker        pointer to string of command line.  Adjusted to
                                 reminaing command line on return
   @param[in, out] TempParameter pointer to string of command line item extracted.
+  @param[in]      Length        Length of (*TempParameter) in bytes
 
 **/
 VOID
 EFIAPI
 GetNextParameter(
-  CHAR16 **Walker,
-  CHAR16 **TempParameter
+  IN OUT CHAR16   **Walker,
+  IN OUT CHAR16   **TempParameter,
+  IN CONST UINTN  Length
   );
 
 #endif //_SHELL_PARAMETERS_PROTOCOL_PROVIDER_HEADER_
Index: Application/Shell/ShellProtocol.c
===================================================================
--- Application/Shell/ShellProtocol.c	(revision 15883)
+++ Application/Shell/ShellProtocol.c	(working copy)
@@ -530,18 +530,17 @@
     if (Cwd == NULL) {
       return (NULL);
     }
-    Size = StrSize(Cwd);
-    Size += StrSize(Path);
+    Size = StrSize(Cwd) + StrSize(Path) - sizeof(CHAR16);
     NewPath = AllocateZeroPool(Size);
     if (NewPath == NULL) {
       return (NULL);
     }
-    StrCpy(NewPath, Cwd);
+    StrnCpy(NewPath, Cwd, Size/sizeof(CHAR16)-1);
     if (*Path == L'\\') {
       Path++;
       while (PathRemoveLastItem(NewPath)) ;
     }
-    StrCat(NewPath, Path);
+    StrnCat(NewPath, Path, Size/sizeof(CHAR16) - 1 - StrLen(NewPath));
     DevicePathForReturn = EfiShellGetDevicePathFromFilePath(NewPath);
     FreePool(NewPath);
     return (DevicePathForReturn);
@@ -1846,10 +1845,9 @@
   if (NewNode == NULL) {
     return (NULL);
   }
-  NewNode->FullName = AllocateZeroPool(StrSize(Node->FullName));
-
-  NewNode->FileName = AllocateZeroPool(StrSize(Node->FileName));
-  NewNode->Info     = AllocateZeroPool((UINTN)Node->Info->Size);
+  NewNode->FullName = AllocateCopyPool(StrSize(Node->FullName), Node->FullName);
+  NewNode->FileName = AllocateCopyPool(StrSize(Node->FileName), Node->FileName);
+  NewNode->Info     = AllocateCopyPool((UINTN)Node->Info->Size, Node->Info);
   if ( NewNode->FullName == NULL
     || NewNode->FileName == NULL
     || NewNode->Info == NULL
@@ -1865,9 +1863,6 @@
   if (!Save) {
     Node->Handle = NULL;
   }
-  StrCpy((CHAR16*)NewNode->FullName, Node->FullName);
-  StrCpy((CHAR16*)NewNode->FileName, Node->FileName);
-  CopyMem(NewNode->Info, Node->Info, (UINTN)Node->Info->Size);
 
   return((EFI_SHELL_FILE_INFO*)NewNode);
 }
@@ -2055,7 +2050,7 @@
   }
   SHELL_FREE_NON_NULL(BasePath);
   return(Status);
-}
+  }
 
 /**
   Get the GUID value from a human readable name.
@@ -2313,8 +2308,8 @@
             if (NewFullName == NULL) {
               Status = EFI_OUT_OF_RESOURCES;
             } else {
-              StrCpy(NewFullName, MapName);
-              StrCat(NewFullName, ShellInfoNode->FullName+1);
+              StrnCpy(NewFullName, MapName, Size/sizeof(CHAR16)-1);
+              StrnCat(NewFullName, ShellInfoNode->FullName+1, (Size/sizeof(CHAR16))-StrLen(NewFullName)-1);
               FreePool((VOID*)ShellInfoNode->FullName);
               ShellInfoNode->FullName = NewFullName;
             }
@@ -2437,11 +2432,10 @@
   RootDevicePath = NULL;
   RootFileHandle = NULL;
   MapName        = NULL;
-  PatternCopy = AllocateZeroPool(StrSize(FilePattern));
+  PatternCopy = AllocateCopyPool(StrSize(FilePattern), FilePattern);
   if (PatternCopy == NULL) {
     return (EFI_OUT_OF_RESOURCES);
   }
-  StrCpy(PatternCopy, FilePattern);
 
   PatternCopy = PathCleanUpDirectories(PatternCopy);
 
@@ -2645,7 +2639,7 @@
       ; Node = (ENV_VAR_LIST*)GetNextNode(&List, &Node->Link)
      ){
       ASSERT(Node->Key != NULL);
-      StrCpy(CurrentWriteLocation, Node->Key);
+      StrnCpy(CurrentWriteLocation, Node->Key,  (Size)/sizeof(CHAR16) - (CurrentWriteLocation - ((CHAR16*)Buffer)) - 1);
       CurrentWriteLocation += StrLen(CurrentWriteLocation) + 1;
     }
 
@@ -2669,7 +2663,6 @@
       // Allocate the space and recall the get function
       //
       Buffer = AllocateZeroPool(Size);
-      ASSERT(Buffer != NULL);
       Status = SHELL_GET_ENVIRONMENT_VARIABLE_AND_ATTRIBUTES(Name, Attributes, &Size, Buffer);
     }
     //
