File poppler-CVE-2022-48545.patch of Package poppler.34111

From 267ff8af69ae7e8526d9bfe5063207c87a9b70b5 Mon Sep 17 00:00:00 2001
From: Albert Astals Cid <aacid@kde.org>
Date: Sat, 2 Sep 2017 13:27:33 +0200
Subject: [PATCH] Fix infinite recursion in NameTree parsing in broken files

---
 poppler/Catalog.cc | 16 +++++++++++++---
 poppler/Catalog.h  |  2 +-
 2 files changed, 14 insertions(+), 4 deletions(-)

Index: poppler-0.24.4/poppler/Catalog.cc
===================================================================
--- poppler-0.24.4.orig/poppler/Catalog.cc
+++ poppler-0.24.4/poppler/Catalog.cc
@@ -668,13 +668,14 @@ int NameTree::Entry::cmpEntry(const void
 
 void NameTree::init(XRef *xrefA, Object *tree) {
   xref = xrefA;
-  parse(tree);
+  std::set<int> seen;
+  parse(tree, seen);
   if (entries && length > 0) {
     qsort(entries, length, sizeof(Entry *), Entry::cmpEntry);
   }
 }
 
-void NameTree::parse(Object *tree) {
+void NameTree::parse(Object *tree, std::set<int> &seen) {
   Object names;
   Object kids, kid;
   int i;
@@ -696,8 +697,18 @@ void NameTree::parse(Object *tree) {
   // root or intermediate node
   if (tree->dictLookup("Kids", &kids)->isArray()) {
     for (i = 0; i < kids.arrayGetLength(); ++i) {
+      Object kidRef;
+      kids.arrayGetNF(i, &kidRef);
+      if (kidRef.isRef()) {
+	const int numObj = kidRef.getRef().num;
+	if (seen.find(numObj) != seen.end()) {
+	  error(errSyntaxError, -1, "loop in NameTree (numObj: {0:d})", numObj);
+	  continue;
+	}
+	seen.insert(numObj);
+      }
       if (kids.arrayGet(i, &kid)->isDict())
-	parse(&kid);
+	parse(&kid, seen);
       kid.free();
     }
   }
Index: poppler-0.24.4/poppler/Catalog.h
===================================================================
--- poppler-0.24.4.orig/poppler/Catalog.h
+++ poppler-0.24.4/poppler/Catalog.h
@@ -81,7 +81,7 @@ private:
     static int cmp(const void *key, const void *entry);
   };
 
-  void parse(Object *tree);
+  void parse(Object *tree, std::set<int> &seen);
   void addEntry(Entry *entry);
 
   XRef *xref;
openSUSE Build Service is sponsored by