Check isEvalSupported, and test that eval is actually supported, before attempting to use the PostScriptCompiler (issue 5573)
				
					
				
			Currently `PDFFunction` is implemented (basically) like a class with only `static` methods. Since it's used directly in a number of different `src/core/` files, attempting to pass in `isEvalSupported` would result in code that's *very* messy, not to mention difficult to maintain (since *every* single `PDFFunction` method call would need to include a `isEvalSupported` argument). Rather than having to wait for a possible re-factoring of `PDFFunction` that would avoid the above problems by design, it probably makes sense to at least set `isEvalSupported` globally for `PDFFunction`. Please note that there's one caveat with this solution: If `PDFJS.getDocument` is used to open multiple files simultaneously, with *different* `PDFJS.isEvalSupported` values set before each call, then the last one will always win. However, that seems like enough of an edge-case that we shouldn't have to worry about it. Besides, since we'll also test that `eval` is actually supported, it should be fine. Fixes 5573.
This commit is contained in:
		
							parent
							
								
									d0d7046129
								
							
						
					
					
						commit
						dc926ffc0f
					
				| @ -24,6 +24,7 @@ import { OperatorList, PartialEvaluator } from './evaluator'; | |||||||
| import { AnnotationFactory } from './annotation'; | import { AnnotationFactory } from './annotation'; | ||||||
| import { calculateMD5 } from './crypto'; | import { calculateMD5 } from './crypto'; | ||||||
| import { Linearization } from './parser'; | import { Linearization } from './parser'; | ||||||
|  | import { PDFFunction } from './function'; | ||||||
| 
 | 
 | ||||||
| var Page = (function PageClosure() { | var Page = (function PageClosure() { | ||||||
| 
 | 
 | ||||||
| @ -532,6 +533,9 @@ var PDFDocument = (function PDFDocumentClosure() { | |||||||
|         }, |         }, | ||||||
|       }; |       }; | ||||||
|       this.catalog = new Catalog(this.pdfManager, this.xref, pageFactory); |       this.catalog = new Catalog(this.pdfManager, this.xref, pageFactory); | ||||||
|  | 
 | ||||||
|  |       let evaluatorOptions = this.pdfManager.evaluatorOptions; | ||||||
|  |       PDFFunction.setIsEvalSupported(evaluatorOptions.isEvalSupported); | ||||||
|     }, |     }, | ||||||
|     get numPages() { |     get numPages() { | ||||||
|       var linearization = this.linearization; |       var linearization = this.linearization; | ||||||
|  | |||||||
| @ -54,6 +54,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { | |||||||
|     disableFontFace: false, |     disableFontFace: false, | ||||||
|     nativeImageDecoderSupport: NativeImageDecoding.DECODE, |     nativeImageDecoderSupport: NativeImageDecoding.DECODE, | ||||||
|     ignoreErrors: false, |     ignoreErrors: false, | ||||||
|  |     isEvalSupported: true, | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   function NativeImageDecoder(xref, resources, handler, forceDataSchema) { |   function NativeImageDecoder(xref, resources, handler, forceDataSchema) { | ||||||
|  | |||||||
| @ -13,17 +13,31 @@ | |||||||
|  * limitations under the License. |  * limitations under the License. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| import { FormatError, info, isBool } from '../shared/util'; | import { | ||||||
|  |   FormatError, info, isBool, isEvalSupported, shadow | ||||||
|  | } from '../shared/util'; | ||||||
| import { isDict, isStream } from './primitives'; | import { isDict, isStream } from './primitives'; | ||||||
| import { PostScriptLexer, PostScriptParser } from './ps_parser'; | import { PostScriptLexer, PostScriptParser } from './ps_parser'; | ||||||
| 
 | 
 | ||||||
|  | let IsEvalSupportedCached = { | ||||||
|  |   get value() { | ||||||
|  |     return shadow(this, 'value', isEvalSupported()); | ||||||
|  |   }, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| var PDFFunction = (function PDFFunctionClosure() { | var PDFFunction = (function PDFFunctionClosure() { | ||||||
|   var CONSTRUCT_SAMPLED = 0; |   var CONSTRUCT_SAMPLED = 0; | ||||||
|   var CONSTRUCT_INTERPOLATED = 2; |   var CONSTRUCT_INTERPOLATED = 2; | ||||||
|   var CONSTRUCT_STICHED = 3; |   var CONSTRUCT_STICHED = 3; | ||||||
|   var CONSTRUCT_POSTSCRIPT = 4; |   var CONSTRUCT_POSTSCRIPT = 4; | ||||||
| 
 | 
 | ||||||
|  |   let isEvalSupported = true; | ||||||
|  | 
 | ||||||
|   return { |   return { | ||||||
|  |     setIsEvalSupported(support = true) { | ||||||
|  |       isEvalSupported = support !== false; | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|     getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps, |     getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps, | ||||||
|                                                        str) { |                                                        str) { | ||||||
|       var i, ii; |       var i, ii; | ||||||
| @ -399,15 +413,17 @@ var PDFFunction = (function PDFFunctionClosure() { | |||||||
|       var range = IR[2]; |       var range = IR[2]; | ||||||
|       var code = IR[3]; |       var code = IR[3]; | ||||||
| 
 | 
 | ||||||
|       var compiled = (new PostScriptCompiler()).compile(code, domain, range); |       if (isEvalSupported && IsEvalSupportedCached.value) { | ||||||
|  |         let compiled = (new PostScriptCompiler()).compile(code, domain, range); | ||||||
|         if (compiled) { |         if (compiled) { | ||||||
|           // Compiled function consists of simple expressions such as addition,
 |           // Compiled function consists of simple expressions such as addition,
 | ||||||
|           // subtraction, Math.max, and also contains 'var' and 'return'
 |           // subtraction, Math.max, and also contains 'var' and 'return'
 | ||||||
|           // statements. See the generation in the PostScriptCompiler below.
 |           // statements. See the generation in the PostScriptCompiler below.
 | ||||||
|           // eslint-disable-next-line no-new-func
 |           // eslint-disable-next-line no-new-func
 | ||||||
|         return new Function('src', 'srcOffset', 'dest', 'destOffset', compiled); |           return new Function('src', 'srcOffset', 'dest', 'destOffset', | ||||||
|  |                               compiled); | ||||||
|  |         } | ||||||
|       } |       } | ||||||
| 
 |  | ||||||
|       info('Unable to compile PS function'); |       info('Unable to compile PS function'); | ||||||
| 
 | 
 | ||||||
|       var numOutputs = range.length >> 1; |       var numOutputs = range.length >> 1; | ||||||
|  | |||||||
| @ -602,6 +602,7 @@ var WorkerMessageHandler = { | |||||||
|         disableFontFace: data.disableFontFace, |         disableFontFace: data.disableFontFace, | ||||||
|         nativeImageDecoderSupport: data.nativeImageDecoderSupport, |         nativeImageDecoderSupport: data.nativeImageDecoderSupport, | ||||||
|         ignoreErrors: data.ignoreErrors, |         ignoreErrors: data.ignoreErrors, | ||||||
|  |         isEvalSupported: data.isEvalSupported, | ||||||
|       }; |       }; | ||||||
| 
 | 
 | ||||||
|       getPdfManager(data, evaluatorOptions).then(function (newPdfManager) { |       getPdfManager(data, evaluatorOptions).then(function (newPdfManager) { | ||||||
|  | |||||||
| @ -357,6 +357,7 @@ function _fetchDocument(worker, source, pdfDataRangeTransport, docId) { | |||||||
|     docBaseUrl: source.docBaseUrl, |     docBaseUrl: source.docBaseUrl, | ||||||
|     nativeImageDecoderSupport: source.nativeImageDecoderSupport, |     nativeImageDecoderSupport: source.nativeImageDecoderSupport, | ||||||
|     ignoreErrors: source.ignoreErrors, |     ignoreErrors: source.ignoreErrors, | ||||||
|  |     isEvalSupported: getDefaultSetting('isEvalSupported'), | ||||||
|   }).then(function (workerId) { |   }).then(function (workerId) { | ||||||
|     if (worker.destroyed) { |     if (worker.destroyed) { | ||||||
|       throw new Error('Worker was destroyed'); |       throw new Error('Worker was destroyed'); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user