aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2019-06-09 23:19:07 +0200
committerJay Berkenbilt <ejb@ql.org>2019-06-09 23:19:49 +0200
commit31bde2f9d7517d3cf2433c2ea787eb9542532496 (patch)
treee471fe49dc981b87a7f25462a324c74c3a086697
parent74cc3440df7606c1e48bdbcb0ac5051fe0df0149 (diff)
downloadqpdf-31bde2f9d7517d3cf2433c2ea787eb9542532496.tar.zst
Handle empty DecodeParams array for (fixes #331)
On read, ignore /DecodeParms when empty list; on write, delete it. Some files have been found that include an empty list for /DecodeParms, but this is not technically compliant with the spec, and the only sensible interpretation is to treat it as if there are no decode parameters.
-rw-r--r--ChangeLog5
-rw-r--r--libqpdf/QPDFWriter.cc8
-rw-r--r--libqpdf/QPDF_Stream.cc4
-rw-r--r--qpdf/qpdf.testcov1
-rw-r--r--qpdf/qtest/qpdf.test9
5 files changed, 26 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 96e7f82f..deece77c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2019-06-09 Jay Berkenbilt <ejb@ql.org>
+
+ * When /DecodeParms is an empty list, ignore it on read and delete
+ it on write. Fixes #331.
+
2019-05-18 Jay Berkenbilt <ejb@ql.org>
* 8.4.2: release
diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc
index fee287bc..0cc0547d 100644
--- a/libqpdf/QPDFWriter.cc
+++ b/libqpdf/QPDFWriter.cc
@@ -1604,6 +1604,14 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level,
// Suppress /Length since we will write it manually
object.removeKey("/Length");
+ // If /DecodeParms is an empty list, remove it.
+ if (object.getKey("/DecodeParms").isArray() &&
+ (0 == object.getKey("/DecodeParms").getArrayNItems()))
+ {
+ QTC::TC("qpdf", "QPDFWriter remove empty DecodeParms");
+ object.removeKey("/DecodeParms");
+ }
+
if (flags & f_filtered)
{
// We will supply our own filter and decode
diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc
index 3733940d..3ddb1498 100644
--- a/libqpdf/QPDF_Stream.cc
+++ b/libqpdf/QPDF_Stream.cc
@@ -391,6 +391,10 @@ QPDF_Stream::filterable(std::vector<std::string>& filters,
QPDFObjectHandle decode_obj = this->stream_dict.getKey("/DecodeParms");
std::vector<QPDFObjectHandle> decode_parms;
+ if (decode_obj.isArray() && (decode_obj.getArrayNItems() == 0))
+ {
+ decode_obj = QPDFObjectHandle::newNull();
+ }
if (decode_obj.isArray())
{
for (int i = 0; i < decode_obj.getArrayNItems(); ++i)
diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov
index b62dc663..f6a1cedf 100644
--- a/qpdf/qpdf.testcov
+++ b/qpdf/qpdf.testcov
@@ -439,3 +439,4 @@ QPDFPageObjectHelper externalize inline image 0
QPDFPageObjectHelper keep inline image 0
qpdf image optimize colorspace 0
qpdf image optimize bits per component 0
+QPDFWriter remove empty DecodeParms 0
diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test
index e95c22bc..fa2b5113 100644
--- a/qpdf/qtest/qpdf.test
+++ b/qpdf/qtest/qpdf.test
@@ -847,7 +847,7 @@ $td->runtest("get stream data",
show_ntests();
# ----------
$td->notify("--- Decode parameter problems ---");
-$n_tests += 4;
+$n_tests += 6;
# Make sure we ignore decode parameters that we don't understand
$td->runtest("unknown decode parameters",
@@ -870,6 +870,13 @@ $td->runtest("check file",
{$td->FILE => "a.pdf"},
{$td->FILE => "indirect-decode-parms-out.pdf"});
+$td->runtest("decode parameters empty list",
+ {$td->COMMAND => "qpdf --static-id empty-decode-parms.pdf a.pdf"},
+ {$td->STRING => "", $td->EXIT_STATUS => 0});
+$td->runtest("check file",
+ {$td->FILE => "a.pdf"},
+ {$td->FILE => "empty-decode-parms-out.pdf"});
+
show_ntests();
# ----------
$td->notify("--- Cross reference streams ---");