aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2017-08-26 01:58:31 +0200
committerJay Berkenbilt <ejb@ql.org>2017-08-26 01:58:31 +0200
commit85f05cc57ffa0a863d9d9b23e73acea9410b2937 (patch)
tree20fd436119a92c2d611c698c17cc0f568b7a496d /libqpdf
parent2d0c68735b52d33e071f2895309c4dc6944b464d (diff)
downloadqpdf-85f05cc57ffa0a863d9d9b23e73acea9410b2937.tar.zst
Detect xref pointer infinite loop (fixes #149)
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDF.cc6
1 files changed, 6 insertions, 0 deletions
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc
index 27efdd55..86e798ee 100644
--- a/libqpdf/QPDF.cc
+++ b/libqpdf/QPDF.cc
@@ -491,8 +491,10 @@ void
QPDF::read_xref(qpdf_offset_t xref_offset)
{
std::map<int, int> free_table;
+ std::set<qpdf_offset_t> visited;
while (xref_offset)
{
+ visited.insert(xref_offset);
char buf[7];
memset(buf, 0, sizeof(buf));
this->m->file->seek(xref_offset, SEEK_SET);
@@ -520,6 +522,10 @@ QPDF::read_xref(qpdf_offset_t xref_offset)
{
xref_offset = read_xrefStream(xref_offset);
}
+ if (visited.count(xref_offset) != 0)
+ {
+ xref_offset = 0;
+ }
}
if (! this->m->trailer.isInitialized())