Re: [PATCH] libfdt: Check for 8-byte address alignment in fdt_ro_probe_()

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



On Wed, Nov 04, 2020 at 08:06:05AM -0500, Tom Rini wrote:
> The device tree must be loaded in to memory at an 8-byte aligned
> address.  Add a check for this condition in fdt_ro_probe_() and a new
> error code to return if we are not.
> 
> Signed-off-by: Tom Rini <trini@xxxxxxxxxxxx>

Applied, thanks, sorry it took so long.

A testcase to make sure this fails on an unaligned blob would be a
nice addition

> ---
>  libfdt/fdt.c    | 4 ++++
>  libfdt/libfdt.h | 6 +++++-
>  2 files changed, 9 insertions(+), 1 deletion(-)
> 
> diff --git a/libfdt/fdt.c b/libfdt/fdt.c
> index 6cf2fa03b037..3e893073da05 100644
> --- a/libfdt/fdt.c
> +++ b/libfdt/fdt.c
> @@ -22,6 +22,10 @@ int32_t fdt_ro_probe_(const void *fdt)
>  	if (can_assume(VALID_DTB))
>  		return totalsize;
>  
> +	/* 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) {
>  		/* Complete tree */
>  		if (!can_assume(LATEST)) {
> diff --git a/libfdt/libfdt.h b/libfdt/libfdt.h
> index 544d3efff584..b600c8d6dd41 100644
> --- a/libfdt/libfdt.h
> +++ b/libfdt/libfdt.h
> @@ -101,7 +101,11 @@ extern "C" {
>  	/* FDT_ERR_BADFLAGS: The function was passed a flags field that
>  	 * contains invalid flags or an invalid combination of flags. */
>  
> -#define FDT_ERR_MAX		18
> +#define FDT_ERR_ALIGNMENT	19
> +	/* FDT_ERR_ALIGNMENT: The device tree base address is not 8-byte
> +	 * aligned. */
> +
> +#define FDT_ERR_MAX		19
>  
>  /* constants */
>  #define FDT_MAX_PHANDLE 0xfffffffe

-- 
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


[Index of Archives]     [Device Tree]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux