|
@@ -867,6 +867,7 @@ int fdt_check_full(const void *fdt, size_t bufsize)
|
|
|
unsigned depth = 0;
|
|
|
const void *prop;
|
|
|
const char *propname;
|
|
|
+ bool expect_end = false;
|
|
|
|
|
|
if (bufsize < FDT_V1_SIZE)
|
|
|
return -FDT_ERR_TRUNCATED;
|
|
@@ -887,6 +888,10 @@ int fdt_check_full(const void *fdt, size_t bufsize)
|
|
|
if (nextoffset < 0)
|
|
|
return nextoffset;
|
|
|
|
|
|
+ /* If we see two root nodes, something is wrong */
|
|
|
+ if (expect_end && tag != FDT_END)
|
|
|
+ return -FDT_ERR_BADLAYOUT;
|
|
|
+
|
|
|
switch (tag) {
|
|
|
case FDT_NOP:
|
|
|
break;
|
|
@@ -900,12 +905,24 @@ int fdt_check_full(const void *fdt, size_t bufsize)
|
|
|
depth++;
|
|
|
if (depth > INT_MAX)
|
|
|
return -FDT_ERR_BADSTRUCTURE;
|
|
|
+
|
|
|
+ /* The root node must have an empty name */
|
|
|
+ if (depth == 1) {
|
|
|
+ const char *name;
|
|
|
+ int len;
|
|
|
+
|
|
|
+ name = fdt_get_name(fdt, offset, &len);
|
|
|
+ if (*name || len)
|
|
|
+ return -FDT_ERR_BADLAYOUT;
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
case FDT_END_NODE:
|
|
|
if (depth == 0)
|
|
|
return -FDT_ERR_BADSTRUCTURE;
|
|
|
depth--;
|
|
|
+ if (depth == 0)
|
|
|
+ expect_end = true;
|
|
|
break;
|
|
|
|
|
|
case FDT_PROP:
|