aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--libqpdf/QPDF_Stream.cc4
-rw-r--r--qpdf/qtest/qpdf.test6
-rw-r--r--qpdf/qtest/qpdf/jpeg-qstream.pdfbin0 -> 1156 bytes
-rw-r--r--qpdf/qtest/qpdf/test68.out4
-rw-r--r--qpdf/test_driver.cc29
6 files changed, 48 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index d9790438..8b85e41c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2020-04-08 Jay Berkenbilt <ejb@ql.org>
+
+ * Bug fix: qpdf 10.0.0 introduced a bug in which
+ QPDFObjectHandle::getStreamData would return the raw data when
+ called on an unfilterable stream instead of throwing an exception
+ like it's supposed to. Fixes #425.
+
2020-04-07 Jay Berkenbilt <ejb@ql.org>
* Improve pdf-invert-images example to show a pattern of copying
diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc
index 48c1ccf9..37ff9417 100644
--- a/libqpdf/QPDF_Stream.cc
+++ b/libqpdf/QPDF_Stream.cc
@@ -163,7 +163,9 @@ PointerHolder<Buffer>
QPDF_Stream::getStreamData(qpdf_stream_decode_level_e decode_level)
{
Pl_Buffer buf("stream data buffer");
- if (! pipeStreamData(&buf, nullptr, 0, decode_level, false, false))
+ bool filtered;
+ pipeStreamData(&buf, &filtered, 0, decode_level, false, false);
+ if (! filtered)
{
throw QPDFExc(qpdf_e_unsupported, qpdf->getFilename(),
"", this->offset,
diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test
index 788ef2dc..d7986c21 100644
--- a/qpdf/qtest/qpdf.test
+++ b/qpdf/qtest/qpdf.test
@@ -954,12 +954,16 @@ foreach (my $i = 1; $i <= 3; ++$i)
show_ntests();
# ----------
$td->notify("--- Stream data ---");
-$n_tests += 1;
+$n_tests += 2;
$td->runtest("get stream data",
{$td->COMMAND => "test_driver 11 stream-data.pdf"},
{$td->FILE => "test11.out", $td->EXIT_STATUS => 0},
$td->NORMALIZE_NEWLINES);
+$td->runtest("get stream data fails on jpeg",
+ {$td->COMMAND => "test_driver 68 jpeg-qstream.pdf"},
+ {$td->FILE => "test68.out", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
show_ntests();
# ----------
diff --git a/qpdf/qtest/qpdf/jpeg-qstream.pdf b/qpdf/qtest/qpdf/jpeg-qstream.pdf
new file mode 100644
index 00000000..8fce760d
--- /dev/null
+++ b/qpdf/qtest/qpdf/jpeg-qstream.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/test68.out b/qpdf/qtest/qpdf/test68.out
new file mode 100644
index 00000000..71647755
--- /dev/null
+++ b/qpdf/qtest/qpdf/test68.out
@@ -0,0 +1,4 @@
+get unfilterable stream: jpeg-qstream.pdf (offset 284): getStreamData called on unfilterable stream
+filtered stream data okay
+raw stream data okay
+test 68 done
diff --git a/qpdf/test_driver.cc b/qpdf/test_driver.cc
index eba0903b..74aa7c26 100644
--- a/qpdf/test_driver.cc
+++ b/qpdf/test_driver.cc
@@ -2168,6 +2168,35 @@ void runtest(int n, char const* filename1, char const* arg2)
w.setStaticID(true);
w.write();
}
+ else if (n == 68)
+ {
+ QPDFObjectHandle root = pdf.getRoot();
+ QPDFObjectHandle qstream = root.getKey("/QStream");
+ try
+ {
+ qstream.getStreamData();
+ std::cout << "oops -- didn't throw" << std::endl;
+ }
+ catch (std::exception& e)
+ {
+ std::cout << "get unfilterable stream: " << e.what()
+ << std::endl;
+ }
+ PointerHolder<Buffer> b1 = qstream.getStreamData(qpdf_dl_all);
+ if ((b1->getSize() > 10) &&
+ (memcmp(b1->getBuffer(),
+ "wwwwwwwww", 9) == 0))
+ {
+ std::cout << "filtered stream data okay" << std::endl;
+ }
+ PointerHolder<Buffer> b2 = qstream.getRawStreamData();
+ if ((b2->getSize() > 10) &&
+ (memcmp(b2->getBuffer(),
+ "\xff\xd8\xff\xe0\x00\x10\x4a\x46\x49\x46", 10) == 0))
+ {
+ std::cout << "raw stream data okay" << std::endl;
+ }
+ }
else
{
throw std::runtime_error(std::string("invalid test ") +