libfdt: Fix bug in delete_and_next_node()

Test: T/H
Change-Id: I41ceb4abd79b2de2cdfbf0f2766499157fabe5e0
diff --git a/libs/libfdt/src/lib.rs b/libs/libfdt/src/lib.rs
index d1ab24e..58b4463 100644
--- a/libs/libfdt/src/lib.rs
+++ b/libs/libfdt/src/lib.rs
@@ -493,6 +493,7 @@
             let next_node = self.delete_and_next(Some(offset))?.unwrap();
             Ok(Some((next_node, depth)))
         } else {
+            self.delete_and_next(None)?;
             Ok(None)
         }
     }
diff --git a/libs/libfdt/tests/api_test.rs b/libs/libfdt/tests/api_test.rs
index ddc4538..ce85172 100644
--- a/libs/libfdt/tests/api_test.rs
+++ b/libs/libfdt/tests/api_test.rs
@@ -438,6 +438,22 @@
 }
 
 #[test]
+fn node_mut_delete_and_next_node_with_last_node() {
+    let mut data = fs::read(TEST_TREE_WITH_EMPTY_MEMORY_RANGE_PATH).unwrap();
+    let fdt = Fdt::from_mut_slice(&mut data).unwrap();
+
+    let mut iter = fdt.root_mut().unwrap().next_node(0).unwrap();
+    while let Some((node, depth)) = iter {
+        iter = node.delete_and_next_node(depth).unwrap();
+    }
+
+    let root = fdt.root().unwrap();
+    let all_descendants: Vec<_> =
+        root.descendants().map(|(node, depth)| (node.name(), depth)).collect();
+    assert!(all_descendants.is_empty(), "{all_descendants:?}");
+}
+
+#[test]
 #[ignore] // Borrow checker test. Compilation success is sufficient.
 fn node_name_lifetime() {
     let data = fs::read(TEST_TREE_PHANDLE_PATH).unwrap();