VOID\r
EFIAPI\r
GetNextParameter(\r
- CHAR16 **Walker,\r
- CHAR16 **TempParameter\r
+ IN OUT CHAR16 **Walker,\r
+ IN OUT CHAR16 **TempParameter,\r
+ IN CONST UINTN Length\r
)\r
{\r
CHAR16 *NextDelim;\r
//\r
// found ""\r
//\r
- StrCpy(*TempParameter, L"");\r
+ *(*TempParameter) = CHAR_NULL;\r
*Walker = NextDelim + 1;\r
} else if (NextDelim != NULL) {\r
- StrnCpy(*TempParameter, (*Walker)+1, NextDelim - ((*Walker)+1));\r
+\r
+ //\r
+ // Copy ensuring that both quotes are left in place.\r
+ //\r
+ StrnCpy(*TempParameter, (*Walker), NextDelim - *Walker + 1);\r
*Walker = NextDelim + 1;\r
} else {\r
//\r
// last one... someone forgot the training quote!\r
//\r
- StrCpy(*TempParameter, *Walker);\r
+ StrnCpy(*TempParameter, *Walker, Length/sizeof(CHAR16) - 1);\r
*Walker = NULL;\r
}\r
for (TempLoc = *TempParameter ; TempLoc != NULL && *TempLoc != CHAR_NULL ; TempLoc++) {\r
//\r
// last one.\r
//\r
- StrCpy(*TempParameter, *Walker);\r
+ StrnCpy(*TempParameter, *Walker, Length/sizeof(CHAR16) - 1);\r
*Walker = NULL;\r
}\r
for (NextDelim = *TempParameter ; NextDelim != NULL && *NextDelim != CHAR_NULL ; NextDelim++) {\r
for ( Count = 0\r
, Walker = (CHAR16*)CommandLine\r
; Walker != NULL && *Walker != CHAR_NULL\r
- ; GetNextParameter(&Walker, &TempParameter)\r
+ ; GetNextParameter(&Walker, &TempParameter, Size)\r
, Count++\r
);\r
\r
-/* Count = 0;\r
- Walker = (CHAR16*)CommandLine;\r
- while(Walker != NULL) {\r
- GetNextParameter(&Walker, &TempParameter);\r
- Count++;\r
- }\r
-*/\r
//\r
// lets allocate the pointer array\r
//\r
Walker = (CHAR16*)CommandLine;\r
while(Walker != NULL && *Walker != CHAR_NULL) {\r
SetMem16(TempParameter, Size, CHAR_NULL);\r
- GetNextParameter(&Walker, &TempParameter);\r
- NewParam = AllocateZeroPool(StrSize(TempParameter));\r
- ASSERT(NewParam != NULL);\r
- StrCpy(NewParam, TempParameter);\r
+ GetNextParameter(&Walker, &TempParameter, Size);\r
+ NewParam = AllocateCopyPool(StrSize(TempParameter), TempParameter);\r
+ if (NewParam == NULL){\r
+ SHELL_FREE_NON_NULL(TempParameter);\r
+ return (EFI_OUT_OF_RESOURCES);\r
+ }\r
((CHAR16**)(*Argv))[(*Argc)] = NewParam;\r
(*Argc)++;\r
}\r
\r
@return Status code from ShellInfoObject.NewEfiShellProtocol->WriteFile.\r
**/\r
-STATIC\r
EFI_STATUS\r
WriteFileTag (\r
IN SHELL_FILE_HANDLE FileHandle\r
//\r
// re-populate the string to support any filenames that were in quotes.\r
//\r
- StrCpy(CommandLineCopy, NewCommandLine);\r
+ StrnCpy(CommandLineCopy, NewCommandLine, StrLen(NewCommandLine));\r
\r
if (FirstLocation != CommandLineCopy + StrLen(CommandLineCopy)\r
&& ((UINTN)(FirstLocation - CommandLineCopy) < StrLen(NewCommandLine))\r
} else if (!OutAppend && OutUnicode && !EFI_ERROR(Status)) {\r
Status = WriteFileTag (TempHandle);\r
} else if (OutAppend) {\r
- //\r
- // Move to end of file\r
- //\r
Status = ShellInfoObject.NewEfiShellProtocol->GetFileSize(TempHandle, &FileSize);\r
if (!EFI_ERROR(Status)) {\r
- Status = ShellInfoObject.NewEfiShellProtocol->SetFilePosition(TempHandle, FileSize);\r
+ //\r
+ // When appending to a new unicode file, write the file tag.\r
+ // Otherwise (ie. when appending to a new ASCII file, or an\r
+ // existent file with any encoding), just seek to the end.\r
+ //\r
+ Status = (FileSize == 0 && OutUnicode) ?\r
+ WriteFileTag (TempHandle) :\r
+ ShellInfoObject.NewEfiShellProtocol->SetFilePosition (\r
+ TempHandle,\r
+ FileSize);\r
}\r
}\r
if (!OutUnicode && !EFI_ERROR(Status)) {\r