[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