Revision: 15839
http://sourceforge.net/p/edk2/code/15839
Author: jcarsey
Date: 2014-08-19 21:00:34 +0000 (Tue, 19 Aug 2014)
Log Message:
-----------
ShellPkg: Refactor string manipulation in UefiShellLib command
This patch replaces StrCpy with StrnCpy or refactors out the usage of StrCpy
through some other means.
This patch replaces StrCat with StrnCat or refactors out the usage of StrCat
through some other means.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jaben Carsey <[email protected]>
Reviewed-by: Erik Bjorge <[email protected]>
Modified Paths:
--------------
trunk/edk2/ShellPkg/Library/UefiShellLib/UefiShellLib.c
Modified: trunk/edk2/ShellPkg/Library/UefiShellLib/UefiShellLib.c
===================================================================
--- trunk/edk2/ShellPkg/Library/UefiShellLib/UefiShellLib.c 2014-08-19
20:58:03 UTC (rev 15838)
+++ trunk/edk2/ShellPkg/Library/UefiShellLib/UefiShellLib.c 2014-08-19
21:00:34 UTC (rev 15839)
@@ -1430,27 +1430,31 @@
//
// allocate new space to copy strings and structure
//
- NewInfo->FullName = AllocateZeroPool(StrSize(OldInfo->FullName));
- NewInfo->FileName = AllocateZeroPool(StrSize(OldInfo->FileName));
- NewInfo->Info = AllocateZeroPool((UINTN)OldInfo->Info->Size);
+ NewInfo->FullName = AllocateCopyPool(StrSize(OldInfo->FullName),
OldInfo->FullName);
+ NewInfo->FileName = AllocateCopyPool(StrSize(OldInfo->FileName),
OldInfo->FileName);
+ NewInfo->Info = AllocateCopyPool((UINTN)OldInfo->Info->Size,
OldInfo->Info);
//
// make sure all the memory allocations were sucessful
//
if (NULL == NewInfo->FullName || NewInfo->FileName == NULL ||
NewInfo->Info == NULL) {
+ //
+ // Free the partially allocated new node
+ //
+ SHELL_FREE_NON_NULL(NewInfo->FullName);
+ SHELL_FREE_NON_NULL(NewInfo->FileName);
+ SHELL_FREE_NON_NULL(NewInfo->Info);
+ SHELL_FREE_NON_NULL(NewInfo);
+
+ //
+ // Free the previously converted stuff
+ //
ShellCloseFileMetaArg((EFI_SHELL_FILE_INFO**)(&ListHead));
ListHead = NULL;
break;
}
//
- // Copt the strings and structure
- //
- StrCpy(NewInfo->FullName, OldInfo->FullName);
- StrCpy(NewInfo->FileName, OldInfo->FileName);
- gBS->CopyMem (NewInfo->Info, OldInfo->Info, (UINTN)OldInfo->Info->Size);
-
- //
// add that to the list
//
InsertTailList(ListHead, &NewInfo->Link);
@@ -1671,8 +1675,8 @@
if (TestPath == NULL) {
return (NULL);
}
- StrCpy(TestPath, Path);
- StrCat(TestPath, FileName);
+ StrnCpy(TestPath, Path, Size/sizeof(CHAR16) - 1);
+ StrnCat(TestPath, FileName, Size/sizeof(CHAR16) - 1 - StrLen(TestPath));
Status = ShellOpenFileByName(TestPath, &Handle, EFI_FILE_MODE_READ, 0);
if (!EFI_ERROR(Status)){
if (FileHandleIsDirectory(Handle) != EFI_SUCCESS) {
@@ -1704,12 +1708,12 @@
*TempChar = CHAR_NULL;
}
if (TestPath[StrLen(TestPath)-1] != L'\\') {
- StrCat(TestPath, L"\\");
+ StrnCat(TestPath, L"\\", Size/sizeof(CHAR16) - 1 - StrLen(TestPath));
}
if (FileName[0] == L'\\') {
FileName++;
}
- StrCat(TestPath, FileName);
+ StrnCat(TestPath, FileName, Size/sizeof(CHAR16) - 1 -
StrLen(TestPath));
if (StrStr(Walker, L";") != NULL) {
Walker = StrStr(Walker, L";") + 1;
} else {
@@ -1778,9 +1782,9 @@
return (NULL);
}
for (ExtensionWalker = FileExtension, TempChar2 = (CHAR16*)FileExtension;
TempChar2 != NULL ; ExtensionWalker = TempChar2 + 1){
- StrCpy(TestPath, FileName);
+ StrnCpy(TestPath, FileName, Size/sizeof(CHAR16) - 1);
if (ExtensionWalker != NULL) {
- StrCat(TestPath, ExtensionWalker);
+ StrnCat(TestPath, ExtensionWalker, Size/sizeof(CHAR16) - 1 -
StrLen(TestPath));
}
TempChar = StrStr(TestPath, L";");
if (TempChar != NULL) {
@@ -1963,6 +1967,7 @@
UINTN ValueSize;
UINTN Count;
CONST CHAR16 *TempPointer;
+ UINTN CurrentValueSize;
CurrentItemPackage = NULL;
GetItemValue = 0;
@@ -2018,13 +2023,12 @@
*CheckPackage = NULL;
return (EFI_OUT_OF_RESOURCES);
}
- CurrentItemPackage->Name = AllocateZeroPool(StrSize(Argv[LoopCounter]));
+ CurrentItemPackage->Name = AllocateCopyPool(StrSize(Argv[LoopCounter]),
Argv[LoopCounter]);
if (CurrentItemPackage->Name == NULL) {
ShellCommandLineFreeVarList(*CheckPackage);
*CheckPackage = NULL;
return (EFI_OUT_OF_RESOURCES);
}
- StrCpy(CurrentItemPackage->Name, Argv[LoopCounter]);
CurrentItemPackage->Type = CurrentItemType;
CurrentItemPackage->OriginalPosition = (UINTN)(-1);
CurrentItemPackage->Value = NULL;
@@ -2062,30 +2066,32 @@
// get the item VALUE for a previous flag
//
if (StrStr(Argv[LoopCounter], L" ") == NULL) {
- CurrentItemPackage->Value = ReallocatePool(ValueSize, ValueSize +
StrSize(Argv[LoopCounter]) + sizeof(CHAR16), CurrentItemPackage->Value);
+ CurrentValueSize = ValueSize + StrSize(Argv[LoopCounter]) +
sizeof(CHAR16);
+ CurrentItemPackage->Value = ReallocatePool(ValueSize,
CurrentValueSize, CurrentItemPackage->Value);
ASSERT(CurrentItemPackage->Value != NULL);
if (ValueSize == 0) {
- StrCpy(CurrentItemPackage->Value, Argv[LoopCounter]);
+ StrnCpy(CurrentItemPackage->Value, Argv[LoopCounter],
CurrentValueSize/sizeof(CHAR16) - 1);
} else {
- StrCat(CurrentItemPackage->Value, L" ");
- StrCat(CurrentItemPackage->Value, Argv[LoopCounter]);
+ StrnCat(CurrentItemPackage->Value, L" ",
CurrentValueSize/sizeof(CHAR16) - 1 - StrLen(CurrentItemPackage->Value));
+ StrnCat(CurrentItemPackage->Value, Argv[LoopCounter],
CurrentValueSize/sizeof(CHAR16) - 1 - StrLen(CurrentItemPackage->Value));
}
ValueSize += StrSize(Argv[LoopCounter]) + sizeof(CHAR16);
} else {
//
// the parameter has spaces. must be quoted.
//
- CurrentItemPackage->Value = ReallocatePool(ValueSize, ValueSize +
StrSize(Argv[LoopCounter]) + sizeof(CHAR16) + sizeof(CHAR16) + sizeof(CHAR16),
CurrentItemPackage->Value);
+ CurrentValueSize = ValueSize + StrSize(Argv[LoopCounter]) +
sizeof(CHAR16) + sizeof(CHAR16) + sizeof(CHAR16);
+ CurrentItemPackage->Value = ReallocatePool(ValueSize,
CurrentValueSize, CurrentItemPackage->Value);
ASSERT(CurrentItemPackage->Value != NULL);
if (ValueSize == 0) {
- StrCpy(CurrentItemPackage->Value, L"\"");
- StrCat(CurrentItemPackage->Value, Argv[LoopCounter]);
- StrCat(CurrentItemPackage->Value, L"\"");
+ StrnCpy(CurrentItemPackage->Value, L"\"",
CurrentValueSize/sizeof(CHAR16) - 1);
+ StrnCat(CurrentItemPackage->Value, Argv[LoopCounter],
CurrentValueSize/sizeof(CHAR16) - 1 - StrLen(CurrentItemPackage->Value));
+ StrnCat(CurrentItemPackage->Value, L"\"",
CurrentValueSize/sizeof(CHAR16) - 1 - StrLen(CurrentItemPackage->Value));
} else {
- StrCat(CurrentItemPackage->Value, L" ");
- StrCat(CurrentItemPackage->Value, L"\"");
- StrCat(CurrentItemPackage->Value, Argv[LoopCounter]);
- StrCat(CurrentItemPackage->Value, L"\"");
+ StrnCat(CurrentItemPackage->Value, L" ",
CurrentValueSize/sizeof(CHAR16) - 1 - StrLen(CurrentItemPackage->Value));
+ StrnCat(CurrentItemPackage->Value, L"\"",
CurrentValueSize/sizeof(CHAR16) - 1 - StrLen(CurrentItemPackage->Value));
+ StrnCat(CurrentItemPackage->Value, Argv[LoopCounter],
CurrentValueSize/sizeof(CHAR16) - 1 - StrLen(CurrentItemPackage->Value));
+ StrnCat(CurrentItemPackage->Value, L"\"",
CurrentValueSize/sizeof(CHAR16) - 1 - StrLen(CurrentItemPackage->Value));
}
ValueSize += StrSize(Argv[LoopCounter]) + sizeof(CHAR16);
}
@@ -2113,13 +2119,12 @@
}
CurrentItemPackage->Name = NULL;
CurrentItemPackage->Type = TypePosition;
- CurrentItemPackage->Value = AllocateZeroPool(StrSize(TempPointer));
+ CurrentItemPackage->Value = AllocateCopyPool(StrSize(TempPointer),
TempPointer);
if (CurrentItemPackage->Value == NULL) {
ShellCommandLineFreeVarList(*CheckPackage);
*CheckPackage = NULL;
return (EFI_OUT_OF_RESOURCES);
}
- StrCpy(CurrentItemPackage->Value, TempPointer);
CurrentItemPackage->OriginalPosition = Count++;
InsertHeadList(*CheckPackage, &CurrentItemPackage->Link);
} else {
@@ -2127,10 +2132,7 @@
// this was a non-recognised flag... error!
//
if (ProblemParam != NULL) {
- *ProblemParam = AllocateZeroPool(StrSize(Argv[LoopCounter]));
- if (*ProblemParam != NULL) {
- StrCpy(*ProblemParam, Argv[LoopCounter]);
- }
+ *ProblemParam = AllocateCopyPool(StrSize(Argv[LoopCounter]),
Argv[LoopCounter]);
}
ShellCommandLineFreeVarList(*CheckPackage);
*CheckPackage = NULL;
@@ -2597,7 +2599,7 @@
if (Replace == NULL) {
return (EFI_OUT_OF_RESOURCES);
}
- NewString = SetMem16(NewString, NewSize, CHAR_NULL);
+ NewString = ZeroMem(NewString, NewSize);
while (*SourceString != CHAR_NULL) {
//
// if we find the FindTarget and either Skip == FALSE or Skip and we
@@ -2612,7 +2614,7 @@
FreePool(Replace);
return (EFI_BUFFER_TOO_SMALL);
}
- StrCat(NewString, Replace);
+ StrnCat(NewString, Replace, NewSize/sizeof(CHAR16) - 1 -
StrLen(NewString));
} else {
Size = StrSize(NewString);
if (Size + sizeof(CHAR16) > NewSize) {
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Slashdot TV.
Video for Nerds. Stuff that matters.
http://tv.slashdot.org/
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits