Merge cd5247e5007eb8cc3b9810a5f923faad056e204f on remote branch
Change-Id: I106ed512377c620707c0076690b0491042bc7067
diff --git a/ufdt_convert.c b/ufdt_convert.c
index 5c69f1f..9e7922a 100644
--- a/ufdt_convert.c
+++ b/ufdt_convert.c
@@ -196,13 +196,21 @@
const char *alias_path =
ufdt_node_get_fdt_prop_data(aliases_node, &path_len);
- if (alias_path == NULL) {
- dto_error("Failed to find alias %s\n", path);
+ if (alias_path == NULL || path_len == 0) {
+ dto_error("Failed to find valid alias %s\n", path);
+ return NULL;
+ }
+
+ /* property data must be a nul terminated string */
+ int alias_len = strnlen(alias_path, path_len);
+
+ if (alias_len != path_len - 1 || alias_len == 0) {
+ dto_error("Invalid alias for %s\n", path);
return NULL;
}
struct ufdt_node *target_node =
- ufdt_node_get_node_by_path_len(tree->root, alias_path, path_len);
+ ufdt_node_get_node_by_path_len(tree->root, alias_path, alias_len);
return ufdt_node_get_node_by_path_len(target_node, next_slash,
end - next_slash);
@@ -292,9 +300,16 @@
return ufdt_construct(NULL, pool);
}
- struct ufdt *res_tree = ufdt_construct(fdtp, pool);
int end_offset;
int start_tag = fdt_next_tag(fdtp, start_offset, &end_offset);
+
+ if (start_tag != FDT_BEGIN_NODE) {
+ return ufdt_construct(NULL, pool);
+ }
+
+ struct ufdt *res_tree = ufdt_construct(fdtp, pool);
+ if (res_tree == NULL) return NULL;
+
res_tree->root =
fdt_to_ufdt_tree(fdtp, start_offset, &end_offset, start_tag, pool);