[U-Boot] [PATCH] image-fit: Fix fit_get_node_from_config semantics
Marek Vasut
marex at denx.de
Wed Sep 21 17:12:02 CEST 2016
On 09/20/2016 07:17 PM, Paul Burton wrote:
> Commit bac17b78dace ("image-fit: switch ENOLINK to ENOENT") changed
> fit_get_node_from_config to return -ENOENT when a property doesn't
> exist, but didn't change any of its callers which check return values.
> Notably it didn't change boot_get_ramdisk, which leads to U-Boot failing
> to boot FIT images which don't include ramdisks with the following
> message:
>
> Ramdisk image is corrupt or invalid
>
> It also didn't take into account that by returning -ENOENT to denote the
> lack of a property we lost the ability to determine from the return
> value of fit_get_node_from_config whether it was the property or the
> configuration node that was missing, which may potentially lead callers
> to accept invalid FIT images.
>
> Fix this by having fit_get_node_from_config return -EINVAL when the
> configuration node isn't found and -ENOENT when the property isn't
> found, which seems to make semantic sense. Callers that previously
> checked for -ENOLINK are adjusted to check for -ENOENT, which fixes the
> breakage introduced by commit bac17b78dace ("image-fit: switch ENOLINK
> to ENOENT").
>
> The only other user of the return fit_get_node_from_config return value,
> indirectly, is bootm_find_os which already checked for -ENOENT. From a
> read-through of the code I suspect it ought to have been checking for
> -ENOLINK prior to bac17b78dace ("image-fit: switch ENOLINK to ENOENT")
> anyway, which would make it right after this patch, but this would be
> good to get verified by someone who knows this x86 code or is able to
> test it.
>
> Signed-off-by: Paul Burton <paul.burton at imgtec.com>
> Cc: Jonathan Gray <jsg at jsg.id.au>
> Cc: Marek Vasut <marex at denx.de>
Acked-by: Marek Vasut <marex at denx.de>
>
> ---
>
> common/image-fdt.c | 2 +-
> common/image-fit.c | 2 +-
> common/image.c | 2 +-
> 3 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/common/image-fdt.c b/common/image-fdt.c
> index d6ee225..3d23608 100644
> --- a/common/image-fdt.c
> +++ b/common/image-fdt.c
> @@ -285,7 +285,7 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
> fdt_noffset = fit_get_node_from_config(images,
> FIT_FDT_PROP,
> fdt_addr);
> - if (fdt_noffset == -ENOLINK)
> + if (fdt_noffset == -ENOENT)
> return 0;
> else if (fdt_noffset < 0)
> return 1;
> diff --git a/common/image-fit.c b/common/image-fit.c
> index 9ce68f1..1b0234a 100644
> --- a/common/image-fit.c
> +++ b/common/image-fit.c
> @@ -1560,7 +1560,7 @@ int fit_get_node_from_config(bootm_headers_t *images, const char *prop_name,
> cfg_noffset = fit_conf_get_node(fit_hdr, images->fit_uname_cfg);
> if (cfg_noffset < 0) {
> debug("* %s: no such config\n", prop_name);
> - return -ENOENT;
> + return -EINVAL;
> }
>
> noffset = fit_conf_get_prop_node(fit_hdr, cfg_noffset, prop_name);
> diff --git a/common/image.c b/common/image.c
> index 7ad04ca..c8d9bc8 100644
> --- a/common/image.c
> +++ b/common/image.c
> @@ -1078,7 +1078,7 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
> rd_addr = map_to_sysmem(images->fit_hdr_os);
> rd_noffset = fit_get_node_from_config(images,
> FIT_RAMDISK_PROP, rd_addr);
> - if (rd_noffset == -ENOLINK)
> + if (rd_noffset == -ENOENT)
> return 0;
> else if (rd_noffset < 0)
> return 1;
>
--
Best regards,
Marek Vasut
More information about the U-Boot
mailing list