\r
STATIC CONST CHAR16 mScriptExtension[] = L".NSH";\r
STATIC CONST CHAR16 mExecutableExtensions[] = L".NSH;.EFI";\r
+STATIC CONST CHAR16 mStartupScript[] = L"startup.nsh";\r
\r
/**\r
The entry point for the application.\r
// Clear the screen\r
//\r
Status = gST->ConOut->ClearScreen(gST->ConOut);\r
- ASSERT_EFI_ERROR(Status);\r
+ if (EFI_ERROR(Status)) {\r
+ return (Status);\r
+ }\r
\r
//\r
// Populate the global structure from PCDs\r
// install our console logger. This will keep a log of the output for back-browsing\r
//\r
Status = ConsoleLoggerInstall(ShellInfoObject.LogScreenCount, &ShellInfoObject.ConsoleInfo);\r
- ASSERT_EFI_ERROR(Status);\r
-\r
- //\r
- // Enable the cursor to be visible\r
- //\r
- gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
+ if (!EFI_ERROR(Status)) {\r
+ //\r
+ // Enable the cursor to be visible\r
+ //\r
+ gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
\r
- //\r
- // If supporting EFI 1.1 we need to install HII protocol\r
- // only do this if PcdShellRequireHiiPlatform == FALSE\r
- //\r
- // remove EFI_UNSUPPORTED check above when complete.\r
- ///@todo add support for Framework HII\r
+ //\r
+ // If supporting EFI 1.1 we need to install HII protocol\r
+ // only do this if PcdShellRequireHiiPlatform == FALSE\r
+ //\r
+ // remove EFI_UNSUPPORTED check above when complete.\r
+ ///@todo add support for Framework HII\r
\r
- //\r
- // install our (solitary) HII package\r
- //\r
- ShellInfoObject.HiiHandle = HiiAddPackages (&gEfiCallerIdGuid, gImageHandle, ShellStrings, NULL);\r
- if (ShellInfoObject.HiiHandle == NULL) {\r
- if (PcdGetBool(PcdShellSupportFrameworkHii)) {\r
- ///@todo Add our package into Framework HII\r
- }\r
+ //\r
+ // install our (solitary) HII package\r
+ //\r
+ ShellInfoObject.HiiHandle = HiiAddPackages (&gEfiCallerIdGuid, gImageHandle, ShellStrings, NULL);\r
if (ShellInfoObject.HiiHandle == NULL) {\r
- return (EFI_NOT_STARTED);\r
+ if (PcdGetBool(PcdShellSupportFrameworkHii)) {\r
+ ///@todo Add our package into Framework HII\r
+ }\r
+ if (ShellInfoObject.HiiHandle == NULL) {\r
+ return (EFI_NOT_STARTED);\r
+ }\r
}\r
- }\r
\r
- //\r
- // create and install the EfiShellParametersProtocol\r
- //\r
- Status = CreatePopulateInstallShellParametersProtocol(&ShellInfoObject.NewShellParametersProtocol, &ShellInfoObject.RootShellInstance);\r
- ASSERT_EFI_ERROR(Status);\r
- ASSERT(ShellInfoObject.NewShellParametersProtocol != NULL);\r
-\r
- //\r
- // create and install the EfiShellProtocol\r
- //\r
- Status = CreatePopulateInstallShellProtocol(&ShellInfoObject.NewEfiShellProtocol);\r
- ASSERT_EFI_ERROR(Status);\r
- ASSERT(ShellInfoObject.NewEfiShellProtocol != NULL);\r
-\r
- //\r
- // Now initialize the shell library (it requires Shell Parameters protocol)\r
- //\r
- Status = ShellInitialize();\r
- ASSERT_EFI_ERROR(Status);\r
+ //\r
+ // create and install the EfiShellParametersProtocol\r
+ //\r
+ Status = CreatePopulateInstallShellParametersProtocol(&ShellInfoObject.NewShellParametersProtocol, &ShellInfoObject.RootShellInstance);\r
+ ASSERT_EFI_ERROR(Status);\r
+ ASSERT(ShellInfoObject.NewShellParametersProtocol != NULL);\r
\r
- Status = CommandInit();\r
- ASSERT_EFI_ERROR(Status);\r
+ //\r
+ // create and install the EfiShellProtocol\r
+ //\r
+ Status = CreatePopulateInstallShellProtocol(&ShellInfoObject.NewEfiShellProtocol);\r
+ ASSERT_EFI_ERROR(Status);\r
+ ASSERT(ShellInfoObject.NewEfiShellProtocol != NULL);\r
\r
- //\r
- // Check the command line\r
- //\r
- Status = ProcessCommandLine();\r
+ //\r
+ // Now initialize the shell library (it requires Shell Parameters protocol)\r
+ //\r
+ Status = ShellInitialize();\r
+ ASSERT_EFI_ERROR(Status);\r
\r
- //\r
- // If shell support level is >= 1 create the mappings and paths\r
- //\r
- if (PcdGet8(PcdShellSupportLevel) >= 1) {\r
- Status = ShellCommandCreateInitialMappingsAndPaths();\r
- }\r
+ Status = CommandInit();\r
+ ASSERT_EFI_ERROR(Status);\r
\r
- //\r
- // save the device path for the loaded image and the device path for the filepath (under loaded image)\r
- // These are where to look for the startup.nsh file\r
- //\r
- Status = GetDevicePathsForImageAndFile(&ShellInfoObject.ImageDevPath, &ShellInfoObject.FileDevPath);\r
- ASSERT_EFI_ERROR(Status);\r
+ //\r
+ // Check the command line\r
+ //\r
+ Status = ProcessCommandLine();\r
\r
- //\r
- // Display the version\r
- //\r
- if (!ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoVersion) {\r
- ShellPrintHiiEx (\r
- 0,\r
- gST->ConOut->Mode->CursorRow,\r
- NULL,\r
- STRING_TOKEN (STR_VER_OUTPUT_MAIN),\r
- ShellInfoObject.HiiHandle,\r
- SupportLevel[PcdGet8(PcdShellSupportLevel)],\r
- gEfiShellProtocol->MajorVersion,\r
- gEfiShellProtocol->MinorVersion,\r
- (gST->Hdr.Revision&0xffff0000)>>16,\r
- (gST->Hdr.Revision&0x0000ffff),\r
- gST->FirmwareVendor,\r
- gST->FirmwareRevision\r
- );\r
- }\r
+ //\r
+ // If shell support level is >= 1 create the mappings and paths\r
+ //\r
+ if (PcdGet8(PcdShellSupportLevel) >= 1) {\r
+ Status = ShellCommandCreateInitialMappingsAndPaths();\r
+ }\r
\r
- //\r
- // Display the mapping\r
- //\r
- if (PcdGet8(PcdShellSupportLevel) >= 2 && !ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoMap) {\r
- Status = RunCommand(L"map");\r
+ //\r
+ // save the device path for the loaded image and the device path for the filepath (under loaded image)\r
+ // These are where to look for the startup.nsh file\r
+ //\r
+ Status = GetDevicePathsForImageAndFile(&ShellInfoObject.ImageDevPath, &ShellInfoObject.FileDevPath);\r
ASSERT_EFI_ERROR(Status);\r
- }\r
\r
- //\r
- // init all the built in alias'\r
- //\r
- Status = SetBuiltInAlias();\r
- ASSERT_EFI_ERROR(Status);\r
-\r
- //\r
- // Initialize environment variables\r
- //\r
- if (ShellCommandGetProfileList() != NULL) {\r
- Status = InternalEfiShellSetEnv(L"profiles", ShellCommandGetProfileList(), TRUE);\r
- ASSERT_EFI_ERROR(Status);\r
- }\r
+ //\r
+ // Display the version\r
+ //\r
+ if (!ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoVersion) {\r
+ ShellPrintHiiEx (\r
+ 0,\r
+ gST->ConOut->Mode->CursorRow,\r
+ NULL,\r
+ STRING_TOKEN (STR_VER_OUTPUT_MAIN),\r
+ ShellInfoObject.HiiHandle,\r
+ SupportLevel[PcdGet8(PcdShellSupportLevel)],\r
+ gEfiShellProtocol->MajorVersion,\r
+ gEfiShellProtocol->MinorVersion,\r
+ (gST->Hdr.Revision&0xffff0000)>>16,\r
+ (gST->Hdr.Revision&0x0000ffff),\r
+ gST->FirmwareVendor,\r
+ gST->FirmwareRevision\r
+ );\r
+ }\r
\r
- Size = 100;\r
- TempString = AllocateZeroPool(Size);\r
+ //\r
+ // Display the mapping\r
+ //\r
+ if (PcdGet8(PcdShellSupportLevel) >= 2 && !ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoMap) {\r
+ Status = RunCommand(L"map");\r
+ ASSERT_EFI_ERROR(Status);\r
+ }\r
\r
- UnicodeSPrint(TempString, Size, L"%d", PcdGet8(PcdShellSupportLevel));\r
- Status = InternalEfiShellSetEnv(L"uefishellsupport", TempString, TRUE);\r
- ASSERT_EFI_ERROR(Status);\r
+ //\r
+ // init all the built in alias'\r
+ //\r
+ Status = SetBuiltInAlias();\r
+ ASSERT_EFI_ERROR(Status);\r
\r
- UnicodeSPrint(TempString, Size, L"%d.%d", ShellInfoObject.NewEfiShellProtocol->MajorVersion, ShellInfoObject.NewEfiShellProtocol->MinorVersion);\r
- Status = InternalEfiShellSetEnv(L"uefishellversion", TempString, TRUE);\r
- ASSERT_EFI_ERROR(Status);\r
+ //\r
+ // Initialize environment variables\r
+ //\r
+ if (ShellCommandGetProfileList() != NULL) {\r
+ Status = InternalEfiShellSetEnv(L"profiles", ShellCommandGetProfileList(), TRUE);\r
+ ASSERT_EFI_ERROR(Status);\r
+ }\r
\r
- UnicodeSPrint(TempString, Size, L"%d.%d", (gST->Hdr.Revision & 0xFFFF0000) >> 16, gST->Hdr.Revision & 0x0000FFFF);\r
- Status = InternalEfiShellSetEnv(L"uefiversion", TempString, TRUE);\r
- ASSERT_EFI_ERROR(Status);\r
+ Size = 100;\r
+ TempString = AllocateZeroPool(Size);\r
\r
- FreePool(TempString);\r
+ UnicodeSPrint(TempString, Size, L"%d", PcdGet8(PcdShellSupportLevel));\r
+ Status = InternalEfiShellSetEnv(L"uefishellsupport", TempString, TRUE);\r
+ ASSERT_EFI_ERROR(Status);\r
\r
- if (!EFI_ERROR(Status)) {\r
- if (!ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoInterrupt) {\r
- //\r
- // Set up the event for CTRL-C monitoring...\r
- //\r
+ UnicodeSPrint(TempString, Size, L"%d.%d", ShellInfoObject.NewEfiShellProtocol->MajorVersion, ShellInfoObject.NewEfiShellProtocol->MinorVersion);\r
+ Status = InternalEfiShellSetEnv(L"uefishellversion", TempString, TRUE);\r
+ ASSERT_EFI_ERROR(Status);\r
\r
- ///@todo add support for using SimpleInputEx here\r
- // if SimpleInputEx is not available display a warning.\r
- }\r
+ UnicodeSPrint(TempString, Size, L"%d.%d", (gST->Hdr.Revision & 0xFFFF0000) >> 16, gST->Hdr.Revision & 0x0000FFFF);\r
+ Status = InternalEfiShellSetEnv(L"uefiversion", TempString, TRUE);\r
+ ASSERT_EFI_ERROR(Status);\r
\r
- if (!EFI_ERROR(Status) && PcdGet8(PcdShellSupportLevel) >= 1) {\r
- //\r
- // process the startup script or launch the called app.\r
- //\r
- Status = DoStartupScript(ShellInfoObject.ImageDevPath, ShellInfoObject.FileDevPath);\r
- }\r
+ FreePool(TempString);\r
\r
- if ((PcdGet8(PcdShellSupportLevel) >= 3 || PcdGetBool(PcdShellForceConsole)) && !EFI_ERROR(Status) && !ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoConsoleIn) {\r
- //\r
- // begin the UI waiting loop\r
- //\r
- do {\r
+ if (!EFI_ERROR(Status)) {\r
+ if (!ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoInterrupt) {\r
//\r
- // clean out all the memory allocated for CONST <something> * return values\r
- // between each shell prompt presentation\r
+ // Set up the event for CTRL-C monitoring...\r
//\r
- if (!IsListEmpty(&ShellInfoObject.BufferToFreeList.Link)){\r
- FreeBufferList(&ShellInfoObject.BufferToFreeList);\r
- }\r
\r
+ ///@todo add support for using SimpleInputEx here\r
+ // if SimpleInputEx is not available display a warning.\r
+ }\r
+\r
+ if (!EFI_ERROR(Status) && PcdGet8(PcdShellSupportLevel) >= 1) {\r
//\r
- // Reset page break back to default.\r
+ // process the startup script or launch the called app.\r
//\r
- ShellInfoObject.PageBreakEnabled = PcdGetBool(PcdShellPageBreakDefault);\r
- ShellInfoObject.ConsoleInfo->Enabled = TRUE;\r
- ShellInfoObject.ConsoleInfo->RowCounter = 0;\r
+ Status = DoStartupScript(ShellInfoObject.ImageDevPath, ShellInfoObject.FileDevPath);\r
+ }\r
\r
+ if ((PcdGet8(PcdShellSupportLevel) >= 3 || PcdGetBool(PcdShellForceConsole)) && !EFI_ERROR(Status) && !ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoConsoleIn) {\r
//\r
- // Display Prompt\r
+ // begin the UI waiting loop\r
//\r
- Status = DoShellPrompt();\r
- } while (!ShellCommandGetExit());\r
+ do {\r
+ //\r
+ // clean out all the memory allocated for CONST <something> * return values\r
+ // between each shell prompt presentation\r
+ //\r
+ if (!IsListEmpty(&ShellInfoObject.BufferToFreeList.Link)){\r
+ FreeBufferList(&ShellInfoObject.BufferToFreeList);\r
+ }\r
+\r
+ //\r
+ // Reset page break back to default.\r
+ //\r
+ ShellInfoObject.PageBreakEnabled = PcdGetBool(PcdShellPageBreakDefault);\r
+ ShellInfoObject.ConsoleInfo->Enabled = TRUE;\r
+ ShellInfoObject.ConsoleInfo->RowCounter = 0;\r
+\r
+ //\r
+ // Display Prompt\r
+ //\r
+ Status = DoShellPrompt();\r
+ } while (!ShellCommandGetExit());\r
+ }\r
}\r
}\r
+\r
//\r
// uninstall protocols / free memory / etc...\r
//\r
}\r
\r
if (!IsListEmpty(&ShellInfoObject.SplitList.Link)){\r
- ASSERT(FALSE);\r
+ ASSERT(FALSE); ///@todo finish this de-allocation.\r
}\r
\r
if (ShellInfoObject.ShellInitSettings.FileName != NULL) {\r
TempConst = ShellCommandLineGetRawValue(Package, Count++);\r
if (TempConst != NULL && StrLen(TempConst)) {\r
ShellInfoObject.ShellInitSettings.FileName = AllocatePool(StrSize(TempConst));\r
+ if (ShellInfoObject.ShellInitSettings.FileName == NULL) {\r
+ return (EFI_OUT_OF_RESOURCES);\r
+ }\r
StrCpy(ShellInfoObject.ShellInitSettings.FileName, TempConst);\r
ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoStartup = 1;\r
for (LoopVar = 0 ; LoopVar < gEfiShellParametersProtocol->Argc ; LoopVar++) {\r
&Size,\r
L" ",\r
0);\r
+ if (ShellInfoObject.ShellInitSettings.FileOptions == NULL) {\r
+ SHELL_FREE_NON_NULL(ShellInfoObject.ShellInitSettings.FileName);\r
+ return (EFI_OUT_OF_RESOURCES);\r
+ }\r
StrnCatGrow(&ShellInfoObject.ShellInitSettings.FileOptions,\r
&Size,\r
gEfiShellParametersProtocol->Argv[LoopVar],\r
0);\r
+ if (ShellInfoObject.ShellInitSettings.FileOptions == NULL) {\r
+ SHELL_FREE_NON_NULL(ShellInfoObject.ShellInitSettings.FileName);\r
+ return (EFI_OUT_OF_RESOURCES);\r
+ }\r
}\r
}\r
}\r
NewSize += StrSize(ShellInfoObject.ShellInitSettings.FileOptions) + sizeof(CHAR16);\r
}\r
FileStringPath = AllocateZeroPool(NewSize);\r
+ if (FileStringPath == NULL) {\r
+ return (EFI_OUT_OF_RESOURCES);\r
+ }\r
StrCpy(FileStringPath, ShellInfoObject.ShellInitSettings.FileName);\r
if (ShellInfoObject.ShellInitSettings.FileOptions != NULL) {\r
- StrCat (FileStringPath, L" ");\r
+ StrCat(FileStringPath, L" ");\r
StrCat(FileStringPath, ShellInfoObject.ShellInitSettings.FileOptions);\r
}\r
Status = RunCommand(FileStringPath);\r
return (EFI_SUCCESS);\r
}\r
\r
- NamePath = FileDevicePath (NULL, L"startup.nsh");\r
+ NamePath = FileDevicePath (NULL, mStartupScript);\r
//\r
// Try the first location\r
//\r
// If we got a file, run it\r
//\r
if (!EFI_ERROR(Status)) {\r
- Status = RunScriptFileHandle (FileHandle, L"startup.nsh");\r
+ Status = RunScriptFileHandle (FileHandle, mStartupScript);\r
ShellInfoObject.NewEfiShellProtocol->CloseFile(FileHandle);\r
} else {\r
- //\r
- // we return success since we dont need to have a startup script\r
- //\r
- Status = EFI_SUCCESS;\r
- ASSERT(FileHandle == NULL);\r
+ FileStringPath = ShellFindFilePath(mStartupScript);\r
+ if (FileStringPath == NULL) {\r
+ //\r
+ // we return success since we dont need to have a startup script\r
+ //\r
+ Status = EFI_SUCCESS;\r
+ ASSERT(FileHandle == NULL);\r
+ } else {\r
+ Status = RunScriptFile(FileStringPath);\r
+ FreePool(FileStringPath);\r
+ }\r
}\r
\r
FreePool(NamePath);\r
NewCommandLine1 = AllocateZeroPool(NewSize);\r
NewCommandLine2 = AllocateZeroPool(NewSize);\r
ItemTemp = AllocateZeroPool(ItemSize+(2*sizeof(CHAR16)));\r
+ if (NewCommandLine1 == NULL || NewCommandLine2 == NULL || ItemTemp == NULL) {\r
+ SHELL_FREE_NON_NULL(NewCommandLine1);\r
+ SHELL_FREE_NON_NULL(NewCommandLine2);\r
+ SHELL_FREE_NON_NULL(ItemTemp);\r
+ return (NULL);\r
+ }\r
StrCpy(NewCommandLine1, OriginalCommandLine);\r
for (MasterEnvList = EfiShellGetEnv(NULL)\r
; MasterEnvList != NULL && *MasterEnvList != CHAR_NULL //&& *(MasterEnvList+1) != CHAR_NULL\r
PostAliasCmdLine = NULL;\r
}\r
\r
+ if (PostVariableCmdLine == NULL) {\r
+ return (EFI_OUT_OF_RESOURCES);\r
+ }\r
+\r
while (PostVariableCmdLine[StrLen(PostVariableCmdLine)-1] == L' ') {\r
PostVariableCmdLine[StrLen(PostVariableCmdLine)-1] = CHAR_NULL;\r
}\r
PreScriptEchoState = ShellCommandGetEchoState();\r
\r
NewScriptFile = (SCRIPT_FILE*)AllocateZeroPool(sizeof(SCRIPT_FILE));\r
- ASSERT(NewScriptFile != NULL);\r
+ if (NewScriptFile == NULL) {\r
+ return (EFI_OUT_OF_RESOURCES);\r
+ }\r
\r
//\r
// Set up the name\r
//\r
ASSERT(NewScriptFile->ScriptName == NULL);\r
NewScriptFile->ScriptName = StrnCatGrow(&NewScriptFile->ScriptName, NULL, Name, 0);\r
+ if (NewScriptFile->ScriptName == NULL) {\r
+ DeleteScriptFileStruct(NewScriptFile);\r
+ return (EFI_OUT_OF_RESOURCES);\r
+ }\r
\r
//\r
// Save the parameters (used to replace %0 to %9 later on)\r
NewScriptFile->Argc = ShellInfoObject.NewShellParametersProtocol->Argc;\r
if (NewScriptFile->Argc != 0) {\r
NewScriptFile->Argv = (CHAR16**)AllocateZeroPool(NewScriptFile->Argc * sizeof(CHAR16*));\r
- ASSERT(NewScriptFile->Argv != NULL);\r
+ if (NewScriptFile->Argv == NULL) {\r
+ DeleteScriptFileStruct(NewScriptFile);\r
+ return (EFI_OUT_OF_RESOURCES);\r
+ }\r
for (LoopVar = 0 ; 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
+ DeleteScriptFileStruct(NewScriptFile);\r
+ return (EFI_OUT_OF_RESOURCES);\r
+ }\r
}\r
} else {\r
NewScriptFile->Argv = NULL;\r
continue;\r
}\r
NewScriptFile->CurrentCommand = AllocateZeroPool(sizeof(SCRIPT_COMMAND_LIST));\r
- ASSERT(NewScriptFile->CurrentCommand != NULL);\r
+ if (NewScriptFile->CurrentCommand == NULL) {\r
+ DeleteScriptFileStruct(NewScriptFile);\r
+ return (EFI_OUT_OF_RESOURCES);\r
+ }\r
\r
NewScriptFile->CurrentCommand->Cl = CommandLine;\r
NewScriptFile->CurrentCommand->Data = NULL;\r
// Now enumerate through the commands and run each one.\r
//\r
CommandLine = AllocatePool(PcdGet16(PcdShellPrintBufferSize));\r
+ if (CommandLine == NULL) {\r
+ DeleteScriptFileStruct(NewScriptFile);\r
+ return (EFI_OUT_OF_RESOURCES);\r
+ }\r
CommandLine2 = AllocatePool(PcdGet16(PcdShellPrintBufferSize));\r
+ if (CommandLine2 == NULL) {\r
+ FreePool(CommandLine);\r
+ DeleteScriptFileStruct(NewScriptFile);\r
+ return (EFI_OUT_OF_RESOURCES);\r
+ }\r
\r
for ( NewScriptFile->CurrentCommand = (SCRIPT_COMMAND_LIST *)GetFirstNode(&NewScriptFile->CommandList)\r
; !IsNull(&NewScriptFile->CommandList, &NewScriptFile->CurrentCommand->Link)\r
; // conditional increment in the body of the loop\r
){\r
+ ASSERT(CommandLine2 != NULL);\r
StrCpy(CommandLine2, NewScriptFile->CurrentCommand->Cl);\r
\r
//\r
\r
for (CommandLine3 = CommandLine2 ; CommandLine3[0] == L' ' ; CommandLine3++);\r
\r
- if (CommandLine3[0] == L':' ) {\r
+ if (CommandLine3 != NULL && CommandLine3[0] == L':' ) {\r
//\r
// This line is a goto target / label\r
//\r