diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2020-12-16 21:03:44 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2020-12-17 09:08:37 +0100 |
commit | 89d8c762496cf874d6352167df280c33b7ba5ea0 (patch) | |
tree | f73e4813c36354fe56f12238eb49ffc35cc12792 /external | |
parent | 252cdd5f43d65095543e317d37e1a0ea4fd839e0 (diff) |
pdfium: backport GetTrailerEnds whitespace fix
Fixes the problem that sometimes a valid sig is detected as a partial
one.
Change-Id: I68107569bf8c331170902b1918a70ea4b9b659a2
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107856
Tested-by: Jenkins
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Diffstat (limited to 'external')
-rw-r--r-- | external/pdfium/FPDF_GetTrailerEnds-make-this-not-depend-on-whitespa.patch.1 | 55 | ||||
-rw-r--r-- | external/pdfium/UnpackedTarball_pdfium.mk | 3 |
2 files changed, 58 insertions, 0 deletions
diff --git a/external/pdfium/FPDF_GetTrailerEnds-make-this-not-depend-on-whitespa.patch.1 b/external/pdfium/FPDF_GetTrailerEnds-make-this-not-depend-on-whitespa.patch.1 new file mode 100644 index 000000000000..10398bae6415 --- /dev/null +++ b/external/pdfium/FPDF_GetTrailerEnds-make-this-not-depend-on-whitespa.patch.1 @@ -0,0 +1,55 @@ +From c10d17dee78d48d5e56da965e0cd02d28fd513a5 Mon Sep 17 00:00:00 2001 +From: Miklos Vajna <vmiklos@collabora.co.uk> +Date: Wed, 9 Dec 2020 17:42:53 +0000 +Subject: [PATCH] FPDF_GetTrailerEnds: make this not depend on whitespace + +PDF-1.7 calls out no bytes other than whitespace when specifying what +can occur between endstream and endobj, so whitespace needs to be +handled. When CPDF_SyntaxParser::ReadStream() reads the stream, it reads +'endobj', and then resets the position back to the end of 'endstream'. +This mechanism is disabled in case there is whitespace between the +tokens and the newline, see the end of the function. + +This results in reporting no trailer ends, as the parsing fails, as the +next token is expected to be 'endobj', but it's the ID of the next +object instead. + +Fix the problem by handling whitespace in +CPDF_SyntaxParser::ReadStream() where it was looking for \ntoken\n, not +allowing whitespace between the token and the following newline. + +Change-Id: I7048e8d081af04af3dd08d957212c885b7982b5e +Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/76850 +Commit-Queue: Tom Sepez <tsepez@chromium.org> +Reviewed-by: Tom Sepez <tsepez@chromium.org> +--- + core/fpdfapi/parser/cpdf_syntax_parser.cpp | 8 ++ + fpdfsdk/fpdf_view_embeddertest.cpp | 14 +++ + .../resources/trailer_end_trailing_space.in | 86 ++++++++++++++++ + .../resources/trailer_end_trailing_space.pdf | 99 +++++++++++++++++++ + 4 files changed, 207 insertions(+) + create mode 100644 testing/resources/trailer_end_trailing_space.in + create mode 100644 testing/resources/trailer_end_trailing_space.pdf + +diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.cpp b/core/fpdfapi/parser/cpdf_syntax_parser.cpp +index 06389bccc..5318efdc1 100644 +--- a/core/fpdfapi/parser/cpdf_syntax_parser.cpp ++++ b/core/fpdfapi/parser/cpdf_syntax_parser.cpp +@@ -795,6 +795,14 @@ RetainPtr<CPDF_Stream> CPDF_SyntaxParser::ReadStream( + memset(m_WordBuffer, 0, kEndObjStr.GetLength() + 1); + GetNextWordInternal(nullptr); + ++ // Allow whitespace after endstream and before a newline. ++ unsigned char ch = 0; ++ while (GetNextChar(ch)) { ++ if (!PDFCharIsWhitespace(ch) || PDFCharIsLineEnding(ch)) ++ break; ++ } ++ SetPos(GetPos() - 1); ++ + int numMarkers = ReadEOLMarkers(GetPos()); + if (m_WordSize == static_cast<unsigned int>(kEndObjStr.GetLength()) && + numMarkers != 0 && +-- +2.26.2 + diff --git a/external/pdfium/UnpackedTarball_pdfium.mk b/external/pdfium/UnpackedTarball_pdfium.mk index c0cc000e40be..87012e73f931 100644 --- a/external/pdfium/UnpackedTarball_pdfium.mk +++ b/external/pdfium/UnpackedTarball_pdfium.mk @@ -17,7 +17,10 @@ pdfium_patches += c++20-comparison.patch pdfium_patches += AnnotationInkAndVertices.patch.1 pdfium_patches += AnnotationBorderProperties.patch.1 pdfium_patches += AnnotationLineStartAndEnd.patch.1 +# Backport of <https://pdfium-review.googlesource.com/c/pdfium/+/75910>. pdfium_patches += SignatureGetDocMDPPermission.patch.1 +# Backport of <https://pdfium-review.googlesource.com/c/pdfium/+/76850>. +pdfium_patches += FPDF_GetTrailerEnds-make-this-not-depend-on-whitespa.patch.1 # Work around <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94141> "c++20 rewritten operator== # recursive call mixing friend and external operators for template class" in GCC with |