From cdc46d78f441526d566c9da195e79b900617bb13 Mon Sep 17 00:00:00 2001 From: Masamichi Hosoda Date: Wed, 2 Oct 2019 20:30:53 +0900 Subject: Add QPDFObject::getParsedOffset() --- libqpdf/QPDFObject.cc | 15 ++++++++++++- libqpdf/QPDFObjectHandle.cc | 51 ++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 62 insertions(+), 4 deletions(-) (limited to 'libqpdf') diff --git a/libqpdf/QPDFObject.cc b/libqpdf/QPDFObject.cc index ab8f1f62..679e62d3 100644 --- a/libqpdf/QPDFObject.cc +++ b/libqpdf/QPDFObject.cc @@ -1,7 +1,8 @@ #include QPDFObject::Members::Members() : - owning_qpdf(0) + owning_qpdf(0), + parsed_offset(-1) { } @@ -34,3 +35,15 @@ QPDFObject::hasDescription() { return this->m->owning_qpdf != 0; } + +void +QPDFObject::setParsedOffset(qpdf_offset_t offset) +{ + this->m->parsed_offset = offset; +} + +qpdf_offset_t +QPDFObject::getParsedOffset() +{ + return this->m->parsed_offset; +} diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index e36a7a2a..d49976b6 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -1767,6 +1767,7 @@ QPDFObjectHandle::parseInternal(PointerHolder input, empty = false; QPDFObjectHandle object; + bool set_offset = false; std::vector olist_stack; olist_stack.push_back(SparseOHArray()); @@ -1786,6 +1787,7 @@ QPDFObjectHandle::parseInternal(PointerHolder input, offset = offset_stack.back(); object = QPDFObjectHandle(); + set_offset = false; QPDFTokenizer::Token token = tokenizer.readToken(input, object_description, true); @@ -2054,6 +2056,8 @@ QPDFObjectHandle::parseInternal(PointerHolder input, setObjectDescriptionFromInput( object, context, object_description, input, input->getLastOffset()); + object.setParsedOffset(input->getLastOffset()); + set_offset = true; olist.append(object); break; @@ -2080,6 +2084,14 @@ QPDFObjectHandle::parseInternal(PointerHolder input, object = QPDFObjectHandle(new QPDF_Array(olist)); setObjectDescriptionFromInput( object, context, object_description, input, offset); + // The `offset` points to the next of "[". Set the + // rewind offset to point to the beginning of "[". + // This has been explicitly tested with whitespace + // surrounding the array start delimiter. + // getLastOffset points to the array end token and + // therefore can't be used here. + object.setParsedOffset(offset - 1); + set_offset = true; } else if (old_state == st_dictionary) { @@ -2159,6 +2171,14 @@ QPDFObjectHandle::parseInternal(PointerHolder input, object = newDictionary(dict); setObjectDescriptionFromInput( object, context, object_description, input, offset); + // The `offset` points to the next of "<<". Set the + // rewind offset to point to the beginning of "<<". + // This has been explicitly tested with whitespace + // surrounding the dictionary start delimiter. + // getLastOffset points to the dictionary end token + // and therefore can't be used here. + object.setParsedOffset(offset - 2); + set_offset = true; } olist_stack.pop_back(); offset_stack.pop_back(); @@ -2173,11 +2193,31 @@ QPDFObjectHandle::parseInternal(PointerHolder input, } } - setObjectDescriptionFromInput( - object, context, object_description, input, offset); + if (! set_offset) + { + setObjectDescriptionFromInput( + object, context, object_description, input, offset); + object.setParsedOffset(offset); + } return object; } +qpdf_offset_t +QPDFObjectHandle::getParsedOffset() +{ + dereference(); + return this->m->obj->getParsedOffset(); +} + +void +QPDFObjectHandle::setParsedOffset(qpdf_offset_t offset) +{ + if (this->m->obj.getPointer()) + { + this->m->obj->setParsedOffset(offset); + } +} + QPDFObjectHandle QPDFObjectHandle::newIndirect(QPDF* qpdf, int objid, int generation) { @@ -2321,9 +2361,14 @@ QPDFObjectHandle::newStream(QPDF* qpdf, int objid, int generation, QPDFObjectHandle stream_dict, qpdf_offset_t offset, size_t length) { - return QPDFObjectHandle(new QPDF_Stream( + QPDFObjectHandle result = QPDFObjectHandle(new QPDF_Stream( qpdf, objid, generation, stream_dict, offset, length)); + if (offset) + { + result.setParsedOffset(offset); + } + return result; } QPDFObjectHandle -- cgit v1.2.3-54-g00ecf