Browse Source

Merge pull request #2912 from brendandahl/empty-private-dict

Use empty private dictionaries instead of removing them.
Yury Delendik 12 years ago
parent
commit
0ebe91c50b
  1. 31
      src/fonts.js

31
src/fonts.js

@ -6140,10 +6140,19 @@ var CFFParser = (function CFFParserClosure() {
} }
return { charStrings: charStrings, seacs: seacs }; return { charStrings: charStrings, seacs: seacs };
}, },
emptyPrivateDictionary:
function CFFParser_emptyPrivateDictionary(parentDict) {
var privateDict = this.createDict(CFFPrivateDict, [],
parentDict.strings);
parentDict.setByKey(18, [0, 0]);
parentDict.privateDict = privateDict;
},
parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) { parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) {
// no private dict, do nothing // no private dict, do nothing
if (!parentDict.hasName('Private')) if (!parentDict.hasName('Private')) {
this.emptyPrivateDictionary(parentDict);
return; return;
}
var privateOffset = parentDict.getByName('Private'); var privateOffset = parentDict.getByName('Private');
// make sure the params are formatted correctly // make sure the params are formatted correctly
if (!isArray(privateOffset) || privateOffset.length !== 2) { if (!isArray(privateOffset) || privateOffset.length !== 2) {
@ -6154,7 +6163,7 @@ var CFFParser = (function CFFParserClosure() {
var offset = privateOffset[1]; var offset = privateOffset[1];
// remove empty dicts or ones that refer to invalid location // remove empty dicts or ones that refer to invalid location
if (size === 0 || offset >= this.bytes.length) { if (size === 0 || offset >= this.bytes.length) {
parentDict.removeByName('Private'); this.emptyPrivateDictionary(parentDict);
return; return;
} }
@ -6172,7 +6181,7 @@ var CFFParser = (function CFFParserClosure() {
var relativeOffset = offset + subrsOffset; var relativeOffset = offset + subrsOffset;
// Validate the offset. // Validate the offset.
if (subrsOffset === 0 || relativeOffset >= this.bytes.length) { if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {
privateDict.removeByName('Subrs'); this.emptyPrivateDictionary(parentDict);
return; return;
} }
var subrsIndex = this.parseIndex(relativeOffset); var subrsIndex = this.parseIndex(relativeOffset);
@ -6853,15 +6862,23 @@ var CFFCompiler = (function CFFCompilerClosure() {
output) { output) {
for (var i = 0, ii = dicts.length; i < ii; ++i) { for (var i = 0, ii = dicts.length; i < ii; ++i) {
var fontDict = dicts[i]; var fontDict = dicts[i];
if (!fontDict.privateDict || !fontDict.hasName('Private')) assert(fontDict.privateDict && fontDict.hasName('Private'),
continue; 'There must be an private dictionary.');
var privateDict = fontDict.privateDict; var privateDict = fontDict.privateDict;
var privateDictTracker = new CFFOffsetTracker(); var privateDictTracker = new CFFOffsetTracker();
var privateDictData = this.compileDict(privateDict, privateDictTracker); var privateDictData = this.compileDict(privateDict, privateDictTracker);
privateDictTracker.offset(output.length); var outputLength = output.length;
privateDictTracker.offset(outputLength);
if (!privateDictData.length) {
// The private dictionary was empty, set the output length to zero to
// ensure the offset length isn't out of bounds in the eyes of the
// sanitizer.
outputLength = 0;
}
trackers[i].setEntryLocation('Private', trackers[i].setEntryLocation('Private',
[privateDictData.length, output.length], [privateDictData.length, outputLength],
output); output);
output.add(privateDictData); output.add(privateDictData);

Loading…
Cancel
Save