From d9dd99eca32e44788165ce169f1e59498ad1c16e Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 18 Aug 2019 18:54:08 -0400 Subject: Attempt to repair /Type key in pages nodes (fixes #349) --- libqpdf/QPDF_pages.cc | 43 ++++++++++++++++++------------------------- 1 file changed, 18 insertions(+), 25 deletions(-) (limited to 'libqpdf') diff --git a/libqpdf/QPDF_pages.cc b/libqpdf/QPDF_pages.cc index d95002a6..6435d91e 100644 --- a/libqpdf/QPDF_pages.cc +++ b/libqpdf/QPDF_pages.cc @@ -56,12 +56,12 @@ QPDF::getAllPages() } void -QPDF::getAllPagesInternal(QPDFObjectHandle cur_pages, +QPDF::getAllPagesInternal(QPDFObjectHandle cur_node, std::vector& result, std::set& visited, std::set& seen) { - QPDFObjGen this_og = cur_pages.getObjGen(); + QPDFObjGen this_og = cur_node.getObjGen(); if (visited.count(this_og) > 0) { throw QPDFExc( @@ -70,23 +70,11 @@ QPDF::getAllPagesInternal(QPDFObjectHandle cur_pages, "Loop detected in /Pages structure (getAllPages)"); } visited.insert(this_og); - std::string type; - QPDFObjectHandle type_key = cur_pages.getKey("/Type"); - if (type_key.isName()) + std::string wanted_type; + if (cur_node.hasKey("/Kids")) { - type = type_key.getName(); - } - else if (cur_pages.hasKey("/Kids")) - { - type = "/Pages"; - } - else - { - type = "/Page"; - } - if (type == "/Pages") - { - QPDFObjectHandle kids = cur_pages.getKey("/Kids"); + wanted_type = "/Pages"; + QPDFObjectHandle kids = cur_node.getKey("/Kids"); int n = kids.getArrayNItems(); for (int i = 0; i < n; ++i) { @@ -108,17 +96,22 @@ QPDF::getAllPagesInternal(QPDFObjectHandle cur_pages, getAllPagesInternal(kid, result, visited, seen); } } - else if (type == "/Page") + else { + wanted_type = "/Page"; seen.insert(this_og); - result.push_back(cur_pages); + result.push_back(cur_node); } - else + + QPDFObjectHandle type_key = cur_node.getKey("/Type"); + if (! (type_key.isName() && (type_key.getName() == wanted_type))) { - throw QPDFExc(qpdf_e_damaged_pdf, this->m->file->getName(), - this->m->last_object_description, - this->m->file->getLastOffset(), - "invalid Type " + type + " in page tree"); + warn(QPDFExc(qpdf_e_damaged_pdf, this->m->file->getName(), + "page tree node", + this->m->file->getLastOffset(), + "/Type key should be " + wanted_type + + " but is not; overriding")); + cur_node.replaceKey("/Type", QPDFObjectHandle::newName(wanted_type)); } visited.erase(this_og); } -- cgit v1.2.3-70-g09d2