Messages in this thread | | | Subject | Re: [PATCH v4 2/5] powerpc: Use libfdt functions to fetch IMA buffer properties | From | Lakshmi Ramasubramanian <> | Date | Fri, 28 Aug 2020 10:46:12 -0700 |
| |
On 8/27/20 4:50 PM, Thiago Jung Bauermann wrote: > > Lakshmi Ramasubramanian <nramas@linux.microsoft.com> writes: > >> @@ -63,7 +29,22 @@ void remove_ima_buffer(void *fdt, int chosen_node) >> if (!prop) >> return; >> >> - ret = do_get_kexec_buffer(prop, len, &addr, &size); >> + ret = fdt_address_cells(fdt, chosen_node); > > This change was already present in the previous version of the patch but > it was just today that I noticed a problem: there's no #address-cells > property in /chosen. This code will still work though because if there's > no property this function returns 2 which is the correct value for > ppc64. But it's conceptually wrong. You need to pass the node offset for > / so that it gets the #address-cells property from there.
Thanks for the info. Will fix this.
> >> + if (ret < 0) >> + return; >> + addr_cells = ret; >> + >> + ret = fdt_size_cells(fdt, chosen_node); > > Here we're not so lucky. The default value returned when no #size-cells > property is present is 1, which is wrong for ppc64 so this change > introduces a bug. You also need to pass the node offset for / here.
Will fix this.
> >> + if (ret < 0) >> + return; >> + size_cells = ret; >> + >> + if (len < 4 * (addr_cells + size_cells)) >> + return; >> + >> + addr = of_read_number(prop, addr_cells); >> + size = of_read_number(prop + 4 * addr_cells, size_cells); >> + >> fdt_delprop(fdt, chosen_node, FDT_PROP_IMA_KEXEC_BUFFER); >> if (ret) >> return; >> @@ -129,9 +110,15 @@ int setup_ima_buffer(const struct kimage *image, void *fdt, int chosen_node) >> if (!image->arch.ima_buffer_size) >> return 0; >> >> - ret = get_addr_size_cells(&addr_cells, &size_cells); >> - if (ret) >> + ret = fdt_address_cells(fdt, chosen_node); >> + if (ret < 0) >> + return ret; >> + addr_cells = ret; >> + >> + ret = fdt_size_cells(fdt, chosen_node); >> + if (ret < 0) >> return ret; >> + size_cells = ret; >> >> entry_size = 4 * (addr_cells + size_cells); > > Ditto here. >
Will fix this.
thanks, -lakshmi
| |