From 9a23c3dcb675a62e6a8b144304bdc91cae365c4c Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 30 Dec 2012 13:54:12 -0500 Subject: 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. --- libqpdf/QPDFWriter.cc | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) (limited to 'libqpdf/QPDFWriter.cc') 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("<<"); -- cgit v1.2.3-54-g00ecf