vcl/generic/glyphs/gcach_layout.cxx |   13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

New commits:
commit 81db9e3abd84e13e1597b43680ec865e1e9f64e0
Author: Eike Rathke <er...@redhat.com>
Date:   Fri May 3 00:19:59 2013 +0200

    adapt to ICU patch https://ssl.icu-project.org/trac/ticket/10107
    
    do not call LayoutEngine::reset()
    
    Calling reset() disposes everything the LayoutEngine knows in its
    current state. While this may have prevented some obscure crash during
    exit in the past (call was added 2003-03-27), it definitely leads to a
    crash if the updated LayoutEngine "patch"
    http://download.icu-project.org/files/icu4c/51.1/icu-51-layout-fix-10107.tgz
    is applied as that sets fGlyphStorage=NULL (it doesn't delete
    LEGlyphStorage though and thus may leak, but that patch is in the wild
    now) and a later call to mpIcuLE->layoutChars() tries to access
    fGlyphStorage->...() if mpIcuLE is reused.
    
    For the patch mentioned see
    http://site.icu-project.org/download/51#TOC-Known-Issues and
    http://bugs.icu-project.org/trac/ticket/10107
    
    Change-Id: I1b8f5c446c174d7d12b896b3ecd2a266645e8abc
    (cherry picked from commit 7de7267f4cfcb455aabb09053c7ed681d4591867)
    
    implemented IcuFontFromServerFont::getFontTable(LETag,size_t&)
    
    so that ICU versions trying to call
    LEFontInstance::getFontTable(LETag,size_t&) actually call it instead of
    IcuFontFromServerFont::getFontTable(LETag)
    
    See http://site.icu-project.org/download/51#TOC-Known-Issues
    "NOTE: Applications must implement LEFontInstance::getFontTable(LETag,
    size_t &length)  in their LEFontInstance subclasses, so that ICU can
    properly bounds-check font tables."
    
    See also https://ssl.icu-project.org/trac/ticket/10107
    
    (cherry picked from commit 428bde3591ff2fd2195097040dbe1480f1f4210f)
    
    Conflicts:
        vcl/generic/glyphs/gcach_layout.cxx
    
    Change-Id: Ic20b7e8dda4e84734eb6de0ccba82b0dea481d55
    Reviewed-on: https://gerrit.libreoffice.org/3756
    Reviewed-by: Fridrich Strba <fridr...@documentfoundation.org>
    Tested-by: Fridrich Strba <fridr...@documentfoundation.org>

diff --git a/vcl/generic/glyphs/gcach_layout.cxx 
b/vcl/generic/glyphs/gcach_layout.cxx
index ef03aa3..32f0887 100644
--- a/vcl/generic/glyphs/gcach_layout.cxx
+++ b/vcl/generic/glyphs/gcach_layout.cxx
@@ -200,6 +200,7 @@ public:
                             : mrServerFont( rFont )
                             {}
 
+    virtual const void*     getFontTable(LETag tableTag, size_t &length) const;
     virtual const void*     getFontTable(LETag tableTag) const;
     virtual le_int32        getUnitsPerEM() const;
     virtual float           getXPixelsPerEm() const;
@@ -220,7 +221,7 @@ public:
 
 // -----------------------------------------------------------------------
 
-const void* IcuFontFromServerFont::getFontTable( LETag nICUTableTag ) const
+const void* IcuFontFromServerFont::getFontTable( LETag nICUTableTag, size_t & 
rLength ) const
 {
     char pTagName[5];
     pTagName[0] = (char)(nICUTableTag >> 24);
@@ -229,8 +230,9 @@ const void* IcuFontFromServerFont::getFontTable( LETag 
nICUTableTag ) const
     pTagName[3] = (char)(nICUTableTag);
     pTagName[4] = 0;
 
-    sal_uLong nLength;
+    sal_uLong nLength = 0;
     const unsigned char* pBuffer = mrServerFont.GetTable( pTagName, &nLength );
+    rLength = static_cast<size_t>(nLength);
 #ifdef VERBOSE_DEBUG
     fprintf(stderr,"IcuGetTable(\"%s\") => %p\n", pTagName, pBuffer);
     int mnHeight = mrServerFont.GetFontSelData().mnHeight;
@@ -240,6 +242,12 @@ const void* IcuFontFromServerFont::getFontTable( LETag 
nICUTableTag ) const
     return (const void*)pBuffer;
 }
 
+const void* IcuFontFromServerFont::getFontTable( LETag nICUTableTag ) const
+{
+    size_t nLength = 0;
+    return getFontTable( nICUTableTag, nLength);
+}
+
 // -----------------------------------------------------------------------
 
 le_int32 IcuFontFromServerFont::getUnitsPerEM() const
@@ -475,7 +483,6 @@ bool IcuLayoutEngine::operator()( ServerFontLayout& 
rLayout, ImplLayoutArgs& rAr
         mpIcuLE->getGlyphs( pIcuGlyphs, rcIcu );
         mpIcuLE->getCharIndices( pCharIndices, rcIcu );
         mpIcuLE->getGlyphPositions( &pGlyphPositions->fX, rcIcu );
-        mpIcuLE->reset(); // TODO: get rid of this, PROBLEM: crash at exit 
when removed
         if( LE_FAILURE(rcIcu) )
             return false;
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to