aboutsummaryrefslogtreecommitdiffstats
path: root/qpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2013-02-23 23:41:27 +0100
committerJay Berkenbilt <ejb@ql.org>2013-02-23 23:51:17 +0100
commit6c7bf114dc0402dfbfaef4586f05dfd398e57e16 (patch)
treeb7cc8bf0e477e3e4fe28f3a20f2f656788e667d8 /qpdf
parent7e7c93951f7d0af4cd249f9bbbcf3d79ac500a7c (diff)
downloadqpdf-6c7bf114dc0402dfbfaef4586f05dfd398e57e16.tar.zst
Bug fix: properly handle overridden compressed objects
When caching objects in an object stream, only cache objects that still resolve to that stream. See Changelog mod from this commit for details.
Diffstat (limited to 'qpdf')
-rw-r--r--qpdf/qpdf.testcov1
-rw-r--r--qpdf/qtest/qpdf.test14
-rw-r--r--qpdf/qtest/qpdf/override-compressed-object.out5
-rw-r--r--qpdf/qtest/qpdf/override-compressed-object.pdfbin0 -> 1817 bytes
-rw-r--r--qpdf/test_driver.cc9
5 files changed, 28 insertions, 1 deletions
diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov
index b09e966c..31e15495 100644
--- a/qpdf/qpdf.testcov
+++ b/qpdf/qpdf.testcov
@@ -261,3 +261,4 @@ qpdf-c called qpdf_set_r5_encryption_parameters 0
qpdf-c called qpdf_set_r6_encryption_parameters 0
QPDFObjectHandle EOF in inline image 0
QPDFObjectHandle inline image token 0
+QPDF not caching overridden objstm object 0
diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test
index f447bd83..8375e5f2 100644
--- a/qpdf/qtest/qpdf.test
+++ b/qpdf/qtest/qpdf.test
@@ -199,7 +199,7 @@ $td->runtest("remove page we don't have",
show_ntests();
# ----------
$td->notify("--- Miscellaneous Tests ---");
-$n_tests += 60;
+$n_tests += 61;
$td->runtest("qpdf version",
{$td->COMMAND => "qpdf --version"},
@@ -484,6 +484,18 @@ $td->runtest("content stream errors",
$td->EXIT_STATUS => 2},
$td->NORMALIZE_NEWLINES);
+# The file override-compressed-object.pdf contains an object stream
+# with four strings in it. The file is then appended. The appended
+# section overrides one of the four strings with a string in another
+# object stream and another one in an uncompressed object. The other
+# two strings are left alone. The test case exercises that all four
+# objects have the correct value.
+$td->runtest("overridden compressed objects",
+ {$td->COMMAND => "test_driver 38 override-compressed-object.pdf"},
+ {$td->FILE => "override-compressed-object.out",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+
show_ntests();
# ----------
$td->notify("--- Numeric range parsing tests ---");
diff --git a/qpdf/qtest/qpdf/override-compressed-object.out b/qpdf/qtest/qpdf/override-compressed-object.out
new file mode 100644
index 00000000..a3fbd51d
--- /dev/null
+++ b/qpdf/qtest/qpdf/override-compressed-object.out
@@ -0,0 +1,5 @@
+(orig-1)
+(override-2)
+(override-3)
+(orig-4)
+test 38 done
diff --git a/qpdf/qtest/qpdf/override-compressed-object.pdf b/qpdf/qtest/qpdf/override-compressed-object.pdf
new file mode 100644
index 00000000..0647b7fe
--- /dev/null
+++ b/qpdf/qtest/qpdf/override-compressed-object.pdf
Binary files differ
diff --git a/qpdf/test_driver.cc b/qpdf/test_driver.cc
index 799ea4ba..d6534abf 100644
--- a/qpdf/test_driver.cc
+++ b/qpdf/test_driver.cc
@@ -1302,6 +1302,15 @@ void runtest(int n, char const* filename1, char const* arg2)
QPDFObjectHandle::parseContentStream(contents, &cb);
}
}
+ else if (n == 38)
+ {
+ // Designed for override-compressed-object.pdf
+ QPDFObjectHandle qtest = pdf.getRoot().getKey("/QTest");
+ for (int i = 0; i < qtest.getArrayNItems(); ++i)
+ {
+ std::cout << qtest.getArrayItem(i).unparseResolved() << std::endl;
+ }
+ }
else
{
throw std::runtime_error(std::string("invalid test ") +