[Libreoffice-commits] .: Branch 'libreoffice-3-6' - vcl/source

Michael Stahl mst at kemper.freedesktop.org
Mon Jul 23 08:51:48 PDT 2012


 vcl/source/components/rasterizer_rsvg.cxx |   17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

New commits:
commit cd878743c11d977ec1c336918d795180983972e5
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Mon Jul 23 13:59:12 2012 +0100

    Resolves: fdo#50975 rsvg_handle_new_from_data calls rsvg_handle_close
    
    rsvg_handle_new_from_data calls rsvg_handle_fill_with_data which itself calls
    rsvg_handle_close on success, so we don't have to.
    
    And older versions of librsvg (e.g. 2.16.1) don't protect against
    rsvg_handle_close getting called twice, although new versions do,
    so we crash on e.g. RHEL-5
    
    Change-Id: I451075e50c9c2c7b07289356d7a92eb55db82f9f
    (cherry picked from commit 682cb83ed59233decbeeaff68c4d871442b58bb1)
    
    Signed-off-by: Michael Stahl <mstahl at redhat.com>

diff --git a/vcl/source/components/rasterizer_rsvg.cxx b/vcl/source/components/rasterizer_rsvg.cxx
index 00940c2..f5a7f57 100644
--- a/vcl/source/components/rasterizer_rsvg.cxx
+++ b/vcl/source/components/rasterizer_rsvg.cxx
@@ -117,7 +117,6 @@ public:
     // LibRSVG
     void rsvg_init() { (*mp_rsvg_init)(); }
     RsvgHandle* rsvg_handle_new_from_data( const guint8* data, gsize size, GError** error) { return( (*mp_rsvg_handle_new_from_data)( data, size, error ) ); }
-    gboolean rsvg_handle_close( RsvgHandle* handle, GError** error ) { return( (*mp_rsvg_handle_close)( handle, error ) ); }
     void rsvg_handle_set_dpi_x_y( RsvgHandle* handle, double dpix, double dpiy ) { (*mp_rsvg_handle_set_dpi_x_y)( handle, dpix, dpiy ); }
     void rsvg_handle_get_dimensions( RsvgHandle* handle, RsvgDimensionData* dimensions ) { (*mp_rsvg_handle_get_dimensions)( handle, dimensions ); }
     gboolean rsvg_handle_render_cairo( RsvgHandle* handle, cairo_t* cairo ) { return( (*mp_rsvg_handle_render_cairo)( handle, cairo ) ); }
@@ -137,7 +136,6 @@ private:
     // LibRSVG
     void (*mp_rsvg_init)( void );
     RsvgHandle* (*mp_rsvg_handle_new_from_data)( const guint8*, gsize, GError** );
-    gboolean (*mp_rsvg_handle_close)( RsvgHandle*, GError** );
     void (*mp_rsvg_handle_set_dpi_x_y)( RsvgHandle*, double, double );
     void (*mp_rsvg_handle_get_dimensions)( RsvgHandle*, RsvgDimensionData* );
     gboolean (*mp_rsvg_handle_render_cairo)( RsvgHandle*, cairo_t* );
@@ -189,14 +187,12 @@ LibraryWrapper::LibraryWrapper() :
     {
         mp_rsvg_init = ( void (*)( void ) ) osl_getAsciiFunctionSymbol( mpRSVGLib, "rsvg_init" );
         mp_rsvg_handle_new_from_data = ( RsvgHandle* (*)( const guint8*, gsize, GError** ) ) osl_getAsciiFunctionSymbol( mpRSVGLib, "rsvg_handle_new_from_data" );
-        mp_rsvg_handle_close = ( gboolean (*)( RsvgHandle*, GError** ) ) osl_getAsciiFunctionSymbol( mpRSVGLib, "rsvg_handle_close" );
         mp_rsvg_handle_set_dpi_x_y = ( void (*)( RsvgHandle*, double, double ) ) osl_getAsciiFunctionSymbol( mpRSVGLib, "rsvg_handle_set_dpi_x_y" );
         mp_rsvg_handle_get_dimensions = ( void (*)( RsvgHandle*, RsvgDimensionData* ) ) osl_getAsciiFunctionSymbol( mpRSVGLib, "rsvg_handle_get_dimensions" );
         mp_rsvg_handle_render_cairo = ( gboolean (*)( RsvgHandle*, cairo_t* ) ) osl_getAsciiFunctionSymbol( mpRSVGLib, "rsvg_handle_render_cairo" );
 
         if( !( mp_rsvg_init &&
                mp_rsvg_handle_new_from_data &&
-               mp_rsvg_handle_close &&
                mp_rsvg_handle_set_dpi_x_y &&
                mp_rsvg_handle_get_dimensions &&
                mp_rsvg_handle_render_cairo ) )
@@ -415,12 +411,15 @@ uno::Reference< graphic::XGraphic > Rasterizer::implGetXGraphicFromSurface( cair
         }
         while( nReadSize == nBlockSize );
 
-        if( aDataBuffer.size() &&
-            ( NULL != ( mpRsvgHandle = rLib.rsvg_handle_new_from_data( reinterpret_cast< sal_uInt8* >( &aDataBuffer[ 0 ] ),
-                                                                       aDataBuffer.size(), NULL ) ) ) &&
-            !rLib.rsvg_handle_close( mpRsvgHandle, NULL ) )
+        if (aDataBuffer.size())
         {
-            implFreeRsvgHandle();
+            //See: fdo#50975 rsvg_handle_new_from_data calls
+            //rsvg_handle_fill_with_data which itself calls rsvg_handle_close
+            //on success.  Older versions of librsvg (e.g. 2.16.1) don't
+            //protect against rsvg_handle_close getting called twice, so we
+            //shouldn't additionally call svg_handle_close here.
+            mpRsvgHandle = rLib.rsvg_handle_new_from_data( reinterpret_cast< sal_uInt8* >( &aDataBuffer[ 0 ] ),
+                                                                       aDataBuffer.size(), NULL );
         }
     }
 


More information about the Libreoffice-commits mailing list