Ensure that TilingPatterns have valid (non-zero) /BBox arrays (issue 8330)

Fixes 8330.
This commit is contained in:
Jonas Jenwald 2017-05-24 12:12:14 +02:00
parent 9342054502
commit e589834f13
5 changed files with 45 additions and 20 deletions

View File

@ -480,30 +480,40 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
stateManager.state.clone());
},
handleTilingType:
function PartialEvaluator_handleTilingType(fn, args, resources,
pattern, patternDict,
operatorList, task) {
handleTilingType(fn, args, resources, pattern, patternDict, operatorList,
task) {
// Create an IR of the pattern code.
var tilingOpList = new OperatorList();
let tilingOpList = new OperatorList();
// Merge the available resources, to prevent issues when the patternDict
// is missing some /Resources entries (fixes issue6541.pdf).
var resourcesArray = [patternDict.get('Resources'), resources];
var patternResources = Dict.merge(this.xref, resourcesArray);
let resourcesArray = [patternDict.get('Resources'), resources];
let patternResources = Dict.merge(this.xref, resourcesArray);
return this.getOperatorList({
stream: pattern,
task,
resources: patternResources,
operatorList: tilingOpList,
}).then(function () {
// Add the dependencies to the parent operator list so they are
// resolved before sub operator list is executed synchronously.
operatorList.addDependencies(tilingOpList.dependencies);
operatorList.addOp(fn, getTilingPatternIR({
}).then(function() {
return getTilingPatternIR({
fnArray: tilingOpList.fnArray,
argsArray: tilingOpList.argsArray,
}, patternDict, args));
}, patternDict, args);
}).then(function(tilingPatternIR) {
// Add the dependencies to the parent operator list so they are
// resolved before the sub operator list is executed synchronously.
operatorList.addDependencies(tilingOpList.dependencies);
operatorList.addOp(fn, tilingPatternIR);
}, (reason) => {
if (this.options.ignoreErrors) {
// Error(s) in the TilingPattern -- sending unsupported feature
// notification and allow rendering to continue.
this.handler.send('UnsupportedFeature',
{ featureId: UNSUPPORTED_FEATURES.unknown, });
warn(`handleTilingType - ignoring pattern: "${reason}".`);
return;
}
throw reason;
});
},

View File

@ -795,12 +795,18 @@ Shadings.Dummy = (function DummyClosure() {
})();
function getTilingPatternIR(operatorList, dict, args) {
var matrix = dict.getArray('Matrix');
var bbox = dict.getArray('BBox');
var xstep = dict.get('XStep');
var ystep = dict.get('YStep');
var paintType = dict.get('PaintType');
var tilingType = dict.get('TilingType');
let matrix = dict.getArray('Matrix');
let bbox = Util.normalizeRect(dict.getArray('BBox'));
let xstep = dict.get('XStep');
let ystep = dict.get('YStep');
let paintType = dict.get('PaintType');
let tilingType = dict.get('TilingType');
// Ensure that the pattern has a non-zero width and height, to prevent errors
// in `pattern_helper.js` (fixes issue8330.pdf).
if ((bbox[2] - bbox[0]) === 0 || (bbox[3] - bbox[1]) === 0) {
throw new Error(`getTilingPatternIR - invalid /BBox array: [${bbox}].`);
}
return [
'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep,

View File

@ -304,7 +304,7 @@ var TilingPattern = (function TilingPatternClosure() {
function TilingPattern(IR, color, ctx, canvasGraphicsFactory, baseTransform) {
this.operatorList = IR[2];
this.matrix = IR[3] || [1, 0, 0, 1, 0, 0];
this.bbox = Util.normalizeRect(IR[4]);
this.bbox = IR[4];
this.xstep = IR[5];
this.ystep = IR[6];
this.paintType = IR[7];

View File

@ -0,0 +1 @@
https://github.com/mozilla/pdf.js/files/954710/FailingPDF.pdf

View File

@ -1269,6 +1269,14 @@
"rounds": 1,
"type": "eq"
},
{ "id": "issue8330",
"file": "pdfs/issue8330.pdf",
"md5": "9010093d07dd62d3b49378fd48cf45f9",
"rounds": 1,
"lastPage": 1,
"link": true,
"type": "eq"
},
{ "id": "issue4573",
"file": "pdfs/issue4573.pdf",
"md5": "34b0c4fdee19e57033275b766c5f57a3",