Handle some illegal characters in hex string

Do not throw exception when hex strings are in the wrong format

Currently pdf.js is throwing an exception for the following hex string:

`<7 0 2 15 5 2 2 2 4 3 2 4>`

The issue is that the 15 is not a valid hex character so pdf.js ends up
throwing an exception.

This diff changes the parser to process the above hex string as follow:

`70 21 55 2 24 32` (Note: the final 4 of the hex string is ignored)

replicating the behaviour of MuPDF, and doesn't throw an exception.
This commit is contained in:
mduan 2013-01-08 15:28:08 -08:00
parent 7d9938df5f
commit eb8f4e8343
2 changed files with 35 additions and 18 deletions

View File

@ -460,28 +460,34 @@ var Lexer = (function LexerClosure() {
getHexString: function Lexer_getHexString(ch) { getHexString: function Lexer_getHexString(ch) {
var str = ''; var str = '';
var stream = this.stream; var stream = this.stream;
for (;;) { var isFirstHex = true;
var firstDigit;
var secondDigit;
while (true) {
ch = stream.getChar(); ch = stream.getChar();
if (ch == '>') {
break;
}
if (!ch) { if (!ch) {
warn('Unterminated hex string'); warn('Unterminated hex string');
break; break;
} } else if (ch === '>') {
if (specialChars[ch.charCodeAt(0)] != 1) { break;
var x, x2; } else if (specialChars[ch.charCodeAt(0)] === 1) {
if ((x = toHexDigit(ch)) == -1) continue;
error('Illegal character in hex string: ' + ch); } else {
if (isFirstHex) {
ch = stream.getChar(); firstDigit = toHexDigit(ch);
while (specialChars[ch.charCodeAt(0)] == 1) if (firstDigit === -1) {
ch = stream.getChar(); warn("Ignoring invalid character '" + ch + "' in hex string");
continue;
if ((x2 = toHexDigit(ch)) == -1) }
error('Illegal character in hex string: ' + ch); } else {
secondDigit = toHexDigit(ch);
str += String.fromCharCode((x << 4) | x2); if (secondDigit === -1) {
warn("Ignoring invalid character '" + ch + "' in hex string");
continue;
}
str += String.fromCharCode((firstDigit << 4) | secondDigit);
}
isFirstHex = !isFirstHex;
} }
} }
return str; return str;

View File

@ -12,6 +12,17 @@ describe('parser', function() {
expect(result).toEqual(11.234); expect(result).toEqual(11.234);
}); });
it('should not throw exception on bad input', function() {
// '8 0 2 15 5 2 2 2 4 3 2 4'
// should be parsed as
// '80 21 55 22 24 32'
var input = new StringStream('7 0 2 15 5 2 2 2 4 3 2 4>');
var lexer = new Lexer(input);
var result = lexer.getHexString('<');
expect(result).toEqual('p!U"$2');
});
}); });
}); });