From 5bca74f125821fdb6fd20e95868d18d510fde505 Mon Sep 17 00:00:00 2001 From: Pdf Bot Date: Sat, 15 Oct 2016 16:56:57 +0100 Subject: [PATCH] PDF.js version 1.6.242 - See mozilla/pdf.js@ea5949f1fd8aca03e2f9571ccf7a6cd2bf49836e --- bower.json | 2 +- build/pdf.combined.js | 54 ++++++++++++++++++++++++++++--------------- build/pdf.js | 4 ++-- build/pdf.worker.js | 54 ++++++++++++++++++++++++++++--------------- package.json | 2 +- 5 files changed, 76 insertions(+), 40 deletions(-) diff --git a/bower.json b/bower.json index 92cbf5aa3..941d279a6 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "pdfjs-dist", - "version": "1.6.239", + "version": "1.6.242", "main": [ "build/pdf.js", "build/pdf.worker.js" diff --git a/build/pdf.combined.js b/build/pdf.combined.js index cfc9af7c4..9f6308b45 100644 --- a/build/pdf.combined.js +++ b/build/pdf.combined.js @@ -24,8 +24,8 @@ }(this, function (exports) { // Use strict in our context only - users might not want it 'use strict'; - var pdfjsVersion = '1.6.239'; - var pdfjsBuild = 'f209030'; + var pdfjsVersion = '1.6.242'; + var pdfjsBuild = 'ea5949f'; var pdfjsFilePath = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : null; var pdfjsLibs = {}; (function pdfjsWrapper() { @@ -21098,6 +21098,7 @@ this.map = Object.create(null); this.xref = xref; this.objId = null; + this.suppressEncryption = false; this.__nonSerializable__ = nonSerializable; } // disable cloning of the Dict @@ -21108,42 +21109,42 @@ // automatically dereferences Ref objects get: function Dict_get(key1, key2, key3) { var value; - var xref = this.xref; + var xref = this.xref, suppressEncryption = this.suppressEncryption; if (typeof (value = this.map[key1]) !== 'undefined' || key1 in this.map || typeof key2 === 'undefined') { - return xref ? xref.fetchIfRef(value) : value; + return xref ? xref.fetchIfRef(value, suppressEncryption) : value; } if (typeof (value = this.map[key2]) !== 'undefined' || key2 in this.map || typeof key3 === 'undefined') { - return xref ? xref.fetchIfRef(value) : value; + return xref ? xref.fetchIfRef(value, suppressEncryption) : value; } value = this.map[key3] || null; - return xref ? xref.fetchIfRef(value) : value; + return xref ? xref.fetchIfRef(value, suppressEncryption) : value; }, // Same as get(), but returns a promise and uses fetchIfRefAsync(). getAsync: function Dict_getAsync(key1, key2, key3) { var value; - var xref = this.xref; + var xref = this.xref, suppressEncryption = this.suppressEncryption; if (typeof (value = this.map[key1]) !== 'undefined' || key1 in this.map || typeof key2 === 'undefined') { if (xref) { - return xref.fetchIfRefAsync(value); + return xref.fetchIfRefAsync(value, suppressEncryption); } return Promise.resolve(value); } if (typeof (value = this.map[key2]) !== 'undefined' || key2 in this.map || typeof key3 === 'undefined') { if (xref) { - return xref.fetchIfRefAsync(value); + return xref.fetchIfRefAsync(value, suppressEncryption); } return Promise.resolve(value); } value = this.map[key3] || null; if (xref) { - return xref.fetchIfRefAsync(value); + return xref.fetchIfRefAsync(value, suppressEncryption); } return Promise.resolve(value); }, // Same as get(), but dereferences all elements if the result is an Array. getArray: function Dict_getArray(key1, key2, key3) { var value = this.get(key1, key2, key3); - var xref = this.xref; + var xref = this.xref, suppressEncryption = this.suppressEncryption; if (!isArray(value) || !xref) { return value; } @@ -21153,7 +21154,7 @@ if (!isRef(value[i])) { continue; } - value[i] = xref.fetch(value[i]); + value[i] = xref.fetch(value[i], suppressEncryption); } return value; }, @@ -34454,11 +34455,12 @@ var PasswordException = sharedUtil.PasswordException; var PasswordResponses = sharedUtil.PasswordResponses; var bytesToString = sharedUtil.bytesToString; + var warn = sharedUtil.warn; var error = sharedUtil.error; + var assert = sharedUtil.assert; var isInt = sharedUtil.isInt; var stringToBytes = sharedUtil.stringToBytes; var utf8StringToString = sharedUtil.utf8StringToString; - var warn = sharedUtil.warn; var Name = corePrimitives.Name; var isName = corePrimitives.isName; var isDict = corePrimitives.isDict; @@ -38306,6 +38308,8 @@ var cfDict = dict.get('CF'); var streamCryptoName = dict.get('StmF'); if (isDict(cfDict) && isName(streamCryptoName)) { + cfDict.suppressEncryption = true; + // See comment below. var handlerDict = cfDict.get(streamCryptoName.name); keyLength = handlerDict && handlerDict.get('Length') || 128; if (keyLength < 40) { @@ -38364,7 +38368,15 @@ } this.encryptionKey = encryptionKey; if (algorithm >= 4) { - this.cf = dict.get('CF'); + var cf = dict.get('CF'); + if (isDict(cf)) { + // The 'CF' dictionary itself should not be encrypted, and by setting + // `suppressEncryption` we can prevent an infinite loop inside of + // `XRef_fetchUncompressed` if the dictionary contains indirect objects + // (fixes issue7665.pdf). + cf.suppressEncryption = true; + } + this.cf = cf; this.stmf = dict.get('StmF') || identityName; this.strf = dict.get('StrF') || identityName; this.eff = dict.get('EFF') || this.stmf; @@ -38390,6 +38402,7 @@ return hash.subarray(0, Math.min(encryptionKey.length + 5, 16)); } function buildCipherConstructor(cf, name, num, gen, key) { + assert(isName(name), 'Invalid crypt filter name.'); var cryptFilter = cf.get(name.name); var cfm; if (cryptFilter !== null && cryptFilter !== undefined) { @@ -53809,6 +53822,11 @@ if (encrypt) { var ids = trailerDict.get('ID'); var fileId = ids && ids.length ? ids[0] : ''; + // The 'Encrypt' dictionary itself should not be encrypted, and by + // setting `suppressEncryption` we can prevent an infinite loop inside + // of `XRef_fetchUncompressed` if the dictionary contains indirect + // objects (fixes issue7665.pdf). + encrypt.suppressEncryption = true; this.encrypt = new CipherTransformFactory(encrypt, fileId, this.password); } // get the root dictionary (catalog) object @@ -54241,11 +54259,11 @@ } return null; }, - fetchIfRef: function XRef_fetchIfRef(obj) { + fetchIfRef: function XRef_fetchIfRef(obj, suppressEncryption) { if (!isRef(obj)) { return obj; } - return this.fetch(obj); + return this.fetch(obj, suppressEncryption); }, fetch: function XRef_fetch(ref, suppressEncryption) { assert(isRef(ref), 'ref object is not a reference'); @@ -54351,11 +54369,11 @@ } return xrefEntry; }, - fetchIfRefAsync: function XRef_fetchIfRefAsync(obj) { + fetchIfRefAsync: function XRef_fetchIfRefAsync(obj, suppressEncryption) { if (!isRef(obj)) { return Promise.resolve(obj); } - return this.fetchAsync(obj); + return this.fetchAsync(obj, suppressEncryption); }, fetchAsync: function XRef_fetchAsync(ref, suppressEncryption) { var streamManager = this.stream.manager; diff --git a/build/pdf.js b/build/pdf.js index f6ace3df7..0c80b85c9 100644 --- a/build/pdf.js +++ b/build/pdf.js @@ -24,8 +24,8 @@ }(this, function (exports) { // Use strict in our context only - users might not want it 'use strict'; - var pdfjsVersion = '1.6.239'; - var pdfjsBuild = 'f209030'; + var pdfjsVersion = '1.6.242'; + var pdfjsBuild = 'ea5949f'; var pdfjsFilePath = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : null; var pdfjsLibs = {}; (function pdfjsWrapper() { diff --git a/build/pdf.worker.js b/build/pdf.worker.js index ac9510b25..f3d6a4487 100644 --- a/build/pdf.worker.js +++ b/build/pdf.worker.js @@ -24,8 +24,8 @@ }(this, function (exports) { // Use strict in our context only - users might not want it 'use strict'; - var pdfjsVersion = '1.6.239'; - var pdfjsBuild = 'f209030'; + var pdfjsVersion = '1.6.242'; + var pdfjsBuild = 'ea5949f'; var pdfjsFilePath = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : null; var pdfjsLibs = {}; (function pdfjsWrapper() { @@ -21098,6 +21098,7 @@ this.map = Object.create(null); this.xref = xref; this.objId = null; + this.suppressEncryption = false; this.__nonSerializable__ = nonSerializable; } // disable cloning of the Dict @@ -21108,42 +21109,42 @@ // automatically dereferences Ref objects get: function Dict_get(key1, key2, key3) { var value; - var xref = this.xref; + var xref = this.xref, suppressEncryption = this.suppressEncryption; if (typeof (value = this.map[key1]) !== 'undefined' || key1 in this.map || typeof key2 === 'undefined') { - return xref ? xref.fetchIfRef(value) : value; + return xref ? xref.fetchIfRef(value, suppressEncryption) : value; } if (typeof (value = this.map[key2]) !== 'undefined' || key2 in this.map || typeof key3 === 'undefined') { - return xref ? xref.fetchIfRef(value) : value; + return xref ? xref.fetchIfRef(value, suppressEncryption) : value; } value = this.map[key3] || null; - return xref ? xref.fetchIfRef(value) : value; + return xref ? xref.fetchIfRef(value, suppressEncryption) : value; }, // Same as get(), but returns a promise and uses fetchIfRefAsync(). getAsync: function Dict_getAsync(key1, key2, key3) { var value; - var xref = this.xref; + var xref = this.xref, suppressEncryption = this.suppressEncryption; if (typeof (value = this.map[key1]) !== 'undefined' || key1 in this.map || typeof key2 === 'undefined') { if (xref) { - return xref.fetchIfRefAsync(value); + return xref.fetchIfRefAsync(value, suppressEncryption); } return Promise.resolve(value); } if (typeof (value = this.map[key2]) !== 'undefined' || key2 in this.map || typeof key3 === 'undefined') { if (xref) { - return xref.fetchIfRefAsync(value); + return xref.fetchIfRefAsync(value, suppressEncryption); } return Promise.resolve(value); } value = this.map[key3] || null; if (xref) { - return xref.fetchIfRefAsync(value); + return xref.fetchIfRefAsync(value, suppressEncryption); } return Promise.resolve(value); }, // Same as get(), but dereferences all elements if the result is an Array. getArray: function Dict_getArray(key1, key2, key3) { var value = this.get(key1, key2, key3); - var xref = this.xref; + var xref = this.xref, suppressEncryption = this.suppressEncryption; if (!isArray(value) || !xref) { return value; } @@ -21153,7 +21154,7 @@ if (!isRef(value[i])) { continue; } - value[i] = xref.fetch(value[i]); + value[i] = xref.fetch(value[i], suppressEncryption); } return value; }, @@ -30954,11 +30955,12 @@ var PasswordException = sharedUtil.PasswordException; var PasswordResponses = sharedUtil.PasswordResponses; var bytesToString = sharedUtil.bytesToString; + var warn = sharedUtil.warn; var error = sharedUtil.error; + var assert = sharedUtil.assert; var isInt = sharedUtil.isInt; var stringToBytes = sharedUtil.stringToBytes; var utf8StringToString = sharedUtil.utf8StringToString; - var warn = sharedUtil.warn; var Name = corePrimitives.Name; var isName = corePrimitives.isName; var isDict = corePrimitives.isDict; @@ -34806,6 +34808,8 @@ var cfDict = dict.get('CF'); var streamCryptoName = dict.get('StmF'); if (isDict(cfDict) && isName(streamCryptoName)) { + cfDict.suppressEncryption = true; + // See comment below. var handlerDict = cfDict.get(streamCryptoName.name); keyLength = handlerDict && handlerDict.get('Length') || 128; if (keyLength < 40) { @@ -34864,7 +34868,15 @@ } this.encryptionKey = encryptionKey; if (algorithm >= 4) { - this.cf = dict.get('CF'); + var cf = dict.get('CF'); + if (isDict(cf)) { + // The 'CF' dictionary itself should not be encrypted, and by setting + // `suppressEncryption` we can prevent an infinite loop inside of + // `XRef_fetchUncompressed` if the dictionary contains indirect objects + // (fixes issue7665.pdf). + cf.suppressEncryption = true; + } + this.cf = cf; this.stmf = dict.get('StmF') || identityName; this.strf = dict.get('StrF') || identityName; this.eff = dict.get('EFF') || this.stmf; @@ -34890,6 +34902,7 @@ return hash.subarray(0, Math.min(encryptionKey.length + 5, 16)); } function buildCipherConstructor(cf, name, num, gen, key) { + assert(isName(name), 'Invalid crypt filter name.'); var cryptFilter = cf.get(name.name); var cfm; if (cryptFilter !== null && cryptFilter !== undefined) { @@ -45870,6 +45883,11 @@ if (encrypt) { var ids = trailerDict.get('ID'); var fileId = ids && ids.length ? ids[0] : ''; + // The 'Encrypt' dictionary itself should not be encrypted, and by + // setting `suppressEncryption` we can prevent an infinite loop inside + // of `XRef_fetchUncompressed` if the dictionary contains indirect + // objects (fixes issue7665.pdf). + encrypt.suppressEncryption = true; this.encrypt = new CipherTransformFactory(encrypt, fileId, this.password); } // get the root dictionary (catalog) object @@ -46302,11 +46320,11 @@ } return null; }, - fetchIfRef: function XRef_fetchIfRef(obj) { + fetchIfRef: function XRef_fetchIfRef(obj, suppressEncryption) { if (!isRef(obj)) { return obj; } - return this.fetch(obj); + return this.fetch(obj, suppressEncryption); }, fetch: function XRef_fetch(ref, suppressEncryption) { assert(isRef(ref), 'ref object is not a reference'); @@ -46412,11 +46430,11 @@ } return xrefEntry; }, - fetchIfRefAsync: function XRef_fetchIfRefAsync(obj) { + fetchIfRefAsync: function XRef_fetchIfRefAsync(obj, suppressEncryption) { if (!isRef(obj)) { return Promise.resolve(obj); } - return this.fetchAsync(obj); + return this.fetchAsync(obj, suppressEncryption); }, fetchAsync: function XRef_fetchAsync(ref, suppressEncryption) { var streamManager = this.stream.manager; diff --git a/package.json b/package.json index d86cc8561..7d41647c7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pdfjs-dist", - "version": "1.6.239", + "version": "1.6.242", "main": "build/pdf.js", "description": "Generic build of Mozilla's PDF.js library.", "keywords": [