/** @file\r
*\r
-* Copyright (c) 2011 - 2014, ARM Limited. All rights reserved.\r
+* Copyright (c) 2011 - 2015, ARM Limited. All rights reserved.\r
*\r
* This program and the accompanying materials\r
* are licensed and made available under the terms and conditions of the BSD License\r
if (InitrdPathNodes != NULL) {\r
// Append the Device Path to the selected device path\r
InitrdPath = AppendDevicePath (SupportedBootDevice->DevicePathProtocol, (CONST EFI_DEVICE_PATH_PROTOCOL *)InitrdPathNodes);\r
+ // Free the InitrdPathNodes created by Support->CreateDevicePathNode()\r
+ FreePool (InitrdPathNodes);\r
+\r
if (InitrdPath == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto EXIT;\r
// Append the Device Path to the selected device path\r
InitrdPath = AppendDevicePath (TempInitrdPath, (CONST EFI_DEVICE_PATH_PROTOCOL *)InitrdPathNodes);\r
FreePool (TempInitrdPath);\r
+ // Free the InitrdPathNodes created by Support->CreateDevicePathNode()\r
+ FreePool (InitrdPathNodes);\r
if (InitrdPath == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto EXIT;\r
\r
Print(L"Arguments to pass to the binary: ");\r
if (CmdLineSize > 0) {\r
- AsciiStrnCpy(CmdLine, (CONST CHAR8*)(LinuxArguments + 1), CmdLineSize);\r
+ AsciiStrnCpy (CmdLine, (CONST CHAR8*)(LinuxArguments + 1), sizeof (CmdLine));\r
+ CmdLine[sizeof (CmdLine) - 1] = '\0';\r
} else {\r
CmdLine[0] = '\0';\r
}\r
if (BootOption->OptionalDataSize > 0) {\r
IsPrintable = IsPrintableString (BootOption->OptionalData, &IsUnicode);\r
if (IsPrintable) {\r
+ //\r
+ // The size in bytes of the string, final zero included, should\r
+ // be equal to or at least lower than "BootOption->OptionalDataSize"\r
+ // and the "IsPrintableString()" has already tested that the length\r
+ // in number of characters is smaller than BOOT_DEVICE_OPTION_MAX,\r
+ // final '\0' included. We can thus copy the string for editing\r
+ // using "CopyMem()". Furthermore, note that in the case of an Unicode\r
+ // string "StrnCpy()" and "StrCpy()" can not be used to copy the\r
+ // string because the data pointed to by "BootOption->OptionalData"\r
+ // is not necessarily 2-byte aligned.\r
+ //\r
if (IsUnicode) {\r
- StrnCpy (UnicodeCmdLine, BootOption->OptionalData, BootOption->OptionalDataSize / 2);\r
+ CopyMem (\r
+ UnicodeCmdLine, BootOption->OptionalData,\r
+ MIN (sizeof (UnicodeCmdLine),\r
+ BootOption->OptionalDataSize)\r
+ );\r
} else {\r
- AsciiStrnCpy (CmdLine, BootOption->OptionalData, BootOption->OptionalDataSize);\r
+ CopyMem (\r
+ CmdLine, BootOption->OptionalData,\r
+ MIN (sizeof (CmdLine),\r
+ BootOption->OptionalDataSize)\r
+ );\r
}\r
}\r
} else {\r
}\r
\r
SelectedEntry = &BootOptionEntry->Link;\r
+ SecondEntry = NULL;\r
// Note down the previous entry in the list to be able to cancel changes\r
PrevEntry = GetPreviousNode (BootOptionsList, SelectedEntry);\r
\r
} while ((!Move) && (!Save) && (!Cancel));\r
\r
if (Move) {\r
- SwapListEntries (SelectedEntry, SecondEntry);\r
+ if ((SelectedEntry != NULL) && (SecondEntry != NULL)) {\r
+ SwapListEntries (SelectedEntry, SecondEntry);\r
+ }\r
} else {\r
if (Save) {\r
Status = GetGlobalEnvironmentVariable (\r
return Status ;\r
}\r
\r
-EFI_STATUS\r
-UpdateFdtPath (\r
- IN LIST_ENTRY *BootOptionsList\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN FdtDevicePathSize;\r
- BDS_SUPPORTED_DEVICE *SupportedBootDevice;\r
- EFI_DEVICE_PATH_PROTOCOL *FdtDevicePathNodes;\r
- EFI_DEVICE_PATH_PROTOCOL *FdtDevicePath;\r
-\r
- Status = SelectBootDevice (&SupportedBootDevice);\r
- if (EFI_ERROR(Status)) {\r
- Status = EFI_ABORTED;\r
- goto EXIT;\r
- }\r
-\r
- // Create the specific device path node\r
- Status = SupportedBootDevice->Support->CreateDevicePathNode (L"FDT blob", &FdtDevicePathNodes);\r
- if (EFI_ERROR(Status)) {\r
- Status = EFI_ABORTED;\r
- goto EXIT;\r
- }\r
-\r
- if (FdtDevicePathNodes != NULL) {\r
- // Append the Device Path node to the select device path\r
- FdtDevicePath = AppendDevicePath (SupportedBootDevice->DevicePathProtocol, FdtDevicePathNodes);\r
- FdtDevicePathSize = GetDevicePathSize (FdtDevicePath);\r
- Status = gRT->SetVariable (\r
- (CHAR16*)L"Fdt",\r
- &gArmGlobalVariableGuid,\r
- EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- FdtDevicePathSize,\r
- FdtDevicePath\r
- );\r
- ASSERT_EFI_ERROR(Status);\r
- } else {\r
- gRT->SetVariable (\r
- (CHAR16*)L"Fdt",\r
- &gArmGlobalVariableGuid,\r
- EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- 0,\r
- NULL\r
- );\r
- ASSERT_EFI_ERROR(Status);\r
- }\r
-\r
-EXIT:\r
- if (Status == EFI_ABORTED) {\r
- Print(L"\n");\r
- }\r
- FreePool(SupportedBootDevice);\r
- return Status;\r
-}\r
-\r
/**\r
Set boot timeout\r
\r
{ L"Update Boot Device Entry", BootMenuUpdateBootOption },\r
{ L"Remove Boot Device Entry", BootMenuRemoveBootOption },\r
{ L"Reorder Boot Device Entries", BootMenuReorderBootOptions },\r
- { L"Update FDT path", UpdateFdtPath },\r
{ L"Set Boot Timeout", BootMenuSetBootTimeout },\r
};\r
\r