RoleMapResolve: Deal with different circular references
diff --git a/poppler/StructElement.cc b/poppler/StructElement.cc index 9a1f519..1c26efa 100644 --- a/poppler/StructElement.cc +++ b/poppler/StructElement.cc
@@ -876,10 +876,11 @@ treeRoot->getDoc()->displayPages(&mcdev, startPage, endPage, 72.0, 72.0, 0, true, false, false); return mcdev.getTextSpans(); } - static StructElement::Type roleMapResolve(Dict *roleMap, const char *name) { Object resolved = roleMap->lookup(name); + std::set<std::string> recursion; + recursion.insert(name); while (true) { if (resolved.isName()) { StructElement::Type type = nameToType(resolved.getName()); @@ -887,8 +888,9 @@ return type; } resolved = roleMap->lookup(resolved.getName()); - if (resolved.isName(name)) { + if (!recursion.insert(resolved.getName()).second) { // circular reference + error(errSyntaxWarning, -1, "RoleMap entries contains circular references"); return StructElement::Unknown; } continue;