diff options
author | Michael Stahl <mstahl@redhat.com> | 2015-11-25 22:42:16 +0100 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2015-11-28 14:15:53 +0100 |
commit | a50165a9b96198e6a5b9da9fca3158fcf113066e (patch) | |
tree | 61bc8de34872203d38361eafe4189b4d4abf6af7 | |
parent | fbd8717061d8ecec0d056f655987b6cb9960e4b7 (diff) |
vcl: OutputDevice::GetTextArray() should always init pDXAry
CppunitTest_writerperfect_writer file libmwaw/pass/Acta_1.0.hqx uses the
font "Courier", and for unknown reasons we can't properly load that
font, because the PhysicalFontFamily::mpFirst for "courier" is null.
This causes OutputDevice::GetTextArray() to fail to create a SalLayout
and return early before initializing the passed pDXAry, which then
generates lots of DrMemory warnings.
Let's hope the callers are happy about an all-0 pDXAry.
Change-Id: I07b29a59660cf5cd060fd77da5d96021f9d8f9f5
(cherry picked from commit e6e409b684f9b046dcde9f0615018508f769c369)
Reviewed-on: https://gerrit.libreoffice.org/20206
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Tested-by: Miklos Vajna <vmiklos@collabora.co.uk>
(cherry picked from commit 273be431c62aaf5fabe218cae57e8f3f9fe049e1)
-rw-r--r-- | vcl/source/outdev/text.cxx | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx index faf8fa966d74..173aa5278b3b 100644 --- a/vcl/source/outdev/text.cxx +++ b/vcl/source/outdev/text.cxx @@ -1007,7 +1007,7 @@ long OutputDevice::GetTextArray( const OUString& rStr, long* pDXAry, } if( nIndex >= rStr.getLength() ) - return 0; + return 0; // TODO: this looks like a buggy caller? if( nLen < 0 || nIndex + nLen >= rStr.getLength() ) { @@ -1017,7 +1017,19 @@ long OutputDevice::GetTextArray( const OUString& rStr, long* pDXAry, SalLayout *const pSalLayout = ImplLayout(rStr, nIndex, nLen, Point(0,0), 0, nullptr, SalLayoutFlags::NONE, pLayoutCache); if( !pSalLayout ) + { + // The caller expects this to init the elements of pDXAry. + // Adapting all the callers to check that GetTextArray succeeded seems + // too much work. + // Init here to 0 only in the (rare) error case, so that any missing + // element init in the happy case will still be found by tools, + // and hope that is sufficient. + if (pDXAry) + { + memset(pDXAry, 0, nLen * sizeof(*pDXAry)); + } return 0; + } #if VCL_FLOAT_DEVICE_PIXEL DeviceCoordinate* pDXPixelArray = NULL; if(pDXAry) |