/** @file\r
This is THE shell (application)\r
\r
- Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2009 - 2019, Intel Corporation. All rights reserved.<BR>\r
(C) Copyright 2013-2014 Hewlett-Packard Development Company, L.P.<BR>\r
+ Copyright 2015-2018 Dell Technologies.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
) == 0) {\r
ShellInfoObject.ShellInitSettings.BitUnion.Bits.Delay = TRUE;\r
// Check for optional delay value following "-delay"\r
- DelayValueStr = gEfiShellParametersProtocol->Argv[LoopVar + 1];\r
+ if ((LoopVar + 1) >= gEfiShellParametersProtocol->Argc) {\r
+ DelayValueStr = NULL;\r
+ } else {\r
+ DelayValueStr = gEfiShellParametersProtocol->Argv[LoopVar + 1];\r
+ }\r
if (DelayValueStr != NULL){\r
if (*DelayValueStr == L':') {\r
DelayValueStr++;\r
*TempSpot = CHAR_NULL;\r
}\r
\r
+ InternalEfiShellSetEnv(L"homefilesystem", StartupScriptPath, TRUE);\r
+\r
StartupScriptPath = StrnCatGrow (&StartupScriptPath, &Size, ((FILEPATH_DEVICE_PATH *)FileDevicePath)->PathName, 0);\r
PathRemoveLastItem (StartupScriptPath);\r
StartupScriptPath = StrnCatGrow (&StartupScriptPath, &Size, mStartupScript, 0);\r
UINTN Delay;\r
EFI_INPUT_KEY Key;\r
CHAR16 *FileStringPath;\r
+ CHAR16 *FullFileStringPath;\r
UINTN NewSize;\r
\r
Key.UnicodeChar = CHAR_NULL;\r
\r
FileStringPath = LocateStartupScript (ImagePath, FilePath);\r
if (FileStringPath != NULL) {\r
- Status = RunScriptFile (FileStringPath, NULL, L"", ShellInfoObject.NewShellParametersProtocol);\r
+ FullFileStringPath = FullyQualifyPath(FileStringPath);\r
+ if (FullFileStringPath == NULL) {\r
+ Status = RunScriptFile (FileStringPath, NULL, FileStringPath, ShellInfoObject.NewShellParametersProtocol);\r
+ } else {\r
+ Status = RunScriptFile (FullFileStringPath, NULL, FullFileStringPath, ShellInfoObject.NewShellParametersProtocol);\r
+ FreePool(FullFileStringPath);\r
+ }\r
FreePool (FileStringPath);\r
} else {\r
//\r
EFI_STATUS Status;\r
EFI_STATUS StartStatus;\r
CHAR16 *CommandWithPath;\r
+ CHAR16 *FullCommandWithPath;\r
EFI_DEVICE_PATH_PROTOCOL *DevPath;\r
SHELL_STATUS CalleeExitStatus;\r
\r
}\r
switch (Type) {\r
case Script_File_Name:\r
- Status = RunScriptFile (CommandWithPath, NULL, CmdLine, ParamProtocol);\r
+ FullCommandWithPath = FullyQualifyPath(CommandWithPath);\r
+ if (FullCommandWithPath == NULL) {\r
+ Status = RunScriptFile (CommandWithPath, NULL, CmdLine, ParamProtocol);\r
+ } else {\r
+ Status = RunScriptFile (FullCommandWithPath, NULL, CmdLine, ParamProtocol);\r
+ FreePool(FullCommandWithPath);\r
+ }\r
break;\r
case Efi_Application:\r
//\r
return (RunShellCommand(CmdLine, NULL));\r
}\r
\r
-\r
-STATIC CONST UINT16 InvalidChars[] = {L'*', L'?', L'<', L'>', L'\\', L'/', L'\"', 0x0001, 0x0002};\r
-/**\r
- Function determines if the CommandName COULD be a valid command. It does not determine whether\r
- this is a valid command. It only checks for invalid characters.\r
-\r
- @param[in] CommandName The name to check\r
-\r
- @retval TRUE CommandName could be a command name\r
- @retval FALSE CommandName could not be a valid command name\r
-**/\r
-BOOLEAN\r
-IsValidCommandName(\r
- IN CONST CHAR16 *CommandName\r
- )\r
-{\r
- UINTN Count;\r
- if (CommandName == NULL) {\r
- ASSERT(FALSE);\r
- return (FALSE);\r
- }\r
- for ( Count = 0\r
- ; Count < sizeof(InvalidChars) / sizeof(InvalidChars[0])\r
- ; Count++\r
- ){\r
- if (ScanMem16(CommandName, StrSize(CommandName), InvalidChars[Count]) != NULL) {\r
- return (FALSE);\r
- }\r
- }\r
- return (TRUE);\r
-}\r
-\r
/**\r
Function to process a NSH script file via SHELL_FILE_HANDLE.\r
\r
DeleteScriptFileStruct(NewScriptFile);\r
return (EFI_OUT_OF_RESOURCES);\r
}\r
- for (LoopVar = 0 ; LoopVar < 10 && LoopVar < NewScriptFile->Argc; LoopVar++) {\r
+ //\r
+ // Put the full path of the script file into Argv[0] as required by section\r
+ // 3.6.2 of version 2.2 of the shell specification.\r
+ //\r
+ NewScriptFile->Argv[0] = StrnCatGrow(&NewScriptFile->Argv[0], NULL, NewScriptFile->ScriptName, 0);\r
+ for (LoopVar = 1 ; LoopVar < 10 && LoopVar < NewScriptFile->Argc; LoopVar++) {\r
ASSERT(NewScriptFile->Argv[LoopVar] == NULL);\r
NewScriptFile->Argv[LoopVar] = StrnCatGrow(&NewScriptFile->Argv[LoopVar], NULL, ShellInfoObject.NewShellParametersProtocol->Argv[LoopVar], 0);\r
if (NewScriptFile->Argv[LoopVar] == NULL) {\r