From ab67e1c272751ffe505ee7c4e403ae1c19b413dc Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Sun, 15 Jun 2014 12:44:39 +0200 Subject: [PATCH 1/3] Let Parser_makeFilter return NullStream when an invalid stream is encountered (issue 3417) --- src/core/parser.js | 101 ++++++++++++++++++++++++--------------------- 1 file changed, 53 insertions(+), 48 deletions(-) diff --git a/src/core/parser.js b/src/core/parser.js index 22d8c27677c4f..8b4d2ee29b612 100644 --- a/src/core/parser.js +++ b/src/core/parser.js @@ -344,58 +344,63 @@ var Parser = (function ParserClosure() { if (stream.dict.get('Length') === 0) { return new NullStream(stream); } - var xrefStreamStats = this.xref.stats.streamTypes; - if (name == 'FlateDecode' || name == 'Fl') { - xrefStreamStats[StreamType.FLATE] = true; - if (params) { - return new PredictorStream(new FlateStream(stream, maybeLength), - maybeLength, params); + try { + var xrefStreamStats = this.xref.stats.streamTypes; + if (name == 'FlateDecode' || name == 'Fl') { + xrefStreamStats[StreamType.FLATE] = true; + if (params) { + return new PredictorStream(new FlateStream(stream, maybeLength), + maybeLength, params); + } + return new FlateStream(stream, maybeLength); } - return new FlateStream(stream, maybeLength); - } - if (name == 'LZWDecode' || name == 'LZW') { - xrefStreamStats[StreamType.LZW] = true; - var earlyChange = 1; - if (params) { - if (params.has('EarlyChange')) { - earlyChange = params.get('EarlyChange'); + if (name == 'LZWDecode' || name == 'LZW') { + xrefStreamStats[StreamType.LZW] = true; + var earlyChange = 1; + if (params) { + if (params.has('EarlyChange')) { + earlyChange = params.get('EarlyChange'); + } + return new PredictorStream( + new LZWStream(stream, maybeLength, earlyChange), + maybeLength, params); } - return new PredictorStream( - new LZWStream(stream, maybeLength, earlyChange), - maybeLength, params); + return new LZWStream(stream, maybeLength, earlyChange); } - return new LZWStream(stream, maybeLength, earlyChange); - } - if (name == 'DCTDecode' || name == 'DCT') { - xrefStreamStats[StreamType.DCT] = true; - return new JpegStream(stream, maybeLength, stream.dict, this.xref); - } - if (name == 'JPXDecode' || name == 'JPX') { - xrefStreamStats[StreamType.JPX] = true; - return new JpxStream(stream, maybeLength, stream.dict); - } - if (name == 'ASCII85Decode' || name == 'A85') { - xrefStreamStats[StreamType.A85] = true; - return new Ascii85Stream(stream, maybeLength); - } - if (name == 'ASCIIHexDecode' || name == 'AHx') { - xrefStreamStats[StreamType.AHX] = true; - return new AsciiHexStream(stream, maybeLength); - } - if (name == 'CCITTFaxDecode' || name == 'CCF') { - xrefStreamStats[StreamType.CCF] = true; - return new CCITTFaxStream(stream, maybeLength, params); - } - if (name == 'RunLengthDecode' || name == 'RL') { - xrefStreamStats[StreamType.RL] = true; - return new RunLengthStream(stream, maybeLength); - } - if (name == 'JBIG2Decode') { - xrefStreamStats[StreamType.JBIG] = true; - return new Jbig2Stream(stream, maybeLength, stream.dict); + if (name == 'DCTDecode' || name == 'DCT') { + xrefStreamStats[StreamType.DCT] = true; + return new JpegStream(stream, maybeLength, stream.dict, this.xref); + } + if (name == 'JPXDecode' || name == 'JPX') { + xrefStreamStats[StreamType.JPX] = true; + return new JpxStream(stream, maybeLength, stream.dict); + } + if (name == 'ASCII85Decode' || name == 'A85') { + xrefStreamStats[StreamType.A85] = true; + return new Ascii85Stream(stream, maybeLength); + } + if (name == 'ASCIIHexDecode' || name == 'AHx') { + xrefStreamStats[StreamType.AHX] = true; + return new AsciiHexStream(stream, maybeLength); + } + if (name == 'CCITTFaxDecode' || name == 'CCF') { + xrefStreamStats[StreamType.CCF] = true; + return new CCITTFaxStream(stream, maybeLength, params); + } + if (name == 'RunLengthDecode' || name == 'RL') { + xrefStreamStats[StreamType.RL] = true; + return new RunLengthStream(stream, maybeLength); + } + if (name == 'JBIG2Decode') { + xrefStreamStats[StreamType.JBIG] = true; + return new Jbig2Stream(stream, maybeLength, stream.dict); + } + warn('filter "' + name + '" not supported yet'); + return stream; + } catch (ex) { + warn('Invalid stream: \"' + ex + '\"'); + return new NullStream(stream); } - warn('filter "' + name + '" not supported yet'); - return stream; } }; From fbdab2c7c5a5164676bc656442ad1996a7624472 Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Wed, 18 Jun 2014 18:21:21 -0500 Subject: [PATCH 2/3] Not ignoring MissingDataException exception. --- src/core/parser.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core/parser.js b/src/core/parser.js index 8b4d2ee29b612..4ff40fba31859 100644 --- a/src/core/parser.js +++ b/src/core/parser.js @@ -18,7 +18,7 @@ FlateStream, isArray, isCmd, isDict, isInt, isName, isNum, isRef, isString, Jbig2Stream, JpegStream, JpxStream, LZWStream, Name, NullStream, PredictorStream, Ref, RunLengthStream, warn, info, - StreamType */ + StreamType, MissingDataException */ 'use strict'; @@ -398,6 +398,9 @@ var Parser = (function ParserClosure() { warn('filter "' + name + '" not supported yet'); return stream; } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } warn('Invalid stream: \"' + ex + '\"'); return new NullStream(stream); } From 623fa293004334afb72621db907e66ee3f755673 Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Wed, 18 Jun 2014 18:30:27 -0500 Subject: [PATCH 3/3] Removes error catch from fetchUncompressed() --- src/core/obj.js | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/core/obj.js b/src/core/obj.js index af13e5a26f36d..3517de324abdd 100644 --- a/src/core/obj.js +++ b/src/core/obj.js @@ -1216,15 +1216,7 @@ var XRef = (function XRefClosure() { error('bad XRef entry'); } if (this.encrypt && !suppressEncryption) { - try { - xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, - gen)); - } catch (ex) { - // Almost all streams must be encrypted, but sometimes - // they are not, probably due to some broken generators. - // Retrying without encryption... - return this.fetch(ref, true); - } + xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen)); } else { xrefEntry = parser.getObj(); }