aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-05-11 19:54:57 +0200
committerHimbeer <himbeer@disroot.org>2024-05-11 19:54:57 +0200
commit0005944f4b3a6f1a9a92c16c9ffe7435e1bdf095 (patch)
tree7fecfcb76872664bd0b1af059a79313a60ede90f
parent2984574f714fafe6f99e4cb2ad6a22c735925fc6 (diff)
fdt: Fix parent pointer being set to temporary memory
-rw-r--r--src/fdt.zig43
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);
+ }
+}