cmd: bootefi: Honor the address & size cells properties correctly
authorAtish Patra <atish.patra@wdc.com>
Fri, 19 Jun 2020 01:51:50 +0000 (18:51 -0700)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Fri, 19 Jun 2020 07:00:38 +0000 (09:00 +0200)
fdtdec_get_addr_size reads the uses a fixed value for address & size
cell properties which may not be correct always.

Use the auto variant of the function which automatically reads
 #address-cells & #size-cells from parent and uses to read the "reg"
property.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
On 32 bit systems fdt_addr_t may be 4 bytes long but size is defined as
u64. Avoid filling the upper 4 bytes of the sizep parameter of
fdtdec_get_addr_size_auto_parent() with random bytes from the stack by
defining a separate variable fdt_size.

Reviewed-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
cmd/bootefi.c

index 0f6d0f77507ca2b0e577814a830dc4a5b813bce0..ac713cad1b69faf98fbced670b3bfbbb30df1f14 100644 (file)
@@ -189,16 +189,19 @@ static void efi_carve_out_dt_rsv(void *fdt)
        if (nodeoffset >= 0) {
                subnode = fdt_first_subnode(fdt, nodeoffset);
                while (subnode >= 0) {
+                       fdt_addr_t fdt_addr, fdt_size;
+
                        /* check if this subnode has a reg property */
-                       addr = fdtdec_get_addr_size(fdt, subnode, "reg",
-                                                   (fdt_size_t *)&size);
+                       fdt_addr = fdtdec_get_addr_size_auto_parent(
+                                               fdt, nodeoffset, subnode,
+                                               "reg", 0, &fdt_size, false);
                        /*
                         * The /reserved-memory node may have children with
                         * a size instead of a reg property.
                         */
                        if (addr != FDT_ADDR_T_NONE &&
                            fdtdec_get_is_enabled(fdt, subnode))
-                               efi_reserve_memory(addr, size);
+                               efi_reserve_memory(fdt_addr, fdt_size);
                        subnode = fdt_next_subnode(fdt, subnode);
                }
        }