summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ShellPkg/Application/Shell/FileHandleWrappers.c11
-rw-r--r--ShellPkg/Application/Shell/Shell.c53
-rw-r--r--ShellPkg/Application/Shell/ShellEnvVar.c46
-rw-r--r--ShellPkg/Application/Shell/ShellManParser.c36
-rw-r--r--ShellPkg/Application/Shell/ShellParametersProtocol.c32
-rw-r--r--ShellPkg/Application/Shell/ShellParametersProtocol.h6
-rw-r--r--ShellPkg/Application/Shell/ShellProtocol.c29
7 files changed, 115 insertions, 98 deletions
diff --git a/ShellPkg/Application/Shell/FileHandleWrappers.c b/ShellPkg/Application/Shell/FileHandleWrappers.c
index 59c1ee55ee..be786bb2b5 100644
--- a/ShellPkg/Application/Shell/FileHandleWrappers.c
+++ b/ShellPkg/Application/Shell/FileHandleWrappers.c
@@ -509,21 +509,20 @@ FileInterfaceStdInRead(
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 @@ CreateFileInterfaceEnv(
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
diff --git a/ShellPkg/Application/Shell/Shell.c b/ShellPkg/Application/Shell/Shell.c
index 1d3064531d..976c314cd3 100644
--- a/ShellPkg/Application/Shell/Shell.c
+++ b/ShellPkg/Application/Shell/Shell.c
@@ -937,7 +937,7 @@ ProcessCommandLine(
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 @@ ProcessCommandLine(
// We found `file-name`.
//
ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoStartup = 1;
-
- StrCpy (ShellInfoObject.ShellInitSettings.FileName, CurrentArg);
LoopVar++;
// Add `file-name-options`
@@ -1027,10 +1025,10 @@ DoStartupScript(
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 @@ AddLineToCommandHistory(
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 @@ ShellConvertAlias(
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 @@ ShellConvertVariables (
//
// 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 @@ ShellConvertVariables (
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"%");
+ *ItemTemp = L'%';
+ 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 @@ ShellConvertVariables (
; 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 @@ ShellConvertVariables (
// 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 @@ IsValidSplit(
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 @@ DoHelpUpdate(
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 @@ DoHelpUpdate(
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 @@ RunCommand(
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 @@ RunScriptFileHandle (
; // 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 @@ RunScriptFileHandle (
//
// 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 @@ RunScriptFileHandle (
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;
diff --git a/ShellPkg/Application/Shell/ShellEnvVar.c b/ShellPkg/Application/Shell/ShellEnvVar.c
index f40a867cc7..b94711142a 100644
--- a/ShellPkg/Application/Shell/ShellEnvVar.c
+++ b/ShellPkg/Application/Shell/ShellEnvVar.c
@@ -152,7 +152,7 @@ GetEnvironmentVariableList(
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 @@ GetEnvironmentVariableList(
}
}
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 @@ SetEnvironmentVariables(
UINTN CurrentCount;
ENV_VAR_LIST *VarList;
ENV_VAR_LIST *Node;
- UINTN NewSize;
VarList = NULL;
@@ -307,20 +305,44 @@ SetEnvironmentVariables(
}
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);
diff --git a/ShellPkg/Application/Shell/ShellManParser.c b/ShellPkg/Application/Shell/ShellManParser.c
index 525c9343bd..0cbfbaabba 100644
--- a/ShellPkg/Application/Shell/ShellManParser.c
+++ b/ShellPkg/Application/Shell/ShellManParser.c
@@ -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 @@ GetManFileName(
// 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,9 @@ ManBufferFindTitleSection(
CHAR16 *TitleString;
CHAR16 *TitleEnd;
CHAR16 *CurrentLocation;
+ UINTN TitleLength;
+ CONST CHAR16 StartString[] = L".TH ";
+ CONST CHAR16 EndString[] = L" 0 ";
if ( Buffer == NULL
|| Command == NULL
@@ -384,13 +384,17 @@ ManBufferFindTitleSection(
Status = EFI_SUCCESS;
- TitleString = AllocateZeroPool((7*sizeof(CHAR16)) + StrSize(Command));
+ //
+ // more characters for StartString and EndString
+ //
+ TitleLength = StrSize(Command) + (StrLen(StartString) + StrLen(EndString)) * sizeof(CHAR16);
+ TitleString = AllocateZeroPool(TitleLength);
if (TitleString == NULL) {
return (EFI_OUT_OF_RESOURCES);
}
- StrCpy(TitleString, L".TH ");
- StrCat(TitleString, Command);
- StrCat(TitleString, L" 0 ");
+ StrnCpy(TitleString, StartString, TitleLength/sizeof(CHAR16) - 1);
+ StrnCat(TitleString, Command, TitleLength/sizeof(CHAR16) - 1 - StrLen(TitleString));
+ StrnCat(TitleString, EndString, TitleLength/sizeof(CHAR16) - 1 - StrLen(TitleString));
CurrentLocation = StrStr(*Buffer, TitleString);
if (CurrentLocation == NULL){
@@ -467,6 +471,7 @@ ManFileFindTitleSection(
CHAR16 *TitleEnd;
UINTN TitleLen;
BOOLEAN Found;
+ UINTN TitleSize;
if ( Handle == NULL
|| Command == NULL
@@ -484,13 +489,14 @@ ManFileFindTitleSection(
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 +532,7 @@ ManFileFindTitleSection(
Status = EFI_OUT_OF_RESOURCES;
break;
}
- StrCpy(*BriefDesc, TitleEnd);
+ StrnCpy(*BriefDesc, TitleEnd, (*BriefSize)/sizeof(CHAR16) - 1);
}
break;
}
diff --git a/ShellPkg/Application/Shell/ShellParametersProtocol.c b/ShellPkg/Application/Shell/ShellParametersProtocol.c
index e052d24d5d..ff149009b1 100644
--- a/ShellPkg/Application/Shell/ShellParametersProtocol.c
+++ b/ShellPkg/Application/Shell/ShellParametersProtocol.c
@@ -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 @@ GetNextParameter(
//
// found ""
//
- StrCpy(*TempParameter, L"");
+ *(*TempParameter) = CHAR_NULL;
*Walker = NextDelim + 1;
} else if (NextDelim != NULL) {
@@ -95,7 +96,7 @@ GetNextParameter(
//
// 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 @@ GetNextParameter(
//
// 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 @@ ParseCommandLineToArgs(
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 @@ ParseCommandLineToArgs(
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)++;
}
@@ -976,7 +972,7 @@ UpdateStdInStdOutStdErr(
//
// 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))
diff --git a/ShellPkg/Application/Shell/ShellParametersProtocol.h b/ShellPkg/Application/Shell/ShellParametersProtocol.h
index e2d28816d2..15b76b7691 100644
--- a/ShellPkg/Application/Shell/ShellParametersProtocol.h
+++ b/ShellPkg/Application/Shell/ShellParametersProtocol.h
@@ -190,13 +190,15 @@ ParseCommandLineToArgs(
@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_
diff --git a/ShellPkg/Application/Shell/ShellProtocol.c b/ShellPkg/Application/Shell/ShellProtocol.c
index 9b7b893fe3..a44afde436 100644
--- a/ShellPkg/Application/Shell/ShellProtocol.c
+++ b/ShellPkg/Application/Shell/ShellProtocol.c
@@ -530,18 +530,17 @@ EfiShellGetDevicePathFromFilePath(
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 @@ InternalDuplicateShellFileInfo(
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 @@ InternalDuplicateShellFileInfo(
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 @@ EfiShellFindFilesInDir(
}
SHELL_FREE_NON_NULL(BasePath);
return(Status);
-}
+ }
/**
Get the GUID value from a human readable name.
@@ -2313,8 +2308,8 @@ ShellSearchHandle(
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 @@ EfiShellFindFiles(
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 @@ EfiShellGetEnvEx(
; 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 @@ EfiShellGetEnvEx(
// 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);
}
//