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