summaryrefslogtreecommitdiffstats
path: root/common/oftree.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2021-03-22 12:20:26 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2021-03-23 12:13:58 +0100
commitc4460b9d43f6d3d636cf2b374e1591d7e49c85d3 (patch)
tree1d6e2b6c4e77bb3a134af7e48b4ff389c697b7d9 /common/oftree.c
parent447306739800a2e3403649f665b0806bca7e5777 (diff)
downloadbarebox-c4460b9d43f6d3d636cf2b374e1591d7e49c85d3.tar.gz
barebox-c4460b9d43f6d3d636cf2b374e1591d7e49c85d3.tar.xz
of: Return copy of live tree as fixed tree
the of fixups modify the the tree passed to them. It is undesired that these modify the live tree, so when we are requested to return the fixed live tree then make a copy first. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'common/oftree.c')
-rw-r--r--common/oftree.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/common/oftree.c b/common/oftree.c
index 075b9d6b8b..60d4327155 100644
--- a/common/oftree.c
+++ b/common/oftree.c
@@ -319,21 +319,27 @@ int of_fix_tree(struct device_node *node)
struct fdt_header *of_get_fixed_tree(struct device_node *node)
{
int ret;
- struct fdt_header *fdt;
+ struct fdt_header *fdt = NULL;
+ struct device_node *freenp = NULL;
if (!node) {
node = of_get_root_node();
if (!node)
return NULL;
+
+ freenp = node = of_copy_node(NULL, node);
+ if (!node)
+ return NULL;
}
ret = of_fix_tree(node);
if (ret)
- return NULL;
+ goto out;
fdt = of_flatten_dtb(node);
- if (!fdt)
- return NULL;
+
+out:
+ of_delete_node(freenp);
return fdt;
}