//\r
// allocate new space to copy strings and structure\r
//\r
- NewInfo->FullName = AllocateZeroPool(StrSize(OldInfo->FullName));\r
- NewInfo->FileName = AllocateZeroPool(StrSize(OldInfo->FileName));\r
- NewInfo->Info = AllocateZeroPool((UINTN)OldInfo->Info->Size);\r
+ NewInfo->FullName = AllocateCopyPool(StrSize(OldInfo->FullName), OldInfo->FullName);\r
+ NewInfo->FileName = AllocateCopyPool(StrSize(OldInfo->FileName), OldInfo->FileName);\r
+ NewInfo->Info = AllocateCopyPool((UINTN)OldInfo->Info->Size, OldInfo->Info);\r
\r
//\r
// make sure all the memory allocations were sucessful\r
//\r
if (NULL == NewInfo->FullName || NewInfo->FileName == NULL || NewInfo->Info == NULL) {\r
+ //\r
+ // Free the partially allocated new node\r
+ //\r
+ SHELL_FREE_NON_NULL(NewInfo->FullName);\r
+ SHELL_FREE_NON_NULL(NewInfo->FileName);\r
+ SHELL_FREE_NON_NULL(NewInfo->Info);\r
+ SHELL_FREE_NON_NULL(NewInfo);\r
+\r
+ //\r
+ // Free the previously converted stuff\r
+ //\r
ShellCloseFileMetaArg((EFI_SHELL_FILE_INFO**)(&ListHead));\r
ListHead = NULL;\r
break;\r
}\r
\r
- //\r
- // Copt the strings and structure\r
- //\r
- StrCpy(NewInfo->FullName, OldInfo->FullName);\r
- StrCpy(NewInfo->FileName, OldInfo->FileName);\r
- gBS->CopyMem (NewInfo->Info, OldInfo->Info, (UINTN)OldInfo->Info->Size);\r
-\r
//\r
// add that to the list\r
//\r
{\r
EFI_STATUS Status;\r
LIST_ENTRY mOldStyleFileList;\r
+ CHAR16 *CleanFilePathStr;\r
\r
//\r
// ASSERT that Arg and ListHead are not NULL\r
ASSERT(Arg != NULL);\r
ASSERT(ListHead != NULL);\r
\r
+ Status = InternalShellStripQuotes (Arg, &CleanFilePathStr);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
//\r
// Check for UEFI Shell 2.0 protocols\r
//\r
if (*ListHead == NULL) {\r
*ListHead = (EFI_SHELL_FILE_INFO*)AllocateZeroPool(sizeof(EFI_SHELL_FILE_INFO));\r
if (*ListHead == NULL) {\r
+ FreePool(CleanFilePathStr);\r
return (EFI_OUT_OF_RESOURCES);\r
}\r
InitializeListHead(&((*ListHead)->Link));\r
}\r
- Status = gEfiShellProtocol->OpenFileList(Arg,\r
+ Status = gEfiShellProtocol->OpenFileList(CleanFilePathStr,\r
OpenMode,\r
ListHead);\r
if (EFI_ERROR(Status)) {\r
}\r
if (*ListHead != NULL && IsListEmpty(&(*ListHead)->Link)) {\r
FreePool(*ListHead);\r
+ FreePool(CleanFilePathStr);\r
*ListHead = NULL;\r
return (EFI_NOT_FOUND);\r
}\r
+ FreePool(CleanFilePathStr);\r
return (Status);\r
}\r
\r
//\r
// Get the EFI Shell list of files\r
//\r
- Status = mEfiShellEnvironment2->FileMetaArg(Arg, &mOldStyleFileList);\r
+ Status = mEfiShellEnvironment2->FileMetaArg(CleanFilePathStr, &mOldStyleFileList);\r
if (EFI_ERROR(Status)) {\r
*ListHead = NULL;\r
+ FreePool(CleanFilePathStr);\r
return (Status);\r
}\r
\r
if (*ListHead == NULL) {\r
*ListHead = (EFI_SHELL_FILE_INFO *)AllocateZeroPool(sizeof(EFI_SHELL_FILE_INFO));\r
if (*ListHead == NULL) {\r
+ FreePool(CleanFilePathStr);\r
return (EFI_OUT_OF_RESOURCES);\r
}\r
InitializeListHead(&((*ListHead)->Link));\r
*ListHead = NULL;\r
Status = EFI_NOT_FOUND;\r
}\r
+ FreePool(CleanFilePathStr);\r
return (Status);\r
}\r
\r
+ FreePool(CleanFilePathStr);\r
return (EFI_UNSUPPORTED);\r
}\r
/**\r
if (TestPath == NULL) {\r
return (NULL);\r
}\r
- StrCpy(TestPath, Path);\r
- StrCat(TestPath, FileName);\r
+ StrnCpy(TestPath, Path, Size/sizeof(CHAR16) - 1);\r
+ StrnCat(TestPath, FileName, Size/sizeof(CHAR16) - 1 - StrLen(TestPath));\r
Status = ShellOpenFileByName(TestPath, &Handle, EFI_FILE_MODE_READ, 0);\r
if (!EFI_ERROR(Status)){\r
if (FileHandleIsDirectory(Handle) != EFI_SUCCESS) {\r
*TempChar = CHAR_NULL;\r
}\r
if (TestPath[StrLen(TestPath)-1] != L'\\') {\r
- StrCat(TestPath, L"\\");\r
+ StrnCat(TestPath, L"\\", Size/sizeof(CHAR16) - 1 - StrLen(TestPath));\r
}\r
if (FileName[0] == L'\\') {\r
FileName++;\r
}\r
- StrCat(TestPath, FileName);\r
+ StrnCat(TestPath, FileName, Size/sizeof(CHAR16) - 1 - StrLen(TestPath));\r
if (StrStr(Walker, L";") != NULL) {\r
Walker = StrStr(Walker, L";") + 1;\r
} else {\r
return (NULL);\r
}\r
for (ExtensionWalker = FileExtension, TempChar2 = (CHAR16*)FileExtension; TempChar2 != NULL ; ExtensionWalker = TempChar2 + 1){\r
- StrCpy(TestPath, FileName);\r
+ StrnCpy(TestPath, FileName, Size/sizeof(CHAR16) - 1);\r
if (ExtensionWalker != NULL) {\r
- StrCat(TestPath, ExtensionWalker);\r
+ StrnCat(TestPath, ExtensionWalker, Size/sizeof(CHAR16) - 1 - StrLen(TestPath));\r
}\r
TempChar = StrStr(TestPath, L";");\r
if (TempChar != NULL) {\r
UINTN ValueSize;\r
UINTN Count;\r
CONST CHAR16 *TempPointer;\r
+ UINTN CurrentValueSize;\r
\r
CurrentItemPackage = NULL;\r
GetItemValue = 0;\r
*CheckPackage = NULL;\r
return (EFI_OUT_OF_RESOURCES);\r
}\r
- CurrentItemPackage->Name = AllocateZeroPool(StrSize(Argv[LoopCounter]));\r
+ CurrentItemPackage->Name = AllocateCopyPool(StrSize(Argv[LoopCounter]), Argv[LoopCounter]);\r
if (CurrentItemPackage->Name == NULL) {\r
ShellCommandLineFreeVarList(*CheckPackage);\r
*CheckPackage = NULL;\r
return (EFI_OUT_OF_RESOURCES);\r
}\r
- StrCpy(CurrentItemPackage->Name, Argv[LoopCounter]);\r
CurrentItemPackage->Type = CurrentItemType;\r
CurrentItemPackage->OriginalPosition = (UINTN)(-1);\r
CurrentItemPackage->Value = NULL;\r
// get the item VALUE for a previous flag\r
//\r
if (StrStr(Argv[LoopCounter], L" ") == NULL) {\r
- CurrentItemPackage->Value = ReallocatePool(ValueSize, ValueSize + StrSize(Argv[LoopCounter]) + sizeof(CHAR16), CurrentItemPackage->Value);\r
+ CurrentValueSize = ValueSize + StrSize(Argv[LoopCounter]) + sizeof(CHAR16);\r
+ CurrentItemPackage->Value = ReallocatePool(ValueSize, CurrentValueSize, CurrentItemPackage->Value);\r
ASSERT(CurrentItemPackage->Value != NULL);\r
if (ValueSize == 0) {\r
- StrCpy(CurrentItemPackage->Value, Argv[LoopCounter]);\r
+ StrnCpy(CurrentItemPackage->Value, Argv[LoopCounter], CurrentValueSize/sizeof(CHAR16) - 1);\r
} else {\r
- StrCat(CurrentItemPackage->Value, L" ");\r
- StrCat(CurrentItemPackage->Value, Argv[LoopCounter]);\r
+ StrnCat(CurrentItemPackage->Value, L" ", CurrentValueSize/sizeof(CHAR16) - 1 - StrLen(CurrentItemPackage->Value));\r
+ StrnCat(CurrentItemPackage->Value, Argv[LoopCounter], CurrentValueSize/sizeof(CHAR16) - 1 - StrLen(CurrentItemPackage->Value));\r
}\r
ValueSize += StrSize(Argv[LoopCounter]) + sizeof(CHAR16);\r
} else {\r
//\r
// the parameter has spaces. must be quoted.\r
//\r
- CurrentItemPackage->Value = ReallocatePool(ValueSize, ValueSize + StrSize(Argv[LoopCounter]) + sizeof(CHAR16) + sizeof(CHAR16) + sizeof(CHAR16), CurrentItemPackage->Value);\r
+ CurrentValueSize = ValueSize + StrSize(Argv[LoopCounter]) + sizeof(CHAR16) + sizeof(CHAR16) + sizeof(CHAR16);\r
+ CurrentItemPackage->Value = ReallocatePool(ValueSize, CurrentValueSize, CurrentItemPackage->Value);\r
ASSERT(CurrentItemPackage->Value != NULL);\r
if (ValueSize == 0) {\r
- StrCpy(CurrentItemPackage->Value, L"\"");\r
- StrCat(CurrentItemPackage->Value, Argv[LoopCounter]);\r
- StrCat(CurrentItemPackage->Value, L"\"");\r
+ StrnCpy(CurrentItemPackage->Value, L"\"", CurrentValueSize/sizeof(CHAR16) - 1);\r
+ StrnCat(CurrentItemPackage->Value, Argv[LoopCounter], CurrentValueSize/sizeof(CHAR16) - 1 - StrLen(CurrentItemPackage->Value));\r
+ StrnCat(CurrentItemPackage->Value, L"\"", CurrentValueSize/sizeof(CHAR16) - 1 - StrLen(CurrentItemPackage->Value));\r
} else {\r
- StrCat(CurrentItemPackage->Value, L" ");\r
- StrCat(CurrentItemPackage->Value, L"\"");\r
- StrCat(CurrentItemPackage->Value, Argv[LoopCounter]);\r
- StrCat(CurrentItemPackage->Value, L"\"");\r
+ StrnCat(CurrentItemPackage->Value, L" ", CurrentValueSize/sizeof(CHAR16) - 1 - StrLen(CurrentItemPackage->Value));\r
+ StrnCat(CurrentItemPackage->Value, L"\"", CurrentValueSize/sizeof(CHAR16) - 1 - StrLen(CurrentItemPackage->Value));\r
+ StrnCat(CurrentItemPackage->Value, Argv[LoopCounter], CurrentValueSize/sizeof(CHAR16) - 1 - StrLen(CurrentItemPackage->Value));\r
+ StrnCat(CurrentItemPackage->Value, L"\"", CurrentValueSize/sizeof(CHAR16) - 1 - StrLen(CurrentItemPackage->Value));\r
}\r
ValueSize += StrSize(Argv[LoopCounter]) + sizeof(CHAR16);\r
}\r
}\r
CurrentItemPackage->Name = NULL;\r
CurrentItemPackage->Type = TypePosition;\r
- CurrentItemPackage->Value = AllocateZeroPool(StrSize(TempPointer));\r
+ CurrentItemPackage->Value = AllocateCopyPool(StrSize(TempPointer), TempPointer);\r
if (CurrentItemPackage->Value == NULL) {\r
ShellCommandLineFreeVarList(*CheckPackage);\r
*CheckPackage = NULL;\r
return (EFI_OUT_OF_RESOURCES);\r
}\r
- StrCpy(CurrentItemPackage->Value, TempPointer);\r
CurrentItemPackage->OriginalPosition = Count++;\r
InsertHeadList(*CheckPackage, &CurrentItemPackage->Link);\r
} else {\r
// this was a non-recognised flag... error!\r
//\r
if (ProblemParam != NULL) {\r
- *ProblemParam = AllocateZeroPool(StrSize(Argv[LoopCounter]));\r
- if (*ProblemParam != NULL) {\r
- StrCpy(*ProblemParam, Argv[LoopCounter]);\r
- }\r
+ *ProblemParam = AllocateCopyPool(StrSize(Argv[LoopCounter]), Argv[LoopCounter]);\r
}\r
ShellCommandLineFreeVarList(*CheckPackage);\r
*CheckPackage = NULL;\r
if (Replace == NULL) {\r
return (EFI_OUT_OF_RESOURCES);\r
}\r
- NewString = SetMem16(NewString, NewSize, CHAR_NULL);\r
+ NewString = ZeroMem(NewString, NewSize);\r
while (*SourceString != CHAR_NULL) {\r
//\r
// if we find the FindTarget and either Skip == FALSE or Skip and we\r
FreePool(Replace);\r
return (EFI_BUFFER_TOO_SMALL);\r
}\r
- StrCat(NewString, Replace);\r
+ StrnCat(NewString, Replace, NewSize/sizeof(CHAR16) - 1 - StrLen(NewString));\r
} else {\r
Size = StrSize(NewString);\r
if (Size + sizeof(CHAR16) > NewSize) {\r
return(Status);\r
\r
}\r
+\r
+/**\r
+ Cleans off all the quotes in the string.\r
+\r
+ @param[in] OriginalString pointer to the string to be cleaned.\r
+ @param[out] CleanString The new string with all quotes removed. \r
+ Memory allocated in the function and free \r
+ by caller.\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+InternalShellStripQuotes (\r
+ IN CONST CHAR16 *OriginalString,\r
+ OUT CHAR16 **CleanString\r
+ )\r
+{\r
+ CHAR16 *Walker;\r
+ \r
+ if (OriginalString == NULL || CleanString == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ *CleanString = AllocateCopyPool (StrSize (OriginalString), OriginalString);\r
+ if (*CleanString == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ for (Walker = *CleanString; Walker != NULL && *Walker != CHAR_NULL ; Walker++) {\r
+ if (*Walker == L'\"') {\r
+ CopyMem(Walker, Walker+1, StrSize(Walker) - sizeof(Walker[0]));\r
+ }\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r