From 0cec114e36606412908a35695a5db944cec2e3db Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Thu, 26 Dec 2019 15:36:47 -0700 Subject: scripts/dtc: Update to upstream version v1.5.1-22-gc40aeb60b47a This adds the following commits from upstream: c40aeb60b47a travis.yml: Run tests on the non-x86 builders, too 9f86aff444f4 Add .cirrus.yml for FreeBSD build 34c82275bae6 Avoid gnu_printf attribute when using Clang 743000931bc9 tests: default to 'cc' if CC not set adcd676491cc Add test-case for trailing zero d9c55f855b65 Remove trailing zero from the overlay path 7a22132c79ec pylibfdt: Adjust for deprecated test methods dbe80d577ee2 tests: add extension to sed -i for GNU/BSD sed compatibility af57d440d887 libfdt: Correct prototype for fdt_ro_probe_() 6ce585ac153b Use correct inttypes.h format specifier 715028622547 support byacc in addition to bison fdf3f6d897ab pylibfdt: Correct the type for fdt_property_stub() 430419c28100 tests: fix some python warnings 588a29ff2e4e util: use gnu_printf format attribute bc876708ab1d fstree: replace lstat with stat 4c3c4ccb9916 dumptrees: pass outputdir as first argument aa522da9fff6 tests: allow out-of-tree test run 0d0d0fa51b1f fdtoverlay: Return non-zero exit code if overlays can't be applied 4605eb047b38 Add .editorconfig 18d7b2f4ee45 yamltree: Ensure consistent bracketing of properties with phandles 67f790c1adcc libfdt.h: add explicit cast from void* to uint8_t* in fdt(32|64)_st b111122ea5eb pylibfdt: use python3 shebang 60e0db3d65a1 Ignore phandle properties in /aliases 95ce19c14064 README: update for Python 3 5345db19f615 livetree: simplify condition in get_node_by_path b8d6eca78210 libfdt: Allow #size-cells of 0 184f51099471 Makefile: Add EXTRA_CFLAGS variable 812b1956a076 libfdt: Tweak data handling to satisfy Coverity 5c715a44776a fdtoverlay: Ignore symbols in overlays which don't apply to the target tree b99353474850 fdtoverlay: Allow adding labels to __overlay__ nodes in overlays d6de81b81b68 pylibfdt: Add support for fdt_get_alias() 1c17714dbb3a pylibfdt: Correct the FdtSw example ad57e4574a37 tests: Add a failed test case for 'fdtoverlay' with long target path bbe3b36f542b fdtoverlay: Rework output allocation 6c2e61f08396 fdtoverlay: Improve error messages 297f5abb362e fdtoverlay: Check for truncated overlay blobs Cc: Frank Rowand Cc: clang-built-linux@googlegroups.com Signed-off-by: Rob Herring --- scripts/dtc/libfdt/fdt.c | 9 +++++++-- scripts/dtc/libfdt/fdt_addresses.c | 8 +++++--- scripts/dtc/libfdt/fdt_overlay.c | 28 +++++++++++++++++++--------- scripts/dtc/libfdt/fdt_ro.c | 11 ++++++----- scripts/dtc/libfdt/libfdt.h | 4 ++-- scripts/dtc/libfdt/libfdt_internal.h | 12 ++++++------ 6 files changed, 45 insertions(+), 27 deletions(-) (limited to 'scripts/dtc/libfdt') diff --git a/scripts/dtc/libfdt/fdt.c b/scripts/dtc/libfdt/fdt.c index 179168ec63e9..d6ce7c052dc8 100644 --- a/scripts/dtc/libfdt/fdt.c +++ b/scripts/dtc/libfdt/fdt.c @@ -15,8 +15,10 @@ * that the given buffer contains what appears to be a flattened * device tree with sane information in its header. */ -int fdt_ro_probe_(const void *fdt) +int32_t fdt_ro_probe_(const void *fdt) { + uint32_t totalsize = fdt_totalsize(fdt); + if (fdt_magic(fdt) == FDT_MAGIC) { /* Complete tree */ if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION) @@ -31,7 +33,10 @@ int fdt_ro_probe_(const void *fdt) return -FDT_ERR_BADMAGIC; } - return 0; + if (totalsize < INT32_MAX) + return totalsize; + else + return -FDT_ERR_TRUNCATED; } static int check_off_(uint32_t hdrsize, uint32_t totalsize, uint32_t off) diff --git a/scripts/dtc/libfdt/fdt_addresses.c b/scripts/dtc/libfdt/fdt_addresses.c index d8ba8ec60c6c..9a82cd0ba2f9 100644 --- a/scripts/dtc/libfdt/fdt_addresses.c +++ b/scripts/dtc/libfdt/fdt_addresses.c @@ -14,7 +14,7 @@ static int fdt_cells(const void *fdt, int nodeoffset, const char *name) { const fdt32_t *c; - int val; + uint32_t val; int len; c = fdt_getprop(fdt, nodeoffset, name, &len); @@ -25,10 +25,10 @@ static int fdt_cells(const void *fdt, int nodeoffset, const char *name) return -FDT_ERR_BADNCELLS; val = fdt32_to_cpu(*c); - if ((val <= 0) || (val > FDT_MAX_NCELLS)) + if (val > FDT_MAX_NCELLS) return -FDT_ERR_BADNCELLS; - return val; + return (int)val; } int fdt_address_cells(const void *fdt, int nodeoffset) @@ -36,6 +36,8 @@ int fdt_address_cells(const void *fdt, int nodeoffset) int val; val = fdt_cells(fdt, nodeoffset, "#address-cells"); + if (val == 0) + return -FDT_ERR_BADNCELLS; if (val == -FDT_ERR_NOTFOUND) return 2; return val; diff --git a/scripts/dtc/libfdt/fdt_overlay.c b/scripts/dtc/libfdt/fdt_overlay.c index e97f12b1a780..b310e49a698e 100644 --- a/scripts/dtc/libfdt/fdt_overlay.c +++ b/scripts/dtc/libfdt/fdt_overlay.c @@ -733,26 +733,36 @@ static int overlay_symbol_update(void *fdt, void *fdto) /* keep end marker to avoid strlen() */ e = path + path_len; - /* format: //__overlay__/ */ - if (*path != '/') return -FDT_ERR_BADVALUE; /* get fragment name first */ s = strchr(path + 1, '/'); - if (!s) - return -FDT_ERR_BADOVERLAY; + if (!s) { + /* Symbol refers to something that won't end + * up in the target tree */ + continue; + } frag_name = path + 1; frag_name_len = s - path - 1; /* verify format; safe since "s" lies in \0 terminated prop */ len = sizeof("/__overlay__/") - 1; - if ((e - s) < len || memcmp(s, "/__overlay__/", len)) - return -FDT_ERR_BADOVERLAY; - - rel_path = s + len; - rel_path_len = e - rel_path; + if ((e - s) > len && (memcmp(s, "/__overlay__/", len) == 0)) { + /* //__overlay__/ */ + rel_path = s + len; + rel_path_len = e - rel_path - 1; + } else if ((e - s) == len + && (memcmp(s, "/__overlay__", len - 1) == 0)) { + /* //__overlay__ */ + rel_path = ""; + rel_path_len = 0; + } else { + /* Symbol refers to something that won't end + * up in the target tree */ + continue; + } /* find the fragment index in which the symbol lies */ ret = fdt_subnode_offset_namelen(fdto, 0, frag_name, diff --git a/scripts/dtc/libfdt/fdt_ro.c b/scripts/dtc/libfdt/fdt_ro.c index 6fd9ec170dbe..a5c2797cde65 100644 --- a/scripts/dtc/libfdt/fdt_ro.c +++ b/scripts/dtc/libfdt/fdt_ro.c @@ -33,19 +33,20 @@ static int fdt_nodename_eq_(const void *fdt, int offset, const char *fdt_get_string(const void *fdt, int stroffset, int *lenp) { + int32_t totalsize = fdt_ro_probe_(fdt); uint32_t absoffset = stroffset + fdt_off_dt_strings(fdt); size_t len; int err; const char *s, *n; - err = fdt_ro_probe_(fdt); - if (err != 0) + err = totalsize; + if (totalsize < 0) goto fail; err = -FDT_ERR_BADOFFSET; - if (absoffset >= fdt_totalsize(fdt)) + if (absoffset >= totalsize) goto fail; - len = fdt_totalsize(fdt) - absoffset; + len = totalsize - absoffset; if (fdt_magic(fdt) == FDT_MAGIC) { if (stroffset < 0) @@ -288,7 +289,7 @@ const char *fdt_get_name(const void *fdt, int nodeoffset, int *len) const char *nameptr; int err; - if (((err = fdt_ro_probe_(fdt)) != 0) + if (((err = fdt_ro_probe_(fdt)) < 0) || ((err = fdt_check_node_offset_(fdt, nodeoffset)) < 0)) goto fail; diff --git a/scripts/dtc/libfdt/libfdt.h b/scripts/dtc/libfdt/libfdt.h index 7b5ffd13a887..8907b09b86cc 100644 --- a/scripts/dtc/libfdt/libfdt.h +++ b/scripts/dtc/libfdt/libfdt.h @@ -136,7 +136,7 @@ static inline uint32_t fdt32_ld(const fdt32_t *p) static inline void fdt32_st(void *property, uint32_t value) { - uint8_t *bp = property; + uint8_t *bp = (uint8_t *)property; bp[0] = value >> 24; bp[1] = (value >> 16) & 0xff; @@ -160,7 +160,7 @@ static inline uint64_t fdt64_ld(const fdt64_t *p) static inline void fdt64_st(void *property, uint64_t value) { - uint8_t *bp = property; + uint8_t *bp = (uint8_t *)property; bp[0] = value >> 56; bp[1] = (value >> 48) & 0xff; diff --git a/scripts/dtc/libfdt/libfdt_internal.h b/scripts/dtc/libfdt/libfdt_internal.h index 7830e550c37a..058c7358d441 100644 --- a/scripts/dtc/libfdt/libfdt_internal.h +++ b/scripts/dtc/libfdt/libfdt_internal.h @@ -10,12 +10,12 @@ #define FDT_ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) #define FDT_TAGALIGN(x) (FDT_ALIGN((x), FDT_TAGSIZE)) -int fdt_ro_probe_(const void *fdt); -#define FDT_RO_PROBE(fdt) \ - { \ - int err_; \ - if ((err_ = fdt_ro_probe_(fdt)) != 0) \ - return err_; \ +int32_t fdt_ro_probe_(const void *fdt); +#define FDT_RO_PROBE(fdt) \ + { \ + int32_t totalsize_; \ + if ((totalsize_ = fdt_ro_probe_(fdt)) < 0) \ + return totalsize_; \ } int fdt_check_node_offset_(const void *fdt, int offset); -- cgit v1.2.3-59-g8ed1b