On Tue, Apr 06, 2021 at 02:07:12PM -0500, Rob Herring wrote: > Only checking the FDT alignment in fdt_ro_probe_() means that > fdt_check_header() can pass, but then subsequent API calls fail on > alignment checks. Let's add an alignment check to fdt_check_header() so > alignment errors are found up front. > > Cc: Tom Rini <trini@xxxxxxxxxxxx> > Cc: Frank Rowand <frowand.list@xxxxxxxxx> > Signed-off-by: Rob Herring <robh@xxxxxxxxxx> Good catch. Applied, thanks. > --- > For background, the new alignment check triggered a crash in the > linux kernel. Yes, we should fix the error handling, but > fdt_check_header() shouldn't tell us the FDT is valid only to fail > later on. > > Maybe we should move the check instead, but fdt_ro_probe_() and > fdt_check_header() already have a lot of the same checks. > > libfdt/fdt.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/libfdt/fdt.c b/libfdt/fdt.c > index 3e893073da05..9fe7cf4b747d 100644 > --- a/libfdt/fdt.c > +++ b/libfdt/fdt.c > @@ -90,6 +90,10 @@ int fdt_check_header(const void *fdt) > { > size_t hdrsize; > > + /* The device tree must be at an 8-byte aligned address */ > + if ((uintptr_t)fdt & 7) > + return -FDT_ERR_ALIGNMENT; > + > if (fdt_magic(fdt) != FDT_MAGIC) > return -FDT_ERR_BADMAGIC; > if (!can_assume(LATEST)) { -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
Attachment:
signature.asc
Description: PGP signature