summaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2012-12-30 19:54:12 +0100
committerJay Berkenbilt <ejb@ql.org>2012-12-31 16:32:32 +0100
commit9a23c3dcb675a62e6a8b144304bdc91cae365c4c (patch)
treeec387d1265ed6aa660133a887f1b59055dcdde5e /libqpdf
parent4237a29c9492653e1be869d603e1b5bf87833682 (diff)
downloadqpdf-9a23c3dcb675a62e6a8b144304bdc91cae365c4c.tar.zst
Remove /Crypt from stream filters unconditionally
When writing a new stream, always remove /Crypt even if we are not otherwise able to filter the stream.
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDFWriter.cc43
1 files changed, 42 insertions, 1 deletions
diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc
index d7ab0c8b..ba37d423 100644
--- a/libqpdf/QPDFWriter.cc
+++ b/libqpdf/QPDFWriter.cc
@@ -1297,12 +1297,53 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level,
// Suppress /Length since we will write it manually
object.removeKey("/Length");
- // XXX BUG: /Crypt filters should always be removed.
if (flags & f_filtered)
{
+ // We will supply our own filter and decode
+ // parameters.
object.removeKey("/Filter");
object.removeKey("/DecodeParms");
}
+ else
+ {
+ // Make sure, no matter what else we have, that we
+ // don't have /Crypt in the output filters.
+ QPDFObjectHandle filter = object.getKey("/Filter");
+ QPDFObjectHandle decode_parms = object.getKey("/DecodeParms");
+ if (filter.isOrHasName("/Crypt"))
+ {
+ if (filter.isName())
+ {
+ object.removeKey("/Filter");
+ object.removeKey("/DecodeParms");
+ }
+ else
+ {
+ int idx = -1;
+ for (int i = 0; i < filter.getArrayNItems(); ++i)
+ {
+ QPDFObjectHandle item = filter.getArrayItem(i);
+ if (item.isName() && item.getName() == "/Crypt")
+ {
+ idx = i;
+ break;
+ }
+ }
+ if (idx >= 0)
+ {
+ // If filter is an array, then the code in
+ // QPDF_Stream has already verified that
+ // DecodeParms and Filters are arrays of
+ // the same length, but if they weren't
+ // for some reason, eraseItem does type
+ // and bounds checking.
+ QTC::TC("qpdf", "QPDFWriter remove Crypt");
+ filter.eraseItem(idx);
+ decode_parms.eraseItem(idx);
+ }
+ }
+ }
+ }
}
writeString("<<");