From dbb14963cf65295597b8e3ab63d836b19ae49fae Mon Sep 17 00:00:00 2001 From: David Tardon Date: Thu, 27 Feb 2014 10:25:22 +0100 Subject: [PATCH] Resolves: rhbz#1057977 do not crash when fonts are updated --- ...77-avoid-use-of-invalidated-pointers.patch | 156 ++++++++++++++++++ libreoffice.spec | 6 +- 2 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 0001-rhbz-1057977-avoid-use-of-invalidated-pointers.patch diff --git a/0001-rhbz-1057977-avoid-use-of-invalidated-pointers.patch b/0001-rhbz-1057977-avoid-use-of-invalidated-pointers.patch new file mode 100644 index 0000000..563d634 --- /dev/null +++ b/0001-rhbz-1057977-avoid-use-of-invalidated-pointers.patch @@ -0,0 +1,156 @@ +From 6b127d40c7d57745bc602d9ff7914392f9d3b92b Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Wed, 5 Feb 2014 10:55:25 +0100 +Subject: [PATCH] rhbz#1057977 avoid use of invalidated pointers + +Change-Id: Ib81f79da696b5e8002f5a2ddcf160903231dc3f1 +--- + include/vcl/outdev.hxx | 6 +++++ + vcl/source/gdi/outdev3.cxx | 59 +++++++++++++++++++++++++++++++++++++++++----- + 2 files changed, 59 insertions(+), 6 deletions(-) + +diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx +index 8a7c439..4223135 100644 +--- a/include/vcl/outdev.hxx ++++ b/include/vcl/outdev.hxx +@@ -537,9 +537,15 @@ protected: + OutputDevice(); + + private: ++ typedef void ( OutputDevice::* FontUpdateHandler_t )( bool ); ++ + SAL_DLLPRIVATE OutputDevice( const OutputDevice& rOutDev ); + SAL_DLLPRIVATE OutputDevice& operator =( const OutputDevice& rOutDev ); + ++ SAL_DLLPRIVATE void ImplClearFontData( bool bNewFontLists ); ++ SAL_DLLPRIVATE void ImplRefreshFontData( bool bNewFontLists ); ++ SAL_DLLPRIVATE static void ImplUpdateFontDataForAllFrames( FontUpdateHandler_t pHdl, bool bNewFontLists ); ++ + public: + virtual ~OutputDevice(); + +diff --git a/vcl/source/gdi/outdev3.cxx b/vcl/source/gdi/outdev3.cxx +index 5c5dcf2..c347f71 100644 +--- a/vcl/source/gdi/outdev3.cxx ++++ b/vcl/source/gdi/outdev3.cxx +@@ -154,7 +154,7 @@ static void ImplRotatePos( long nOriginX, long nOriginY, long& rX, long& rY, + } + } + +-void OutputDevice::ImplUpdateFontData( bool bNewFontLists ) ++void OutputDevice::ImplClearFontData( const bool bNewFontLists ) + { + // the currently selected logical font is no longer needed + if ( mpFontEntry ) +@@ -205,6 +205,38 @@ void OutputDevice::ImplUpdateFontData( bool bNewFontLists ) + delete mpFontList; + if( mpFontCache && mpFontCache != pSVData->maGDIData.mpScreenFontCache ) + delete mpFontCache; ++ mpFontList = 0; ++ mpFontCache = 0; ++ } ++ } ++ } ++ } ++ ++ // also update child windows if needed ++ if ( GetOutDevType() == OUTDEV_WINDOW ) ++ { ++ Window* pChild = ((Window*)this)->mpWindowImpl->mpFirstChild; ++ while ( pChild ) ++ { ++ pChild->ImplClearFontData( true ); ++ pChild = pChild->mpWindowImpl->mpNext; ++ } ++ } ++} ++ ++void OutputDevice::ImplRefreshFontData( const bool bNewFontLists ) ++{ ++// if ( GetOutDevType() == OUTDEV_PRINTER || mpPDFWriter ) ++ { ++ ImplSVData* pSVData = ImplGetSVData(); ++ ++ if ( bNewFontLists ) ++ { ++ // we need a graphics ++ if ( ImplGetGraphics() ) ++ { ++ if( mpPDFWriter ) ++ { + mpFontList = pSVData->maGDIData.mpScreenFontList->Clone( true, true ); + mpFontCache = new ImplFontCache(); + } +@@ -222,16 +254,24 @@ void OutputDevice::ImplUpdateFontData( bool bNewFontLists ) + Window* pChild = ((Window*)this)->mpWindowImpl->mpFirstChild; + while ( pChild ) + { +- pChild->ImplUpdateFontData( true ); ++ pChild->ImplRefreshFontData( true ); + pChild = pChild->mpWindowImpl->mpNext; + } + } + } + ++void OutputDevice::ImplUpdateFontData( bool bNewFontLists ) ++{ ++ ImplClearFontData( bNewFontLists ); ++ ImplRefreshFontData( bNewFontLists ); ++} ++ + void OutputDevice::ImplUpdateAllFontData( bool bNewFontLists ) + { + ImplSVData* pSVData = ImplGetSVData(); + ++ ImplUpdateFontDataForAllFrames( &OutputDevice::ImplClearFontData, bNewFontLists ); ++ + // clear global font lists to have them updated + pSVData->maGDIData.mpScreenFontCache->Invalidate(); + if ( bNewFontLists ) +@@ -250,16 +290,23 @@ void OutputDevice::ImplUpdateAllFontData( bool bNewFontLists ) + } + } + ++ ImplUpdateFontDataForAllFrames( &OutputDevice::ImplRefreshFontData, bNewFontLists ); ++} ++ ++void OutputDevice::ImplUpdateFontDataForAllFrames( const FontUpdateHandler_t pHdl, const bool bNewFontLists ) ++{ ++ ImplSVData* const pSVData = ImplGetSVData(); ++ + // update all windows + Window* pFrame = pSVData->maWinData.mpFirstFrame; + while ( pFrame ) + { +- pFrame->ImplUpdateFontData( bNewFontLists ); ++ ( pFrame->*pHdl )( bNewFontLists ); + + Window* pSysWin = pFrame->mpWindowImpl->mpFrameData->mpFirstOverlap; + while ( pSysWin ) + { +- pSysWin->ImplUpdateFontData( bNewFontLists ); ++ ( pSysWin->*pHdl )( bNewFontLists ); + pSysWin = pSysWin->mpWindowImpl->mpNextOverlap; + } + +@@ -270,7 +317,7 @@ void OutputDevice::ImplUpdateAllFontData( bool bNewFontLists ) + VirtualDevice* pVirDev = pSVData->maGDIData.mpFirstVirDev; + while ( pVirDev ) + { +- pVirDev->ImplUpdateFontData( bNewFontLists ); ++ ( pVirDev->*pHdl )( bNewFontLists ); + pVirDev = pVirDev->mpNext; + } + +@@ -278,7 +325,7 @@ void OutputDevice::ImplUpdateAllFontData( bool bNewFontLists ) + Printer* pPrinter = pSVData->maGDIData.mpFirstPrinter; + while ( pPrinter ) + { +- pPrinter->ImplUpdateFontData( bNewFontLists ); ++ ( pPrinter->*pHdl )( bNewFontLists ); + pPrinter = pPrinter->mpNext; + } + } +-- +1.8.5.3 + diff --git a/libreoffice.spec b/libreoffice.spec index 4a5713d..873a163 100644 --- a/libreoffice.spec +++ b/libreoffice.spec @@ -43,7 +43,7 @@ Summary: Free Software Productivity Suite Name: libreoffice Epoch: 1 Version: %{libo_version}.1 -Release: 2%{?libo_prerelease}%{?dist} +Release: 3%{?libo_prerelease}%{?dist} License: (MPLv1.1 or LGPLv3+) and LGPLv3 and LGPLv2+ and BSD and (MPLv1.1 or GPLv2 or LGPLv2 or Netscape) and Public Domain and ASL 2.0 and Artistic and MPLv2.0 Group: Applications/Productivity URL: http://www.libreoffice.org/default/ @@ -279,6 +279,7 @@ Patch16: 0001-never-run-autogen.sh.patch Patch17: 0001-Related-rhbz-1065807-rework-i66157-for-multiple-writ.patch Patch18: 0001-Resolves-rhbz-1065807-use-xdg-Templates-for-default-.patch Patch19: 0001-explictly-list-common-lang-independant-template-dir.patch +Patch20: 0001-rhbz-1057977-avoid-use-of-invalidated-pointers.patch %define instdir %{_libdir} %define baseinstdir %{instdir}/libreoffice @@ -2174,6 +2175,9 @@ update-desktop-database %{_datadir}/applications &> /dev/null || : %endif %changelog +* Thu Feb 27 2014 David Tardon - 1:4.2.1.1-3 +- Resolves: rhbz#1057977 do not crash when fonts are updated + * Tue Feb 25 2014 Caolán McNamara - 1:4.2.1.1-2 - Resolves: rhbz#1065807 search XDG defined "Templates" dir