From b1d845e708f99f5a77a27b2c0ca088f2f69ea4dd Mon Sep 17 00:00:00 2001 From: m-holger Date: Thu, 5 Sep 2024 14:50:38 +0100 Subject: [PATCH] Split QPDF member file into file and file_sp to facilitate aliasing --- libqpdf/QPDF.cc | 19 ++++++++++++------- libqpdf/qpdf/QPDF_private.hh | 4 +++- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 53f8e71..1d2ffd8 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -198,7 +198,8 @@ QPDF::EncryptionParameters::EncryptionParameters() : QPDF::Members::Members(QPDF& qpdf) : log(QPDFLogger::defaultLogger()), - file(new InvalidInputSource()), + file_sp(new InvalidInputSource()), + file(file_sp.get()), encp(new EncryptionParameters), xref_table(qpdf) { @@ -272,14 +273,16 @@ QPDF::processMemoryFile( void QPDF::processInputSource(std::shared_ptr source, char const* password) { - m->file = source; + m->file_sp = source; + m->file = source.get(); parse(password); } void QPDF::closeInputSource() { - m->file = std::shared_ptr(new InvalidInputSource()); + m->file_sp = std::shared_ptr(new InvalidInputSource()); + m->file = m->file_sp.get(); } void @@ -412,7 +415,9 @@ QPDF::findHeader() // PDF header, all explicit offsets in the file are such that 0 points to the beginning // of the header. QTC::TC("qpdf", "QPDF global offset"); - m->file = std::shared_ptr(new OffsetInputSource(m->file, global_offset)); + m->file_sp = + std::shared_ptr(new OffsetInputSource(m->file_sp, global_offset)); + m->file = m->file_sp.get(); } } return valid; @@ -1541,7 +1546,7 @@ QPDF::readStream(QPDFObjectHandle& object, QPDFObjGen og, qpdf_offset_t offset) } catch (QPDFExc& e) { if (m->attempt_recovery) { warn(e); - length = recoverStreamLength(m->file, og, stream_offset); + length = recoverStreamLength(m->file_sp, og, stream_offset); } else { throw; } @@ -2452,7 +2457,7 @@ QPDF::copyStreamData(QPDFObjectHandle result, QPDFObjectHandle foreign) } else { auto foreign_stream_data = std::make_shared( foreign_stream_qpdf.m->encp, - foreign_stream_qpdf.m->file, + foreign_stream_qpdf.m->file_sp, foreign.getObjGen(), stream->getParsedOffset(), stream->getLength(), @@ -2776,7 +2781,7 @@ QPDF::pipeStreamData( { return pipeStreamData( m->encp, - m->file, + m->file_sp, *this, og, offset, diff --git a/libqpdf/qpdf/QPDF_private.hh b/libqpdf/qpdf/QPDF_private.hh index 06c53e7..658894a 100644 --- a/libqpdf/qpdf/QPDF_private.hh +++ b/libqpdf/qpdf/QPDF_private.hh @@ -528,7 +528,9 @@ class QPDF::Members std::shared_ptr log; unsigned long long unique_id{0}; QPDFTokenizer tokenizer; - std::shared_ptr file; + // If file_sp is updated, file must also be updated. + std::shared_ptr file_sp; + InputSource* file; std::string last_object_description; bool provided_password_is_hex_key{false}; bool suppress_warnings{false}; -- libgit2 0.21.4