Browse Source

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.
mduan 12 years ago
parent
commit
eb8f4e8343
  1. 42
      src/parser.js
  2. 11
      test/unit/parser_spec.js

42
src/parser.js

@ -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;

11
test/unit/parser_spec.js

@ -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');
});
}); });
}); });

Loading…
Cancel
Save