[Libreoffice-commits] core.git: vcl/source

Michael Meeks michael.meeks at collabora.com
Fri Mar 24 11:18:01 UTC 2017


 vcl/source/gdi/print3.cxx |   28 ++++++++++++++++++----------
 1 file changed, 18 insertions(+), 10 deletions(-)

New commits:
commit a298648302b4ba7765816f3fbe4d89c0cfcb3a57
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Thu Mar 23 11:24:22 2017 +0000

    vcl printer: hold a reference on mxPrinter member while operating on it.
    
    Hopefully addresses:
    
    http://crashreport.libreoffice.org/stats/crash_details/7a33b96a-b479-47a4-a006-eb62718128cc
    
    Change-Id: I221c04a6626a39449405387343cdc43e9f02dee1
    Reviewed-on: https://gerrit.libreoffice.org/35587
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>

diff --git a/vcl/source/gdi/print3.cxx b/vcl/source/gdi/print3.cxx
index 63da93c899b2..28ebd80b9473 100644
--- a/vcl/source/gdi/print3.cxx
+++ b/vcl/source/gdi/print3.cxx
@@ -798,14 +798,18 @@ void PrinterController::resetPrinterOptions( bool i_bFileOutput )
 bool PrinterController::setupPrinter( vcl::Window* i_pParent )
 {
     bool bRet = false;
-    if( mpImplData->mxPrinter.get() )
+
+    // Important to hold printer alive while doing setup etc.
+    VclPtr< Printer > xPrinter = mpImplData->mxPrinter;
+
+    if( xPrinter.get() )
     {
-        mpImplData->mxPrinter->Push();
-        mpImplData->mxPrinter->SetMapMode(MapMode(MapUnit::Map100thMM));
+        xPrinter->Push();
+        xPrinter->SetMapMode(MapMode(MapUnit::Map100thMM));
 
         // get current data
-        Size aPaperSize(mpImplData->mxPrinter->GetPaperSize());
-        sal_uInt16 nPaperBin = mpImplData->mxPrinter->GetPaperBin();
+        Size aPaperSize(xPrinter->GetPaperSize());
+        sal_uInt16 nPaperBin = xPrinter->GetPaperBin();
 
         // reset paper size back to last configured size, not
         // whatever happens to be the current page
@@ -817,8 +821,12 @@ bool PrinterController::setupPrinter( vcl::Window* i_pParent )
         }
 
         // call driver setup
-        bRet = mpImplData->mxPrinter->Setup( i_pParent, getPapersizeFromSetup() );
-        Size aNewPaperSize(mpImplData->mxPrinter->GetPaperSize());
+        bRet = xPrinter->Setup( i_pParent, getPapersizeFromSetup() );
+        SAL_WARN_IF(xPrinter != mpImplData->mxPrinter, "vcl.gdi",
+                    "Printer changed underneath us during setup");
+        xPrinter = mpImplData->mxPrinter;
+
+        Size aNewPaperSize(xPrinter->GetPaperSize());
         if (bRet)
         {
             bool bInvalidateCache = false;
@@ -832,7 +840,7 @@ bool PrinterController::setupPrinter( vcl::Window* i_pParent )
             }
 
             // was bin overridden ? if so we need to take action
-            sal_uInt16 nNewPaperBin = mpImplData->mxPrinter->GetPaperBin();
+            sal_uInt16 nNewPaperBin = xPrinter->GetPaperBin();
             if (nNewPaperBin != nPaperBin)
             {
                 mpImplData->mnFixedPaperBin = nNewPaperBin;
@@ -848,9 +856,9 @@ bool PrinterController::setupPrinter( vcl::Window* i_pParent )
         {
             //restore to whatever it was before we entered this method
             if (aPaperSize != aNewPaperSize)
-                mpImplData->mxPrinter->SetPaperSizeUser(aPaperSize, !mpImplData->isFixedPageSize());
+                xPrinter->SetPaperSizeUser(aPaperSize, !mpImplData->isFixedPageSize());
         }
-        mpImplData->mxPrinter->Pop();
+        xPrinter->Pop();
     }
     return bRet;
 }


More information about the Libreoffice-commits mailing list