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