From 63be23f05b8f1f13ec2dfd6136c1df5a171b4e02 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Wed, 1 Dec 2021 19:35:02 +0100 Subject: [PATCH] Handle errors correctly when data lookup fails during /Pages-tree parsing (issue 14303) This only applies to severely corrupt documents, where it's possible that the `Parser` throws when we try to access e.g. a /Kids-entry in the /Pages-tree. Fixes two of the issues listed in issue 14303, namely the `poppler-742-0.pdf...` and `poppler-937-0.pdf...` documents. --- src/core/catalog.js | 33 ++++++++++++++++++----- test/pdfs/.gitignore | 2 ++ test/pdfs/poppler-742-0-fuzzed.pdf | Bin 0 -> 40662 bytes test/pdfs/poppler-937-0-fuzzed.pdf | Bin 0 -> 1666 bytes test/unit/api_spec.js | 42 +++++++++++++++++++++++++++++ 5 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 test/pdfs/poppler-742-0-fuzzed.pdf create mode 100644 test/pdfs/poppler-937-0-fuzzed.pdf diff --git a/src/core/catalog.js b/src/core/catalog.js index 9bad3bd47..a5355ad57 100644 --- a/src/core/catalog.js +++ b/src/core/catalog.js @@ -1091,15 +1091,14 @@ class Catalog { const visitedNodes = new RefSet(); const xref = this.xref, pageKidsCountCache = this.pageKidsCountCache; - let count, - currentPageIndex = 0; + let currentPageIndex = 0; function next() { while (nodesToVisit.length) { const currentNode = nodesToVisit.pop(); if (isRef(currentNode)) { - count = pageKidsCountCache.get(currentNode); + const count = pageKidsCountCache.get(currentNode); // Skip nodes where the page can't be. if (count > 0 && currentPageIndex + count < pageIndex) { currentPageIndex += count; @@ -1146,7 +1145,14 @@ class Catalog { return; } - count = currentNode.get("Count"); + let count; + try { + count = currentNode.get("Count"); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + } if (Number.isInteger(count) && count >= 0 && !skipCount) { // Cache the Kids count, since it can reduce redundant lookups in // documents where all nodes are found at *one* level of the tree. @@ -1161,13 +1167,28 @@ class Catalog { } } - const kids = currentNode.get("Kids"); + let kids; + try { + kids = currentNode.get("Kids"); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + } if (!Array.isArray(kids)) { // Prevent errors in corrupt PDF documents that violate the // specification by *inlining* Page dicts directly in the Kids // array, rather than using indirect objects (fixes issue9540.pdf). + let type; + try { + type = currentNode.get("Type"); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + } if ( - isName(currentNode.get("Type"), "Page") || + isName(type, "Page") || (!currentNode.has("Type") && currentNode.has("Contents")) ) { if (currentPageIndex === pageIndex) { diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index d8681a1e7..d8f7c6a11 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -494,3 +494,5 @@ !poppler-85140-0.pdf !poppler-91414-0-53.pdf !poppler-91414-0-54.pdf +!poppler-742-0-fuzzed.pdf +!poppler-937-0-fuzzed.pdf diff --git a/test/pdfs/poppler-742-0-fuzzed.pdf b/test/pdfs/poppler-742-0-fuzzed.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cc9758b35d55bd15768e8ebaf17048455880feee GIT binary patch literal 40662 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 U`l6Xso0>cqp&*07$@4M!3pZe)`~Uy| literal 0 HcmV?d00001 diff --git a/test/unit/api_spec.js b/test/unit/api_spec.js index 6b8c1c4f2..33226b46a 100644 --- a/test/unit/api_spec.js +++ b/test/unit/api_spec.js @@ -545,6 +545,48 @@ describe("api", function () { await Promise.all([loadingTask1.destroy(), loadingTask2.destroy()]); }); + + it("creates pdf doc from PDF files, with bad /Pages tree /Kids entries", async function () { + const loadingTask1 = getDocument( + buildGetDocumentParams("poppler-742-0-fuzzed.pdf") + ); + const loadingTask2 = getDocument( + buildGetDocumentParams("poppler-937-0-fuzzed.pdf") + ); + expect(loadingTask1 instanceof PDFDocumentLoadingTask).toEqual(true); + expect(loadingTask2 instanceof PDFDocumentLoadingTask).toEqual(true); + + const pdfDocument1 = await loadingTask1.promise; + const pdfDocument2 = await loadingTask2.promise; + + expect(pdfDocument1.numPages).toEqual(1); + expect(pdfDocument2.numPages).toEqual(1); + + try { + await pdfDocument1.getPage(1); + + // Shouldn't get here. + expect(false).toEqual(true); + } catch (reason) { + expect(reason instanceof UnknownErrorException).toEqual(true); + expect(reason.message).toEqual( + "Page dictionary kids object is not an array." + ); + } + try { + await pdfDocument2.getPage(1); + + // Shouldn't get here. + expect(false).toEqual(true); + } catch (reason) { + expect(reason instanceof UnknownErrorException).toEqual(true); + expect(reason.message).toEqual( + "Page dictionary kids object is not an array." + ); + } + + await Promise.all([loadingTask1.destroy(), loadingTask2.destroy()]); + }); }); describe("PDFWorker", function () {