mirror of
https://github.com/qpdf/qpdf.git
synced 2024-11-14 16:54:03 +00:00
Merge pull request #1269 from m-holger/hybrid
Fix handling of hybrid reference files in QPDF::read_xrefTable
This commit is contained in:
commit
bcf56e5333
@ -952,8 +952,6 @@ QPDF::read_xrefEntry(qpdf_offset_t& f1, int& f2, char& type)
|
|||||||
qpdf_offset_t
|
qpdf_offset_t
|
||||||
QPDF::read_xrefTable(qpdf_offset_t xref_offset)
|
QPDF::read_xrefTable(qpdf_offset_t xref_offset)
|
||||||
{
|
{
|
||||||
std::vector<QPDFObjGen> deleted_items;
|
|
||||||
|
|
||||||
m->file->seek(xref_offset, SEEK_SET);
|
m->file->seek(xref_offset, SEEK_SET);
|
||||||
std::string line;
|
std::string line;
|
||||||
while (true) {
|
while (true) {
|
||||||
@ -982,8 +980,7 @@ QPDF::read_xrefTable(qpdf_offset_t xref_offset)
|
|||||||
"xref table", "invalid xref entry (obj=" + std::to_string(i) + ")");
|
"xref table", "invalid xref entry (obj=" + std::to_string(i) + ")");
|
||||||
}
|
}
|
||||||
if (type == 'f') {
|
if (type == 'f') {
|
||||||
// Save deleted items until after we've checked the XRefStm, if any.
|
insertFreeXrefEntry(QPDFObjGen(toI(i), f2));
|
||||||
deleted_items.emplace_back(toI(i), f2);
|
|
||||||
} else {
|
} else {
|
||||||
insertXrefEntry(toI(i), 1, f1, f2);
|
insertXrefEntry(toI(i), 1, f1, f2);
|
||||||
}
|
}
|
||||||
@ -1030,23 +1027,16 @@ QPDF::read_xrefTable(qpdf_offset_t xref_offset)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle any deleted items now that we've read the /XRefStm.
|
|
||||||
for (auto const& og: deleted_items) {
|
|
||||||
insertFreeXrefEntry(og);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cur_trailer.hasKey("/Prev")) {
|
if (cur_trailer.hasKey("/Prev")) {
|
||||||
if (!cur_trailer.getKey("/Prev").isInteger()) {
|
if (!cur_trailer.getKey("/Prev").isInteger()) {
|
||||||
QTC::TC("qpdf", "QPDF trailer prev not integer");
|
QTC::TC("qpdf", "QPDF trailer prev not integer");
|
||||||
throw damagedPDF("trailer", "/Prev key in trailer dictionary is not an integer");
|
throw damagedPDF("trailer", "/Prev key in trailer dictionary is not an integer");
|
||||||
}
|
}
|
||||||
QTC::TC("qpdf", "QPDF prev key in trailer dictionary");
|
QTC::TC("qpdf", "QPDF prev key in trailer dictionary");
|
||||||
xref_offset = cur_trailer.getKey("/Prev").getIntValue();
|
return cur_trailer.getKey("/Prev").getIntValue();
|
||||||
} else {
|
|
||||||
xref_offset = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return xref_offset;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read a single cross-reference stream.
|
// Read a single cross-reference stream.
|
||||||
|
Loading…
Reference in New Issue
Block a user