[PATCH 1/3] efi/libstub: move FDT sanity check out of allocation loop

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The memory allocation for the updated FDT may execute several times
if the allocation turns out to be insufficiently large. There is no
need to sanity check the original FDT each time, so take it out of
the loop.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@xxxxxxxxxx>
---
 drivers/firmware/efi/libstub/fdt.c | 42 ++++++++++++--------
 1 file changed, 26 insertions(+), 16 deletions(-)

diff --git a/drivers/firmware/efi/libstub/fdt.c b/drivers/firmware/efi/libstub/fdt.c
index ef5d764e2a27..354172bee81c 100644
--- a/drivers/firmware/efi/libstub/fdt.c
+++ b/drivers/firmware/efi/libstub/fdt.c
@@ -16,6 +16,26 @@
 
 #include "efistub.h"
 
+static efi_status_t sanity_check_fdt(efi_system_table_t *sys_table,
+				     void *fdt, unsigned long fdt_size)
+{
+	if (fdt_check_header(fdt)) {
+		pr_efi_err(sys_table, "Device Tree header not valid!\n");
+		return EFI_LOAD_ERROR;
+	}
+
+	/*
+	 * We don't get the size of the FDT if we get if from a
+	 * configuration table.
+	 */
+	if (fdt_size && fdt_totalsize(fdt) > fdt_size) {
+		pr_efi_err(sys_table, "Truncated device tree! foo!\n");
+		return EFI_LOAD_ERROR;
+	}
+
+	return EFI_SUCCESS;
+}
+
 efi_status_t update_fdt(efi_system_table_t *sys_table, void *orig_fdt,
 			unsigned long orig_fdt_size,
 			void *fdt, int new_fdt_size, char *cmdline_ptr,
@@ -29,22 +49,6 @@ efi_status_t update_fdt(efi_system_table_t *sys_table, void *orig_fdt,
 	u32 fdt_val32;
 	u64 fdt_val64;
 
-	/* Do some checks on provided FDT, if it exists*/
-	if (orig_fdt) {
-		if (fdt_check_header(orig_fdt)) {
-			pr_efi_err(sys_table, "Device Tree header not valid!\n");
-			return EFI_LOAD_ERROR;
-		}
-		/*
-		 * We don't get the size of the FDT if we get if from a
-		 * configuration table.
-		 */
-		if (orig_fdt_size && fdt_totalsize(orig_fdt) > orig_fdt_size) {
-			pr_efi_err(sys_table, "Truncated device tree! foo!\n");
-			return EFI_LOAD_ERROR;
-		}
-	}
-
 	if (orig_fdt)
 		status = fdt_open_into(orig_fdt, fdt, new_fdt_size);
 	else
@@ -213,6 +217,12 @@ efi_status_t allocate_new_fdt_and_exit_boot(efi_system_table_t *sys_table,
 		return status;
 	}
 
+	if (fdt_addr) {
+		status = sanity_check_fdt(sys_table, (void*)fdt_addr, fdt_size);
+		if (status != EFI_SUCCESS)
+			goto fail;
+	}
+
 	pr_efi(sys_table,
 	       "Exiting boot services and installing virtual address map...\n");
 
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-efi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux