aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-10-17 23:03:49 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-10-17 23:03:49 +0000
commit81aa549aa7f78edb3fc67d71f9bd7b3823ac98d6 (patch)
tree6592a432c0666810878e34f66af02ae02fe0a068
parent41ef68c7911a573cbd6437b350e4087cea626d6a (diff)
parente5b8c171c50ad29e12b3689cc0cc8ef1a0fcb313 (diff)
downloaddtc-81aa549aa7f78edb3fc67d71f9bd7b3823ac98d6.tar.gz
Snap for 10964793 from e5b8c171c50ad29e12b3689cc0cc8ef1a0fcb313 to sdk-release
Change-Id: I7ebddfbda2df84550ce677ecfffdb57d780a3ace
-rw-r--r--Android.bp27
-rw-r--r--BUILD.bazel95
-rw-r--r--METADATA_version.sed1
-rw-r--r--libfdt/Android.bp7
-rw-r--r--libfdt/fdt.c21
-rw-r--r--libfdt/fdt_ro.c47
-rw-r--r--tests/aliases.dts4
-rw-r--r--tests/get_alias.c14
-rw-r--r--tests/path_offset.c8
-rw-r--r--util.c2
-rw-r--r--version_non_gen.h1
11 files changed, 123 insertions, 104 deletions
diff --git a/Android.bp b/Android.bp
index cb13748..2d121ec 100644
--- a/Android.bp
+++ b/Android.bp
@@ -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);
diff --git a/util.c b/util.c
index 197fb19..507f012 100644
--- a/util.c
+++ b/util.c
@@ -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"