UINTN InternalExitDataSize;\r
UINTN *ExitDataSizePtr;\r
CHAR16 *ImagePath;\r
+ UINTN Index;\r
\r
// ExitDataSize is not OPTIONAL for gBS->BootServices, provide somewhere for\r
// it to be dumped if the caller doesn't want it.\r
ShellParamsProtocol.Argv = AllocatePool (sizeof (CHAR16 *));\r
if (ShellParamsProtocol.Argv == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
- goto Cleanup;\r
+ goto UnloadImage;\r
}\r
ShellParamsProtocol.Argc = 1;\r
} else {\r
ExitDataSizePtr,\r
ExitData\r
);\r
- }\r
\r
- //\r
- // Cleanup (and dont overwrite errors)\r
- //\r
- if (EFI_ERROR(Status)) {\r
- CleanupStatus = gBS->UninstallProtocolInterface(\r
- NewHandle,\r
- &gEfiShellParametersProtocolGuid,\r
- &ShellParamsProtocol\r
- );\r
- ASSERT_EFI_ERROR(CleanupStatus);\r
- } else {\r
CleanupStatus = gBS->UninstallProtocolInterface(\r
NewHandle,\r
&gEfiShellParametersProtocolGuid,\r
&ShellParamsProtocol\r
);\r
ASSERT_EFI_ERROR(CleanupStatus);\r
+\r
+ goto FreeAlloc;\r
+ }\r
+\r
+UnloadImage:\r
+ // Unload image - We should only get here if we didn't call StartImage\r
+ gBS->UnloadImage (NewHandle);\r
+\r
+FreeAlloc:\r
+ // Free Argv (Allocated in UpdateArgcArgv)\r
+ if (ShellParamsProtocol.Argv != NULL) {\r
+ for (Index = 0; Index < ShellParamsProtocol.Argc; Index++) {\r
+ if (ShellParamsProtocol.Argv[Index] != NULL) {\r
+ FreePool (ShellParamsProtocol.Argv[Index]);\r
+ }\r
+ }\r
+ FreePool (ShellParamsProtocol.Argv);\r
}\r
}\r
\r
+ // Restore environment variables\r
if (!IsListEmpty(&OrigEnvs)) {\r
- if (EFI_ERROR(Status)) {\r
- CleanupStatus = SetEnvironmentVariableList(&OrigEnvs);\r
- ASSERT_EFI_ERROR(CleanupStatus);\r
- } else {\r
- CleanupStatus = SetEnvironmentVariableList(&OrigEnvs);\r
- ASSERT_EFI_ERROR (CleanupStatus);\r
- }\r
+ CleanupStatus = SetEnvironmentVariableList(&OrigEnvs);\r
+ ASSERT_EFI_ERROR (CleanupStatus);\r
}\r
\r
return(Status);\r