On Thu, Oct 24, 2019 at 09:29:23PM -0600, Simon Glass wrote: > Allow enabling FDT_ASSUME_LATEST to disable version checks. > > Signed-off-by: Simon Glass <sjg@xxxxxxxxxxxx> > --- > > Changes in v3: None > Changes in v2: None LGTM, excepting adjustments that will be necessary to accomodate changes suggested to the earlier patches. > > libfdt/fdt.c | 29 ++++++++++++++++++----------- > libfdt/fdt_ro.c | 16 ++++++++-------- > libfdt/fdt_rw.c | 6 +++--- > 3 files changed, 29 insertions(+), 22 deletions(-) > > diff --git a/libfdt/fdt.c b/libfdt/fdt.c > index c82c2aa..461b938 100644 > --- a/libfdt/fdt.c > +++ b/libfdt/fdt.c > @@ -21,10 +21,13 @@ int32_t fdt_ro_probe_(const void *fdt) > > if (fdt_magic(fdt) == FDT_MAGIC) { > /* Complete tree */ > - if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION) > - return -FDT_ERR_BADVERSION; > - if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION) > - return -FDT_ERR_BADVERSION; > + if (fdt_chk_version()) { > + if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION) > + return -FDT_ERR_BADVERSION; > + if (fdt_last_comp_version(fdt) > > + FDT_LAST_SUPPORTED_VERSION) > + return -FDT_ERR_BADVERSION; > + } > } else if (fdt_magic(fdt) == FDT_SW_MAGIC) { > /* Unfinished sequential-write blob */ > if (fdt_size_dt_struct(fdt) == 0) > @@ -82,11 +85,14 @@ int fdt_check_header(const void *fdt) > > if (fdt_magic(fdt) != FDT_MAGIC) > return -FDT_ERR_BADMAGIC; > - if ((fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION) > - || (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION)) > - return -FDT_ERR_BADVERSION; > - if (fdt_version(fdt) < fdt_last_comp_version(fdt)) > - return -FDT_ERR_BADVERSION; > + if (fdt_chk_version()) { > + if ((fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION) > + || (fdt_last_comp_version(fdt) > > + FDT_LAST_SUPPORTED_VERSION)) > + return -FDT_ERR_BADVERSION; > + if (fdt_version(fdt) < fdt_last_comp_version(fdt)) > + return -FDT_ERR_BADVERSION; > + } > if (fdt_chk_basic()) { > hdrsize = fdt_header_size(fdt); > > @@ -130,7 +136,7 @@ const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int len) > || (absoffset + len) > fdt_totalsize(fdt)) > return NULL; > > - if (fdt_version(fdt) >= 0x11) > + if (!fdt_chk_version() || fdt_version(fdt) >= 0x11) > if (((offset + len) < offset) > || ((offset + len) > fdt_size_dt_struct(fdt))) > return NULL; > @@ -170,7 +176,8 @@ uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset) > /* skip-name offset, length and value */ > offset += sizeof(struct fdt_property) - FDT_TAGSIZE > + fdt32_to_cpu(*lenp); > - if (fdt_version(fdt) < 0x10 && fdt32_to_cpu(*lenp) >= 8 && > + if (fdt_chk_version() && > + fdt_version(fdt) < 0x10 && fdt32_to_cpu(*lenp) >= 8 && > ((offset - fdt32_to_cpu(*lenp)) % 8) != 0) > offset += 4; > break; > diff --git a/libfdt/fdt_ro.c b/libfdt/fdt_ro.c > index fa699aa..a42d329 100644 > --- a/libfdt/fdt_ro.c > +++ b/libfdt/fdt_ro.c > @@ -51,7 +51,7 @@ const char *fdt_get_string(const void *fdt, int stroffset, int *lenp) > if (fdt_magic(fdt) == FDT_MAGIC) { > if (stroffset < 0) > goto fail; > - if (fdt_version(fdt) >= 17) { > + if (!fdt_chk_version() || fdt_version(fdt) >= 17) { > if (stroffset >= fdt_size_dt_strings(fdt)) > goto fail; > if ((fdt_size_dt_strings(fdt) - stroffset) < len) > @@ -295,7 +295,7 @@ const char *fdt_get_name(const void *fdt, int nodeoffset, int *len) > > nameptr = nh->name; > > - if (fdt_version(fdt) < 0x10) { > + if (fdt_chk_version() && fdt_version(fdt) < 0x10) { > /* > * For old FDT versions, match the naming conventions of V16: > * give only the leaf name (after all /). The actual tree > @@ -367,7 +367,7 @@ const struct fdt_property *fdt_get_property_by_offset(const void *fdt, > /* Prior to version 16, properties may need realignment > * and this API does not work. fdt_getprop_*() will, however. */ > > - if (fdt_version(fdt) < 0x10) { > + if (fdt_chk_version() && fdt_version(fdt) < 0x10) { > if (lenp) > *lenp = -FDT_ERR_BADVERSION; > return NULL; > @@ -413,7 +413,7 @@ const struct fdt_property *fdt_get_property_namelen(const void *fdt, > { > /* Prior to version 16, properties may need realignment > * and this API does not work. fdt_getprop_*() will, however. */ > - if (fdt_version(fdt) < 0x10) { > + if (fdt_chk_version() && fdt_version(fdt) < 0x10) { > if (lenp) > *lenp = -FDT_ERR_BADVERSION; > return NULL; > @@ -444,8 +444,8 @@ const void *fdt_getprop_namelen(const void *fdt, int nodeoffset, > return NULL; > > /* Handle realignment */ > - if (fdt_version(fdt) < 0x10 && (poffset + sizeof(*prop)) % 8 && > - fdt32_ld(&prop->len) >= 8) > + if (fdt_chk_version() && fdt_version(fdt) < 0x10 && > + (poffset + sizeof(*prop)) % 8 && fdt32_ld(&prop->len) >= 8) > return prop->data + 4; > return prop->data; > } > @@ -472,8 +472,8 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset, > } > > /* Handle realignment */ > - if (fdt_version(fdt) < 0x10 && (offset + sizeof(*prop)) % 8 && > - fdt32_ld(&prop->len) >= 8) > + if (fdt_chk_version() && fdt_version(fdt) < 0x10 && > + (offset + sizeof(*prop)) % 8 && fdt32_ld(&prop->len) >= 8) > return prop->data + 4; > return prop->data; > } > diff --git a/libfdt/fdt_rw.c b/libfdt/fdt_rw.c > index d3750f5..30b5cfd 100644 > --- a/libfdt/fdt_rw.c > +++ b/libfdt/fdt_rw.c > @@ -30,12 +30,12 @@ static int fdt_rw_probe_(void *fdt) > return 0; > FDT_RO_PROBE(fdt); > > - if (fdt_version(fdt) < 17) > + if (fdt_chk_version() && fdt_version(fdt) < 17) > return -FDT_ERR_BADVERSION; > if (fdt_blocks_misordered_(fdt, sizeof(struct fdt_reserve_entry), > fdt_size_dt_struct(fdt))) > return -FDT_ERR_BADLAYOUT; > - if (fdt_version(fdt) > 17) > + if (fdt_chk_version() && fdt_version(fdt) > 17) > fdt_set_version(fdt, 17); > > return 0; > @@ -427,7 +427,7 @@ int fdt_open_into(const void *fdt, void *buf, int bufsize) > mem_rsv_size = (fdt_num_mem_rsv(fdt)+1) > * sizeof(struct fdt_reserve_entry); > > - if (fdt_version(fdt) >= 17) { > + if (!fdt_chk_version() || fdt_version(fdt) >= 17) { > struct_size = fdt_size_dt_struct(fdt); > } else { > struct_size = 0; -- 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