Blame SOURCES/0001-Read-MOSDocumentLockFile-UTF-16-string-data-with-sam.patch

be40d7
From 9f393ee10ae198063bbe3b71c2c87262e7880a34 Mon Sep 17 00:00:00 2001
be40d7
From: Stephan Bergmann <sbergman@redhat.com>
be40d7
Date: Wed, 23 Sep 2020 11:53:11 +0200
be40d7
Subject: [PATCH] Read MOSDocumentLockFile UTF-16 string data with same
be40d7
 endianness
be40d7
MIME-Version: 1.0
be40d7
Content-Type: text/plain; charset=UTF-8
be40d7
Content-Transfer-Encoding: 8bit
be40d7
be40d7
...as MSODocumentLockFile::WriteEntryToStream has written it to (i.e.,
be40d7
always as UTF-16LE, assuming that is actually the right format to use).  The
be40d7
discrepancy between writing and reading the string data appears to be present
be40d7
ever since the code's introduction in 5db1e20b8b0942dac2d50f3cd34532bb61147020
be40d7
"Introduce new lockfile handler for MSO like lockfiles".
be40d7
be40d7
This caused CppunitTest_svl_lockfiles to fail on (big-endian) s390x Linux with
be40d7
be40d7
> svl/qa/unit/lockfiles/test_lockfiles.cxx:578:(anonymous namespace)::LockfileTest::testWordLockFileRT
be40d7
> equality assertion failed
be40d7
> - Expected: LockFile Test
be40d7
> - Actual  : 䰀漀挀欀䘀椀氀攀 吀攀猀琀
be40d7
be40d7
etc.
be40d7
be40d7
Change-Id: I97267aa14a3a926e7fd7bb1d2ce7d2de05d52a64
be40d7
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103238
be40d7
Tested-by: Jenkins
be40d7
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
be40d7
(cherry picked from commit 1b9fa11a0869246fe0433b79aab30dd216cf92b6)
be40d7
---
be40d7
 svl/source/misc/msodocumentlockfile.cxx | 12 ++++++++++--
be40d7
 1 file changed, 10 insertions(+), 2 deletions(-)
be40d7
be40d7
diff --git a/svl/source/misc/msodocumentlockfile.cxx b/svl/source/misc/msodocumentlockfile.cxx
be40d7
index 9650db03999f..0c857ffb53ec 100644
be40d7
--- a/svl/source/misc/msodocumentlockfile.cxx
be40d7
+++ b/svl/source/misc/msodocumentlockfile.cxx
be40d7
@@ -228,8 +228,16 @@ LockFileEntry MSODocumentLockFile::GetLockData()
be40d7
                 nUTF16Len = *++pBuf; // use Excel/PowerPoint position
be40d7
 
be40d7
             if (nUTF16Len > 0 && nUTF16Len <= 52) // skip wrong format
be40d7
-                aResult[LockFileComponent::OOOUSERNAME]
be40d7
-                    = OUString(reinterpret_cast<const sal_Unicode*>(pBuf + 2), nUTF16Len);
be40d7
+            {
be40d7
+                OUStringBuffer str(nUTF16Len);
be40d7
+                sal_uInt8 const* p = reinterpret_cast<sal_uInt8 const*>(pBuf + 2);
be40d7
+                for (int i = 0; i != nUTF16Len; ++i)
be40d7
+                {
be40d7
+                    str.append(sal_Unicode(p[0] | (sal_uInt32(p[1]) << 8)));
be40d7
+                    p += 2;
be40d7
+                }
be40d7
+                aResult[LockFileComponent::OOOUSERNAME] = str.makeStringAndClear();
be40d7
+            }
be40d7
         }
be40d7
     }
be40d7
     return aResult;
be40d7
-- 
be40d7
2.33.1
be40d7