commonlib/device_tree: Utilize list_move() in dt_copy_subtree()
In dt_copy_subtree(), the device_tree_node copying
*dst_node = *src_node;
doesn't work correctly for circular linked lists [1], because the 'next'
pointer of the last element isn't modified to point to the dst head.
As the only public caller of dt_copy_subtree() is dt_apply_overlay(),
and the dt_apply_overlay() function comment already explicitly disallows
'overlay' accesses after the call, fix the problem by utilizing
list_move() for copying device tree node properties and children.
Also add a new test case test_dt_apply_overlay.
[1] commit 23c41622a9 ("commonlib/list: Change to circular list")
BUG=b:434080284
TEST=emerge-rauru coreboot libpayload
BRANCH=none
Change-Id: I166ab74c9de67330d52f94e92b5d7ce5ddefa82b
Signed-off-by: Yu-Ping Wu <yupingso@google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/91558
Reviewed-by: Karthik Ramasubramanian <kramasub@google.com>
Reviewed-by: Kapil Porwal <kapilporwal@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
Reviewed-by: Subrata Banik <subratabanik@google.com>
Reviewed-by: Jakub "Kuba" Czapiga <czapiga@google.com>
This commit is contained in:
parent
89048780c0
commit
1e1b63c23b
3 changed files with 128 additions and 1 deletions
|
|
@ -2001,7 +2001,10 @@ static void dt_copy_subtree(struct device_tree_node *dst,
|
|||
|
||||
if (!dst_node) {
|
||||
dst_node = alloc_node();
|
||||
*dst_node = *src_node;
|
||||
dst_node->name = src_node->name;
|
||||
dst_node->phandle = src_node->phandle;
|
||||
list_move(&dst_node->properties, &src_node->properties);
|
||||
list_move(&dst_node->children, &src_node->children);
|
||||
list_insert_after(&dst_node->list_node, &dst->children);
|
||||
} else {
|
||||
dt_copy_subtree(dst_node, src_node, upd);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue