Log detected cycles in LayerHierarchy#traverse
Prevents a stack overflow in the event of a cyclic
hierarchy.
Fixes: b/341182047
Test: atest SurfaceFlinger_test
Change-Id: I930cda6258cdabe0bdc98bd68bdd88f1de7c1a8c
diff --git a/services/surfaceflinger/FrontEnd/LayerHierarchy.h b/services/surfaceflinger/FrontEnd/LayerHierarchy.h
index f62e758..69710be 100644
--- a/services/surfaceflinger/FrontEnd/LayerHierarchy.h
+++ b/services/surfaceflinger/FrontEnd/LayerHierarchy.h
@@ -147,7 +147,7 @@
if (mLayer) {
root.id = mLayer->id;
}
- traverse(visitor, root);
+ traverse(visitor, root, /*depth=*/0);
}
// Traverse the hierarchy in z-order, skipping children that have relative parents.
@@ -190,7 +190,8 @@
void sortChildrenByZOrder();
void updateChild(LayerHierarchy*, LayerHierarchy::Variant);
void traverseInZOrder(const Visitor& visitor, LayerHierarchy::TraversalPath& parent) const;
- void traverse(const Visitor& visitor, LayerHierarchy::TraversalPath& parent) const;
+ void traverse(const Visitor& visitor, LayerHierarchy::TraversalPath& parent,
+ uint32_t depth = 0) const;
void dump(std::ostream& out, const std::string& prefix, LayerHierarchy::Variant variant,
bool isLastChild, bool includeMirroredHierarchy) const;