libfdt: Fix subnodes() lifetime
Bug: 318431695
Test: atest liblibfdt.integration_test
Change-Id: Ib0ca4c9eb74918896666544793362acfc372e689
diff --git a/libs/libfdt/src/iterators.rs b/libs/libfdt/src/iterators.rs
index 7406164..e818c68 100644
--- a/libs/libfdt/src/iterators.rs
+++ b/libs/libfdt/src/iterators.rs
@@ -304,7 +304,7 @@
}
impl<'a> SubnodeIterator<'a> {
- pub(crate) fn new(node: &'a FdtNode) -> Result<Self, FdtError> {
+ pub(crate) fn new(node: &FdtNode<'a>) -> Result<Self, FdtError> {
let subnode = node.first_subnode()?;
Ok(Self { subnode })
diff --git a/libs/libfdt/src/lib.rs b/libs/libfdt/src/lib.rs
index d90f5f0..9782dde 100644
--- a/libs/libfdt/src/lib.rs
+++ b/libs/libfdt/src/lib.rs
@@ -468,7 +468,7 @@
}
/// Returns an iterator of subnodes
- pub fn subnodes(&'a self) -> Result<SubnodeIterator<'a>> {
+ pub fn subnodes(&self) -> Result<SubnodeIterator<'a>> {
SubnodeIterator::new(self)
}
diff --git a/libs/libfdt/tests/api_test.rs b/libs/libfdt/tests/api_test.rs
index 08fb8a5..4b1877a 100644
--- a/libs/libfdt/tests/api_test.rs
+++ b/libs/libfdt/tests/api_test.rs
@@ -471,6 +471,28 @@
#[test]
#[ignore] // Borrow checker test. Compilation success is sufficient.
+fn node_subnodess_lifetime() {
+ let data = fs::read(TEST_TREE_PHANDLE_PATH).unwrap();
+ let fdt = Fdt::from_slice(&data).unwrap();
+
+ let first_subnode_name = {
+ let first_subnode = {
+ let mut subnodes_iter = {
+ let root = fdt.root().unwrap();
+ root.subnodes().unwrap()
+ // Make root to be dropped
+ };
+ subnodes_iter.next().unwrap()
+ // Make subnodess_iter to be dropped
+ };
+ first_subnode.name()
+ // Make first_subnode to be dropped
+ };
+ assert_eq!(Ok(cstr!("node_a")), first_subnode_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();