|
|
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) {
|