c2e870
diff --git a/poppler/Parser.cc b/poppler/Parser.cc
c2e870
index bd4845ab..8f48efbe 100644
c2e870
--- a/poppler/Parser.cc
c2e870
+++ b/poppler/Parser.cc
c2e870
@@ -203,6 +203,20 @@ Stream *Parser::makeStream(Object *dict,
c2e870
   Goffset length;
c2e870
   Goffset pos, endPos;
c2e870
 
c2e870
+  if (xref) {
c2e870
+    XRefEntry *entry = xref->getEntry(objNum, gFalse);
c2e870
+    if (entry) {
c2e870
+      if (!entry->getFlag(XRefEntry::Parsing) ||
c2e870
+          (objNum == 0 && objGen == 0)) {
c2e870
+        entry->setFlag(XRefEntry::Parsing, gTrue);
c2e870
+      } else {
c2e870
+        error(errSyntaxError, getPos(),
c2e870
+              "Object '{0:d} {1:d} obj' is being already parsed", objNum, objGen);
c2e870
+        return NULL;
c2e870
+      }
c2e870
+    }
c2e870
+  }
c2e870
+
c2e870
   // get stream start position
c2e870
   lexer->skipToNextLine();
c2e870
   if (!(str = lexer->getStream())) {
c2e870
@@ -281,6 +295,16 @@ Stream *Parser::makeStream(Object *dict,
c2e870
   // get filters
c2e870
   str = str->addFilters(dict, recursion);
c2e870
 
c2e870
+  if (xref) {
c2e870
+    // Don't try to reuse the entry from the block at the start
c2e870
+    // of the function, xref can change in the middle because of
c2e870
+    // reconstruction
c2e870
+    XRefEntry *entry = xref->getEntry(objNum, gFalse);
c2e870
+    if (entry) {
c2e870
+      entry->setFlag(XRefEntry::Parsing, gFalse);
c2e870
+    }
c2e870
+  }
c2e870
+
c2e870
   return str;
c2e870
 }
c2e870
 
c2e870
diff --git a/poppler/XRef.h b/poppler/XRef.h
c2e870
index 11ee5e03..2eb2f9fd 100644
c2e870
--- a/poppler/XRef.h
c2e870
+++ b/poppler/XRef.h
c2e870
@@ -72,7 +72,10 @@ struct XRefEntry {
c2e870
 
c2e870
     // Special flags -- available only after xref->scanSpecialFlags() is run
c2e870
     Unencrypted, // Entry is stored in unencrypted form (meaningless in unencrypted documents)
c2e870
-    DontRewrite  // Entry must not be written back in case of full rewrite
c2e870
+    DontRewrite, // Entry must not be written back in case of full rewrite
c2e870
+
c2e870
+    // Regular flag (moved here to preserve values of previous flags)
c2e870
+    Parsing      // Entry is currently being parsed
c2e870
   };
c2e870
 
c2e870
   inline GBool getFlag(Flag flag) {