Let Lexer.getNumber treat a single minus sign as zero (bug 1753983)

This appears to be consistent with the behaviour in both Adobe Reader and PDFium (in Google Chrome); this is essentially the same approach as used for a single decimal point in PR 9827.
This commit is contained in:
Jonas Jenwald 2022-02-07 16:14:45 +01:00
parent acc758c40c
commit 64f3dbeb48
5 changed files with 27 additions and 12 deletions

View File

@ -4561,7 +4561,7 @@ class EvaluatorPreprocessor {
} }
static get MAX_INVALID_PATH_OPS() { static get MAX_INVALID_PATH_OPS() {
return shadow(this, "MAX_INVALID_PATH_OPS", 20); return shadow(this, "MAX_INVALID_PATH_OPS", 10);
} }
constructor(stream, xref, stateManager = new StateManager()) { constructor(stream, xref, stateManager = new StateManager()) {

View File

@ -908,14 +908,17 @@ class Lexer {
ch = this.nextChar(); ch = this.nextChar();
} }
if (ch < /* '0' = */ 0x30 || ch > /* '9' = */ 0x39) { if (ch < /* '0' = */ 0x30 || ch > /* '9' = */ 0x39) {
if ( if (isWhiteSpace(ch) || ch === /* EOF = */ -1) {
divideBy === 10 &&
sign === 0 &&
(isWhiteSpace(ch) || ch === /* EOF = */ -1)
) {
// This is consistent with Adobe Reader (fixes issue9252.pdf). // This is consistent with Adobe Reader (fixes issue9252.pdf).
warn("Lexer.getNumber - treating a single decimal point as zero."); if (divideBy === 10 && sign === 0) {
return 0; warn("Lexer.getNumber - treating a single decimal point as zero.");
return 0;
}
// This is consistent with Adobe Reader (fixes bug1753983.pdf).
if (divideBy === 0 && sign === -1) {
warn("Lexer.getNumber - treating a single minus sign as zero.");
return 0;
}
} }
throw new FormatError( throw new FormatError(
`Invalid number: ${String.fromCharCode(ch)} (charCode ${ch})` `Invalid number: ${String.fromCharCode(ch)} (charCode ${ch})`

View File

@ -0,0 +1 @@
https://bugzilla.mozilla.org/attachment.cgi?id=9262646

View File

@ -219,6 +219,13 @@
"lastPage": 3, "lastPage": 3,
"type": "eq" "type": "eq"
}, },
{ "id": "bug1753983",
"file": "pdfs/bug1753983.pdf",
"md5": "432be86262e5071176c49713ce458031",
"rounds": 1,
"link": true,
"type": "eq"
},
{ "id": "bug921760", { "id": "bug921760",
"file": "pdfs/bug921760.pdf", "file": "pdfs/bug921760.pdf",
"md5": "1aa136d786a65b0d7cce7bdb3c58c6c3", "md5": "1aa136d786a65b0d7cce7bdb3c58c6c3",

View File

@ -151,10 +151,14 @@ describe("parser", function () {
expect(plusLexer.getNumber()).toEqual(205.88); expect(plusLexer.getNumber()).toEqual(205.88);
}); });
it("should treat a single decimal point as zero", function () { it("should treat a single decimal point, or minus sign, as zero", function () {
const input = new StringStream("."); const dotInput = new StringStream(".");
const lexer = new Lexer(input); const dotLexer = new Lexer(dotInput);
expect(lexer.getNumber()).toEqual(0); expect(dotLexer.getNumber()).toEqual(0);
const minusInput = new StringStream("-");
const minusLexer = new Lexer(minusInput);
expect(minusLexer.getNumber()).toEqual(0);
const numbers = ["..", "-.", "+.", "-\r\n.", "+\r\n."]; const numbers = ["..", "-.", "+.", "-\r\n.", "+\r\n."];
for (const number of numbers) { for (const number of numbers) {