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:
		
							parent
							
								
									acc758c40c
								
							
						
					
					
						commit
						64f3dbeb48
					
				| @ -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()) { | ||||||
|  | |||||||
| @ -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})` | ||||||
|  | |||||||
							
								
								
									
										1
									
								
								test/pdfs/bug1753983.pdf.link
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/pdfs/bug1753983.pdf.link
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | https://bugzilla.mozilla.org/attachment.cgi?id=9262646 | ||||||
| @ -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", | ||||||
|  | |||||||
| @ -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) { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user