diff options
author | Himbeer <himbeer@disroot.org> | 2024-05-11 19:54:57 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-05-11 19:54:57 +0200 |
commit | 0005944f4b3a6f1a9a92c16c9ffe7435e1bdf095 (patch) | |
tree | 7fecfcb76872664bd0b1af059a79313a60ede90f | |
parent | 2984574f714fafe6f99e4cb2ad6a22c735925fc6 (diff) |
fdt: Fix parent pointer being set to temporary memory
-rw-r--r-- | src/fdt.zig | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/src/fdt.zig b/src/fdt.zig index 4fa47b3..b4fae6c 100644 --- a/src/fdt.zig +++ b/src/fdt.zig @@ -223,12 +223,14 @@ pub const Header = struct { const dt_strings: [*:0]const u8 = @ptrFromInt(dt_strings_addr); while (std.mem.bigToNative(u32, @as(*u32, @ptrFromInt(dt_struct_addr)).*) != token_end) { - const parsed = try parseNode(allocator, dt_struct_addr, dt_strings, null); + const parsed = try parseNode(allocator, dt_struct_addr, dt_strings); dt_struct_addr = parsed.addr; try nodes.insert(0, parsed.value); } - return .{ .nodes = nodes }; + var tree = Tree{ .nodes = nodes }; + initParentPtrs(&tree); + return tree; } }; @@ -286,7 +288,7 @@ fn nodeNameFilter(node: Node, name: []const u8) bool { return std.mem.eql(u8, trueName, name); } -fn parseNode(allocator: std.mem.Allocator, dt_struct_addr: usize, dt_strings: [*:0]const u8, parent: ?*Node) !ParseResult(Node) { +fn parseNode(allocator: std.mem.Allocator, dt_struct_addr: usize, dt_strings: [*:0]const u8) !ParseResult(Node) { var props = std.StringHashMap([]const u8).init(allocator); var subnodes = std.ArrayList(Node).init(allocator); @@ -326,7 +328,7 @@ fn parseNode(allocator: std.mem.Allocator, dt_struct_addr: usize, dt_strings: [* // Skip Nop tokens Header.token_nop => addr += @sizeOf(u32), Header.token_begin_node => { - const parsed = try parseNode(allocator, addr, dt_strings, null); + const parsed = try parseNode(allocator, addr, dt_strings); addr = parsed.addr; try subnodes.insert(0, parsed.value); }, @@ -336,20 +338,14 @@ fn parseNode(allocator: std.mem.Allocator, dt_struct_addr: usize, dt_strings: [* addr += @sizeOf(u32); - var self: Node = .{ - .name = std.mem.span(name), - .props = props, - .parent = parent, - .subnodes = subnodes, - }; - - for (0..self.subnodes.items.len) |i| { - self.subnodes.items[i].parent = &self; - } - return .{ .addr = addr, - .value = self, + .value = .{ + .name = std.mem.span(name), + .props = props, + .parent = null, + .subnodes = subnodes, + }, }; } @@ -388,3 +384,18 @@ fn parseProperty(dt_struct_addr: usize, dt_strings: [*:0]const u8) !ParseResult( }, }; } + +fn initParentPtrs(dt: *Tree) void { + for (dt.nodes.items, 0..) |_, i| { + for (dt.nodes.items[i].subnodes.items, 0..) |_, j| { + initParentPtrsRecursive(&dt.nodes.items[i].subnodes.items[j], &dt.nodes.items[i]); + } + } +} + +fn initParentPtrsRecursive(node: *Node, parent: *Node) void { + node.parent = parent; + for (node.subnodes.items, 0..) |_, i| { + initParentPtrsRecursive(&node.subnodes.items[i], node); + } +} |