libfdt: Make properties of FdtNode outlive
Properties of FdtNode from Fdt::node() outlive than its node.
This CL makes the lifetime for subnodes() and descendants() consistent
with Fdt::node().
Bug: 317830919
Test: atest liblibfdt.integration_test
Change-Id: Id1b32a498ee63063c0b14bd4713135d238d76954
diff --git a/libs/libfdt/src/iterators.rs b/libs/libfdt/src/iterators.rs
index a524655..7406164 100644
--- a/libs/libfdt/src/iterators.rs
+++ b/libs/libfdt/src/iterators.rs
@@ -330,7 +330,7 @@
}
impl<'a> DescendantsIterator<'a> {
- pub(crate) fn new(node: &'a FdtNode) -> Self {
+ pub(crate) fn new(node: &FdtNode<'a>) -> Self {
Self { node: Some((*node, 0)) }
}
}
diff --git a/libs/libfdt/src/lib.rs b/libs/libfdt/src/lib.rs
index 14f0f37..d90f5f0 100644
--- a/libs/libfdt/src/lib.rs
+++ b/libs/libfdt/src/lib.rs
@@ -487,7 +487,7 @@
}
/// Returns an iterator of descendants
- pub fn descendants(&'a self) -> DescendantsIterator<'a> {
+ pub fn descendants(&self) -> DescendantsIterator<'a> {
DescendantsIterator::new(self)
}
diff --git a/libs/libfdt/tests/api_test.rs b/libs/libfdt/tests/api_test.rs
index e0c10b8..08fb8a5 100644
--- a/libs/libfdt/tests/api_test.rs
+++ b/libs/libfdt/tests/api_test.rs
@@ -435,3 +435,58 @@
root.descendants().map(|(node, depth)| (node.name(), depth)).collect();
assert_eq!(expected_nodes, all_descendants);
}
+
+#[test]
+#[ignore] // Borrow checker test. Compilation success is sufficient.
+fn node_name_lifetime() {
+ let data = fs::read(TEST_TREE_PHANDLE_PATH).unwrap();
+ let fdt = Fdt::from_slice(&data).unwrap();
+
+ let name = {
+ let root = fdt.root().unwrap();
+ root.name()
+ // Make root to be dropped
+ };
+ assert_eq!(Ok(cstr!("")), name);
+}
+
+#[test]
+#[ignore] // Borrow checker test. Compilation success is sufficient.
+fn node_subnode_lifetime() {
+ let data = fs::read(TEST_TREE_PHANDLE_PATH).unwrap();
+ let fdt = Fdt::from_slice(&data).unwrap();
+
+ let name = {
+ let node_a = {
+ let root = fdt.root().unwrap();
+ root.subnode(cstr!("node_a")).unwrap()
+ // Make root to be dropped
+ };
+ assert_ne!(None, node_a);
+ node_a.unwrap().name()
+ // Make node_a to be dropped
+ };
+ assert_eq!(Ok(cstr!("node_a")), name);
+}
+
+#[test]
+#[ignore] // Borrow checker test. Compilation success is sufficient.
+fn node_descendants_lifetime() {
+ let data = fs::read(TEST_TREE_PHANDLE_PATH).unwrap();
+ let fdt = Fdt::from_slice(&data).unwrap();
+
+ let first_descendant_name = {
+ let (first_descendant, _) = {
+ let mut descendants_iter = {
+ let root = fdt.root().unwrap();
+ root.descendants()
+ // Make root to be dropped
+ };
+ descendants_iter.next().unwrap()
+ // Make descendants_iter to be dropped
+ };
+ first_descendant.name()
+ // Make first_descendant to be dropped
+ };
+ assert_eq!(Ok(cstr!("node_a")), first_descendant_name);
+}