[Libreoffice-commits] core.git: vcl/source
Stephan Bergmann (via logerrit)
logerrit at kemper.freedesktop.org
Wed Sep 23 12:04:44 UTC 2020
vcl/source/pdf/PDFiumLibrary.cxx | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)
New commits:
commit 7346edfee5c2391f828b09baa3dc94d5834d3cd8
Author: Stephan Bergmann <sbergman at redhat.com>
AuthorDate: Wed Sep 23 12:23:37 2020 +0200
Commit: Stephan Bergmann <sbergman at redhat.com>
CommitDate: Wed Sep 23 14:04:07 2020 +0200
These PDFium-provided string sizes must always be multiples of 2
...as both FPDFTextObj_GetText (see
workdir/UnpackedTarball/pdfium/public/fpdf_edit.h) and FPDFAnnot_GetStringValue
(see workdir/UnpackedTarball/pdfium/public/fpdf_annot.h) return UTF-16LE strings
but measure their sizes in bytes. So half the returned sizes early, which
avoids over-allocating double sized sal_Unicode arrays, and is a prerequisite
for a follow-up endianness-issue fix.
Change-Id: I4565819044a44ca9435f9bffdea083d5807cfe4d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103242
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman at redhat.com>
diff --git a/vcl/source/pdf/PDFiumLibrary.cxx b/vcl/source/pdf/PDFiumLibrary.cxx
index f8d5b79c8f6f..024665efc7e2 100644
--- a/vcl/source/pdf/PDFiumLibrary.cxx
+++ b/vcl/source/pdf/PDFiumLibrary.cxx
@@ -12,6 +12,8 @@
#if HAVE_FEATURE_PDFIUM
+#include <cassert>
+
#include <vcl/filter/PDFiumLibrary.hxx>
#include <fpdf_annot.h>
#include <fpdf_edit.h>
@@ -224,13 +226,17 @@ OUString PDFiumPageObject::getText(std::unique_ptr<PDFiumTextPage> const& pTextP
{
OUString sReturnText;
- const int nBytes = FPDFTextObj_GetText(mpPageObject, pTextPage->getPointer(), nullptr, 0);
+ int nBytes = FPDFTextObj_GetText(mpPageObject, pTextPage->getPointer(), nullptr, 0);
+ assert(nBytes % 2 == 0);
+ nBytes /= 2;
std::unique_ptr<sal_Unicode[]> pText(new sal_Unicode[nBytes]);
- const int nActualBytes
- = FPDFTextObj_GetText(mpPageObject, pTextPage->getPointer(), pText.get(), nBytes);
- if (nActualBytes > 2)
+ int nActualBytes
+ = FPDFTextObj_GetText(mpPageObject, pTextPage->getPointer(), pText.get(), nBytes * 2);
+ assert(nActualBytes % 2 == 0);
+ nActualBytes /= 2;
+ if (nActualBytes > 1)
sReturnText = OUString(pText.get());
return sReturnText;
@@ -416,11 +422,15 @@ OUString PDFiumAnnotation::getString(OString const& rKey)
{
OUString rString;
unsigned long nSize = FPDFAnnot_GetStringValue(mpAnnotation, rKey.getStr(), nullptr, 0);
- if (nSize > 2)
+ assert(nSize % 2 == 0);
+ nSize /= 2;
+ if (nSize > 1)
{
std::unique_ptr<sal_Unicode[]> pText(new sal_Unicode[nSize]);
unsigned long nStringSize = FPDFAnnot_GetStringValue(
- mpAnnotation, rKey.getStr(), reinterpret_cast<FPDF_WCHAR*>(pText.get()), nSize);
+ mpAnnotation, rKey.getStr(), reinterpret_cast<FPDF_WCHAR*>(pText.get()), nSize * 2);
+ assert(nStringSize % 2 == 0);
+ nStringSize /= 2;
if (nStringSize > 0)
rString = OUString(pText.get());
}
More information about the Libreoffice-commits
mailing list