diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-10-17 23:03:49 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-10-17 23:03:49 +0000 |
commit | 81aa549aa7f78edb3fc67d71f9bd7b3823ac98d6 (patch) | |
tree | 6592a432c0666810878e34f66af02ae02fe0a068 | |
parent | 41ef68c7911a573cbd6437b350e4087cea626d6a (diff) | |
parent | e5b8c171c50ad29e12b3689cc0cc8ef1a0fcb313 (diff) | |
download | dtc-81aa549aa7f78edb3fc67d71f9bd7b3823ac98d6.tar.gz |
Snap for 10964793 from e5b8c171c50ad29e12b3689cc0cc8ef1a0fcb313 to sdk-release
Change-Id: I7ebddfbda2df84550ce677ecfffdb57d780a3ace
-rw-r--r-- | Android.bp | 27 | ||||
-rw-r--r-- | BUILD.bazel | 95 | ||||
-rw-r--r-- | METADATA_version.sed | 1 | ||||
-rw-r--r-- | libfdt/Android.bp | 7 | ||||
-rw-r--r-- | libfdt/fdt.c | 21 | ||||
-rw-r--r-- | libfdt/fdt_ro.c | 47 | ||||
-rw-r--r-- | tests/aliases.dts | 4 | ||||
-rw-r--r-- | tests/get_alias.c | 14 | ||||
-rw-r--r-- | tests/path_offset.c | 8 | ||||
-rw-r--r-- | util.c | 2 | ||||
-rw-r--r-- | version_non_gen.h | 1 |
11 files changed, 123 insertions, 104 deletions
@@ -44,16 +44,25 @@ license { } cc_defaults { - name: "dt_defaults", + name: "dtc_cflags_defaults", cflags: [ "-Wall", "-Werror", - "-Wno-sign-compare", + "-Wno-macro-redefined", "-Wno-missing-field-initializers", + "-Wno-sign-compare", "-Wno-unused-parameter", + ], +} + +cc_defaults { + name: "dt_defaults", + defaults: ["dtc_cflags_defaults"], + cflags: [ "-DNO_YAML" ], + generated_headers: ["dtc_version_gen.h"], shared_libs: ["libfdt"], stl: "none", @@ -109,3 +118,17 @@ cc_binary_host { "util.c", ], } + +genrule { + name: "dtc_version_gen.h", + out: ["version_gen.h"], + srcs: ["version_gen.h.in"], + tool_files: [ + "METADATA", + "METADATA_version.sed", + ], + cmd: "version=$$(" + + "sed -f $(location METADATA_version.sed) -n $(location METADATA)" + + ")-Android-build;" + + "sed s/@VCS_TAG@/$${version}/ $(in) > $(out)", +} diff --git a/BUILD.bazel b/BUILD.bazel index 439621d..56aeed2 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -1,88 +1,84 @@ +COPTS = [ + "-Wall", + "-Werror", + "-Wno-macro-redefined", + "-Wno-missing-field-initializers", + "-Wno-sign-compare", + "-Wno-unused-parameter", +] + cc_library( name = "libfdt", srcs = glob([ "libfdt/*.h", "libfdt/*.c", ]), - copts = [ - "-Werror", - "-Wno-macro-redefined", - "-Wno-sign-compare", - ], + copts = COPTS, includes = ["libfdt"], ) -COPTS = [ - "-Wall", - "-Werror", - "-Wno-sign-compare", - "-Wno-missing-field-initializers", - "-Wno-unused-parameter", -] - genrule( - name = "lexer", - srcs = [ - "dtc-lexer.l", - ":parser", - ], + name = "dtc_lexer_srcs", + srcs = ["dtc-lexer.l"], outs = ["dtc-lexer.lex.c"], - cmd = "lex -o$@ $(location dtc-lexer.l)", + cmd = "lex -o $@ $<", ) genrule( - name = "parser", + name = "dtc_parser_srcs", srcs = ["dtc-parser.y"], outs = [ "dtc-parser.c", "dtc-parser.h", ], - cmd = """ - bison -b dtc-parser -d $(location dtc-parser.y) - cp ./*.c $(location dtc-parser.c) - cp ./*.h $(location dtc-parser.h) - """, + cmd = "bison -d -o $(location dtc-parser.c) $(location dtc-parser.y)", ) -cc_library( - name = "dtc_gen", +UTILS = [ + "util.c", + "util.h", + ":version_gen_header", +] + +genrule( + name = "version_gen_header", + outs = ["version_gen.h"], srcs = [ - ":lexer", - ":parser", + "METADATA", + "METADATA_version.sed", + "version_gen.h.in", ], - hdrs = glob(["*.h"]), - copts = COPTS, - deps = [":libfdt"], + cmd = """ + version="$$(sed -f $(location METADATA_version.sed) -n $(location METADATA))-Android-build" + sed s/@VCS_TAG@/$${version}/ $(location version_gen.h.in) > $@ + """, ) cc_binary( name = "dtc", - srcs = [ + srcs = UTILS + [ + ":dtc_lexer_srcs", + ":dtc_parser_srcs", "checks.c", "data.c", "dtc.c", + "dtc.h", "flattree.c", "fstree.c", "livetree.c", "srcpos.c", + "srcpos.h", "treesource.c", - "util.c", ], copts = COPTS, defines = ["NO_YAML"], - deps = [ - ":dtc_gen", - ":libfdt", - ], + deps = [":libfdt"], ) cc_binary( name = "fdtget", - srcs = [ + srcs = UTILS + [ "fdtget.c", - "util.c", - "util.h", - "version_non_gen.h", ], copts = COPTS, defines = ["NO_YAML"], @@ -91,11 +87,8 @@ cc_binary( cc_binary( name = "fdtput", - srcs = [ + srcs = UTILS + [ "fdtput.c", - "util.c", - "util.h", - "version_non_gen.h", ], copts = COPTS, defines = ["NO_YAML"], @@ -104,11 +97,8 @@ cc_binary( cc_binary( name = "fdtdump", - srcs = [ + srcs = UTILS + [ "fdtdump.c", - "util.c", - "util.h", - "version_non_gen.h", ], copts = COPTS, defines = ["NO_YAML"], @@ -117,11 +107,8 @@ cc_binary( cc_binary( name = "fdtoverlay", - srcs = [ + srcs = UTILS + [ "fdtoverlay.c", - "util.c", - "util.h", - "version_non_gen.h", ], copts = COPTS, defines = ["NO_YAML"], diff --git a/METADATA_version.sed b/METADATA_version.sed new file mode 100644 index 0000000..9e7ea54 --- /dev/null +++ b/METADATA_version.sed @@ -0,0 +1 @@ +s/^[[:space:]]*version:[[:space:]]*"v\([[:digit:]][[:digit:]]*.[[:digit:]][[:digit:]]*.[[:digit:]][[:digit:]]*\)"[[:space:]]*/\1/p diff --git a/libfdt/Android.bp b/libfdt/Android.bp index 8f4bdfd..0bf631a 100644 --- a/libfdt/Android.bp +++ b/libfdt/Android.bp @@ -7,12 +7,7 @@ package { cc_library { name: "libfdt", host_supported: true, - - cflags: [ - "-Werror", - "-Wno-macro-redefined", - "-Wno-sign-compare", - ], + defaults: ["dtc_cflags_defaults"], srcs: [ "fdt.c", "fdt_check.c", diff --git a/libfdt/fdt.c b/libfdt/fdt.c index c17cad5..b8ffb33 100644 --- a/libfdt/fdt.c +++ b/libfdt/fdt.c @@ -165,7 +165,7 @@ const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int len) uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset) { const fdt32_t *tagp, *lenp; - uint32_t tag; + uint32_t tag, len, sum; int offset = startoffset; const char *p; @@ -188,23 +188,22 @@ uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset) break; case FDT_PROP: - lenp = fdt_offset_ptr(fdt, offset, sizeof(struct fdt_property) - FDT_TAGSIZE); + lenp = fdt_offset_ptr(fdt, offset, sizeof(*lenp)); if (!can_assume(VALID_DTB) && !lenp) return FDT_END; /* premature end */ - /* skip name offset, length */ - offset += sizeof(struct fdt_property) - FDT_TAGSIZE; - - if (!can_assume(VALID_DTB) - && !fdt_offset_ptr(fdt, offset, fdt32_to_cpu(*lenp))) + len = fdt32_to_cpu(*lenp); + sum = len + offset; + if (!can_assume(VALID_DTB) && + (INT_MAX <= sum || sum < (uint32_t) offset)) return FDT_END; /* premature end */ - /* skip value */ - offset += fdt32_to_cpu(*lenp); + /* skip-name offset, length and value */ + offset += sizeof(struct fdt_property) - FDT_TAGSIZE + len; if (!can_assume(LATEST) && - fdt_version(fdt) < 0x10 && fdt32_to_cpu(*lenp) >= 8 && - ((offset - fdt32_to_cpu(*lenp)) % 8) != 0) + fdt_version(fdt) < 0x10 && len >= 8 && + ((offset - len) % 8) != 0) offset += 4; break; diff --git a/libfdt/fdt_ro.c b/libfdt/fdt_ro.c index 362cc4a..09d92d4 100644 --- a/libfdt/fdt_ro.c +++ b/libfdt/fdt_ro.c @@ -10,14 +10,6 @@ #include "libfdt_internal.h" -/* Check if a buffer contains a nul-terminated string. - * Used for checking property values which should be strings. - */ -static bool is_nul_string(const char *buf, const size_t buf_len) { - return buf_len > 0 && buf[buf_len - 1] == '\0' && - strnlen(buf, buf_len) == buf_len - 1; -} - static int fdt_nodename_eq_(const void *fdt, int offset, const char *s, int len) { @@ -263,7 +255,7 @@ int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen) FDT_RO_PROBE(fdt); - if (namelen < 1) + if (!can_assume(VALID_INPUT) && namelen <= 0) return -FDT_ERR_BADPATH; /* see if we have an alias */ @@ -533,30 +525,31 @@ uint32_t fdt_get_phandle(const void *fdt, int nodeoffset) return fdt32_ld_(php); } +static const void *fdt_path_getprop_namelen(const void *fdt, const char *path, + const char *propname, int propnamelen, + int *lenp) +{ + int offset = fdt_path_offset(fdt, path); + + if (offset < 0) + return NULL; + + return fdt_getprop_namelen(fdt, offset, propname, propnamelen, lenp); +} + const char *fdt_get_alias_namelen(const void *fdt, const char *name, int namelen) { - const char *prop; - int aliasoffset; - int prop_len; + int len; + const char *alias; - aliasoffset = fdt_path_offset(fdt, "/aliases"); - if (aliasoffset < 0) - return NULL; + alias = fdt_path_getprop_namelen(fdt, "/aliases", name, namelen, &len); - prop = fdt_getprop_namelen(fdt, aliasoffset, name, namelen, &prop_len); - if (prop && !can_assume(VALID_INPUT)) { - /* Validate the alias value. From the devicetree spec v0.3: - * "An alias value is a device path and is encoded as a string. - * The value representes the full path to a node, ..." - * A full path must start at the root to prevent recursion. - */ - if (prop_len == 0 || *prop != '/' || !is_nul_string(prop, prop_len)) { - prop = NULL; - } - } + if (!can_assume(VALID_DTB) && + !(alias && len > 0 && alias[len - 1] == '\0' && *alias == '/')) + return NULL; - return prop; + return alias; } const char *fdt_get_alias(const void *fdt, const char *name) diff --git a/tests/aliases.dts b/tests/aliases.dts index 853479a..03ed675 100644 --- a/tests/aliases.dts +++ b/tests/aliases.dts @@ -5,6 +5,10 @@ #size-cells = <0>; aliases { + empty = ""; + loop = "loop"; + nonull = [626164]; + relative = "s1/subsubnode"; s1 = &sub1; ss1 = &subsub1; sss1 = &subsubsub1; diff --git a/tests/get_alias.c b/tests/get_alias.c index fb2c38c..d2888d6 100644 --- a/tests/get_alias.c +++ b/tests/get_alias.c @@ -21,9 +21,16 @@ static void check_alias(void *fdt, const char *path, const char *alias) aliaspath = fdt_get_alias(fdt, alias); - if (path && !aliaspath) + if (!path && !aliaspath) + return; + + if (!aliaspath) FAIL("fdt_get_alias(%s) failed\n", alias); + if (!path) + FAIL("fdt_get_alias(%s) returned %s instead of NULL", + alias, aliaspath); + if (strcmp(aliaspath, path) != 0) FAIL("fdt_get_alias(%s) returned %s instead of %s\n", alias, aliaspath, path); @@ -36,9 +43,14 @@ int main(int argc, char *argv[]) test_init(argc, argv); fdt = load_blob_arg(argc, argv); + check_alias(fdt, NULL, "empty"); + check_alias(fdt, NULL, "nonull"); + check_alias(fdt, NULL, "relative"); check_alias(fdt, "/subnode@1", "s1"); check_alias(fdt, "/subnode@1/subsubnode", "ss1"); check_alias(fdt, "/subnode@1/subsubnode/subsubsubnode", "sss1"); + check_alias(fdt, NULL, "loop"); // Might trigger a stack overflow + PASS(); } diff --git a/tests/path_offset.c b/tests/path_offset.c index 82527d4..07e9d65 100644 --- a/tests/path_offset.c +++ b/tests/path_offset.c @@ -48,10 +48,13 @@ static void check_path_offset(void *fdt, char *path, int offset) verbose_printf("Checking offset of \"%s\" is %d...\n", path, offset); rc = fdt_path_offset(fdt, path); + if (rc == offset) + return; + if (rc < 0) FAIL("fdt_path_offset(\"%s\") failed: %s", path, fdt_strerror(rc)); - if (rc != offset) + else FAIL("fdt_path_offset(\"%s\") returned incorrect offset" " %d instead of %d", path, rc, offset); } @@ -102,6 +105,7 @@ int main(int argc, char *argv[]) check_path_offset(fdt, "/subnode@2/subsubnode", subsubnode2_offset2); /* Test paths with extraneous separators */ + check_path_offset(fdt, "", -FDT_ERR_BADPATH); check_path_offset(fdt, "//", 0); check_path_offset(fdt, "///", 0); check_path_offset(fdt, "//subnode@1", subnode1_offset); @@ -110,6 +114,8 @@ int main(int argc, char *argv[]) check_path_offset(fdt, "/subnode@2////subsubnode", subsubnode2_offset2); /* Test fdt_path_offset_namelen() */ + check_path_offset_namelen(fdt, "/subnode@1", -1, -FDT_ERR_BADPATH); + check_path_offset_namelen(fdt, "/subnode@1", 0, -FDT_ERR_BADPATH); check_path_offset_namelen(fdt, "/subnode@1", 1, 0); check_path_offset_namelen(fdt, "/subnode@1/subsubnode", 10, subnode1_offset); check_path_offset_namelen(fdt, "/subnode@1/subsubnode", 11, subnode1_offset); @@ -21,7 +21,7 @@ #include "libfdt.h" #include "util.h" -#include "version_non_gen.h" +#include "version_gen.h" char *xstrdup(const char *s) { diff --git a/version_non_gen.h b/version_non_gen.h deleted file mode 100644 index 3376b35..0000000 --- a/version_non_gen.h +++ /dev/null @@ -1 +0,0 @@ -#define DTC_VERSION "DTC 1.6.0-Android-build" |