From 02e89bbe47853a59f40de27e997dbdb67712586b Mon Sep 17 00:00:00 2001 From: m-holger <m-holger@kubitscheck.org> Date: Sat, 4 May 2024 10:08:03 +0100 Subject: [PATCH 1/4] Fix bug in QPDFWriter::preserveObjectStreams Code failed to allow for QPDF::getCompressibleObjSet deleting objects from the object cache in case of multiple entries for the same object id. Add fuzz test case 68668. --- fuzz/CMakeLists.txt | 1 + fuzz/qpdf_extra/68668.fuzz | Bin 0 -> 33453 bytes fuzz/qtest/fuzz.test | 2 +- libqpdf/QPDFWriter.cc | 46 ++++++++++++++++++------------------- qpdf/qpdf.testcov | 3 ++- 5 files changed, 27 insertions(+), 25 deletions(-) create mode 100644 fuzz/qpdf_extra/68668.fuzz diff --git a/fuzz/CMakeLists.txt b/fuzz/CMakeLists.txt index 233a4571..ec33caa4 100644 --- a/fuzz/CMakeLists.txt +++ b/fuzz/CMakeLists.txt @@ -116,6 +116,7 @@ set(CORPUS_OTHER 65777.fuzz 68374.fuzz 68377.fuzz + 68668.fuzz ) set(CORPUS_DIR ${CMAKE_CURRENT_BINARY_DIR}/qpdf_corpus) diff --git a/fuzz/qpdf_extra/68668.fuzz b/fuzz/qpdf_extra/68668.fuzz new file mode 100644 index 0000000000000000000000000000000000000000..ee9ecb7fb2e65f31be3f4a4face8ef181ceafc78 GIT binary patch literal 33453 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 T#Gt>iOOXVKrl#dwE6D!?MRpGj literal 0 HcmV?d00001 diff --git a/fuzz/qtest/fuzz.test b/fuzz/qtest/fuzz.test index 38590d4c..13285f1a 100644 --- a/fuzz/qtest/fuzz.test +++ b/fuzz/qtest/fuzz.test @@ -21,7 +21,7 @@ my @fuzzers = ( ['pngpredictor' => 1], ['runlength' => 6], ['tiffpredictor' => 2], - ['qpdf' => 58], # increment when adding new files + ['qpdf' => 59], # increment when adding new files ); my $n_tests = 0; diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index f66e1615..c2d988bd 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -1944,28 +1944,30 @@ QPDFWriter::preserveObjectStreams() // that are not allowed to be in object streams. In addition to removing objects that were // erroneously included in object streams in the source PDF, it also prevents unreferenced // objects from being included. - auto iter = xref.cbegin(); auto end = xref.cend(); - - // Start by scanning for first compressed object in case we don't have any object streams to - // process. - for (; iter != end; ++iter) { - if (iter->second.getType() == 2) { - // Pdf contains object streams. - QTC::TC( - "qpdf", - "QPDFWriter preserve object streams", - m->preserve_unreferenced_objects ? 0 : 1); - - if (m->preserve_unreferenced_objects) { - for (; iter != end; ++iter) { - if (iter->second.getType() == 2) { - m->obj[iter->first].object_stream = iter->second.getObjStreamNumber(); - } - } - } else { + m->obj.streams_empty = true; + if (m->preserve_unreferenced_objects) { + for (auto iter = xref.cbegin(); iter != end; ++iter) { + if (iter->second.getType() == 2) { + // Pdf contains object streams. + QTC::TC("qpdf", "QPDFWriter preserve object streams preserve unreferenced"); + m->obj.streams_empty = false; + m->obj[iter->first].object_stream = iter->second.getObjStreamNumber(); + } + } + } else { + // Start by scanning for first compressed object in case we don't have any object streams to + // process. + for (auto iter = xref.cbegin(); iter != end; ++iter) { + if (iter->second.getType() == 2) { + // Pdf contains object streams. + QTC::TC("qpdf", "QPDFWriter preserve object streams"); + m->obj.streams_empty = false; auto eligible = QPDF::Writer::getCompressibleObjSet(m->pdf); - for (; iter != end; ++iter) { + // The object pointed to by iter may be a previous generation, in which case it is + // removed by getCompressibleObjSet. We need to restart the loop (while the object + // table may contain multiple generations of an object). + for (iter = xref.cbegin(); iter != end; ++iter) { if (iter->second.getType() == 2) { auto id = static_cast<size_t>(iter->first.getObj()); if (id < eligible.size() && eligible[id]) { @@ -1975,12 +1977,10 @@ QPDFWriter::preserveObjectStreams() } } } + return; } - return; } } - // No compressed objects found. - m->obj.streams_empty = true; } void diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index 7501a4b5..fe7eb38a 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -600,7 +600,8 @@ QPDFAcroFormDocumentHelper AP parse error 0 QPDFJob copy fields not this file 0 QPDFJob copy fields non-first from orig 0 QPDF resolve duplicated page in insert 0 -QPDFWriter preserve object streams 1 +QPDFWriter preserve object streams 0 +QPDFWriter preserve object streams preserve unreferenced 0 QPDFWriter exclude from object stream 0 QPDF_pages findPage not found 0 QPDFObjectHandle check ownership 0 From 7f8e0a0d22eff688cb11ea92f6dd8dede536dcc5 Mon Sep 17 00:00:00 2001 From: m-holger <m-holger@kubitscheck.org> Date: Sat, 11 May 2024 21:49:27 +0100 Subject: [PATCH 2/4] Add fuzz testcase 68915.fuzz --- fuzz/CMakeLists.txt | 1 + fuzz/qpdf_extra/68915.fuzz | Bin 0 -> 132856 bytes fuzz/qtest/fuzz.test | 2 +- 3 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 fuzz/qpdf_extra/68915.fuzz diff --git a/fuzz/CMakeLists.txt b/fuzz/CMakeLists.txt index ec33caa4..fed51355 100644 --- a/fuzz/CMakeLists.txt +++ b/fuzz/CMakeLists.txt @@ -117,6 +117,7 @@ set(CORPUS_OTHER 68374.fuzz 68377.fuzz 68668.fuzz + 68915.fuzz ) set(CORPUS_DIR ${CMAKE_CURRENT_BINARY_DIR}/qpdf_corpus) diff --git a/fuzz/qpdf_extra/68915.fuzz b/fuzz/qpdf_extra/68915.fuzz new file mode 100644 index 0000000000000000000000000000000000000000..c0a71474aada05a57db8049800ae808a7a3222ce GIT binary patch literal 132856 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 literal 0 HcmV?d00001 diff --git a/fuzz/qtest/fuzz.test b/fuzz/qtest/fuzz.test index 13285f1a..79dc7edb 100644 --- a/fuzz/qtest/fuzz.test +++ b/fuzz/qtest/fuzz.test @@ -21,7 +21,7 @@ my @fuzzers = ( ['pngpredictor' => 1], ['runlength' => 6], ['tiffpredictor' => 2], - ['qpdf' => 59], # increment when adding new files + ['qpdf' => 60], # increment when adding new files ); my $n_tests = 0; From 602d5eb61dfc51078aaeb086f956b500cd4a46af Mon Sep 17 00:00:00 2001 From: m-holger <m-holger@kubitscheck.org> Date: Thu, 16 May 2024 23:10:28 +0100 Subject: [PATCH 3/4] Refactor QUtil::call_main_from_wmain --- libqpdf/QUtil.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libqpdf/QUtil.cc b/libqpdf/QUtil.cc index c0aca105..2d9ce9be 100644 --- a/libqpdf/QUtil.cc +++ b/libqpdf/QUtil.cc @@ -1899,7 +1899,8 @@ call_main_from_wmain( // strings for compatibility with other systems. That way the rest of qpdf.cc can just act like // arguments are UTF-8. - std::vector<std::unique_ptr<char[]>> utf8_argv; + std::vector<std::string> utf8_argv; + utf8_argv.reserve(QIntC::to_size(argc)); for (int i = 0; i < argc; ++i) { std::string utf16; for (size_t j = 0; j < std::wcslen(argv[i]); ++j) { @@ -1907,13 +1908,12 @@ call_main_from_wmain( utf16.append(1, static_cast<char>(QIntC::to_uchar(codepoint >> 8))); utf16.append(1, static_cast<char>(QIntC::to_uchar(codepoint & 0xff))); } - std::string utf8 = QUtil::utf16_to_utf8(utf16); - utf8_argv.push_back(QUtil::make_unique_cstr(utf8)); + utf8_argv.emplace_back(QUtil::utf16_to_utf8(utf16)); } auto utf8_argv_sp = std::make_unique<char*[]>(1 + utf8_argv.size()); char** new_argv = utf8_argv_sp.get(); for (size_t i = 0; i < utf8_argv.size(); ++i) { - new_argv[i] = utf8_argv.at(i).get(); + new_argv[i] = utf8_argv.at(i).data(); } argc = QIntC::to_int(utf8_argv.size()); new_argv[argc] = nullptr; From 6f09069f433d974a79f991f3a4a23a4dc7ac7b6a Mon Sep 17 00:00:00 2001 From: m-holger <m-holger@kubitscheck.org> Date: Fri, 17 May 2024 10:31:50 +0100 Subject: [PATCH 4/4] Further refactor QUtil::call_main_from_wmain --- libqpdf/QUtil.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libqpdf/QUtil.cc b/libqpdf/QUtil.cc index 2d9ce9be..d69838fa 100644 --- a/libqpdf/QUtil.cc +++ b/libqpdf/QUtil.cc @@ -1910,14 +1910,14 @@ call_main_from_wmain( } utf8_argv.emplace_back(QUtil::utf16_to_utf8(utf16)); } - auto utf8_argv_sp = std::make_unique<char*[]>(1 + utf8_argv.size()); - char** new_argv = utf8_argv_sp.get(); - for (size_t i = 0; i < utf8_argv.size(); ++i) { - new_argv[i] = utf8_argv.at(i).data(); + std::vector<char*> new_argv; + new_argv.reserve(utf8_argv.size() + 1U); + for (auto const& arg: utf8_argv) { + new_argv.emplace_back(const_cast<char*>(arg.data())); } argc = QIntC::to_int(utf8_argv.size()); - new_argv[argc] = nullptr; - return realmain(argc, new_argv); + new_argv.emplace_back(nullptr); + return realmain(argc, new_argv.data()); } int