[Libreoffice-commits] core.git: desktop/source sfx2/source

Miklos Vajna vmiklos at collabora.co.uk
Thu Sep 1 10:01:32 UTC 2016


 desktop/source/lib/init.cxx    |   19 +++++++++++++++----
 sfx2/source/view/lokhelper.cxx |    4 ++++
 2 files changed, 19 insertions(+), 4 deletions(-)

New commits:
commit f96fa389f950dd97bd213402fb5ea6eb114f9ab7
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu Sep 1 10:04:24 2016 +0200

    sfx2: nullptr pViewShell was seen in SfxLokHelper::getView()
    
    I'm not sure how to trigger this reliably, but Pranav got this:
    
    	#0  0x00007fb2f471bbf0 in SfxLokHelper::getView(SfxViewShell*) (pViewShell=0x0) at sfx2/source/view/lokhelper.cxx:82
    	#1  0x00007fb2f75edf4f in doc_paintPartTile(LibreOfficeKitDocument*, unsigned char*, int, int, int, int, int, int, int) (pThis=0x7fb290253c40, pBuffer=0x281fbd0 "", nPart=0, nCanvasWidth=1024, nCanvasHeight=256, nTilePosX=0, nTilePosY=11520, nTileWidth=15360, nTileHeight=3840) at desktop/source/lib/init.cxx:1338
    
    Given that SfxViewShell::Current() may indeed return nullptr (e.g.
    during shutdown), change SfxLokHelper::getView() to return -1 in that
    case, and adapt client code to handle that.
    
    Change-Id: Ia191c843c8a993f3d7157de432af57964c0a8f63
    Reviewed-on: https://gerrit.libreoffice.org/28583
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    Tested-by: Jenkins <ci at libreoffice.org>

diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index f4f4622..5f7ac7a 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -1365,7 +1365,10 @@ static void doc_paintPartTile(LibreOfficeKitDocument* pThis,
 
     // Disable callbacks while we are painting.
     LibLODocument_Impl* pDocument = static_cast<LibLODocument_Impl*>(pThis);
-    std::size_t nView = SfxLokHelper::getView();
+    int nView = SfxLokHelper::getView();
+    if (nView < 0)
+        return;
+
     pDocument->mpCallbackFlushHandlers[nView]->setPartTilePainting(true);
     try
     {
@@ -1438,7 +1441,10 @@ static void doc_registerCallback(LibreOfficeKitDocument* pThis,
     SolarMutexGuard aGuard;
     LibLODocument_Impl* pDocument = static_cast<LibLODocument_Impl*>(pThis);
 
-    std::size_t nView = SfxLokHelper::getView();
+    int nView = SfxLokHelper::getView();
+    if (nView < 0)
+        return;
+
     pDocument->mpCallbackFlushHandlers[nView].reset(new CallbackFlushHandler(pThis, pCallback, pData));
 
     if (SfxViewShell* pViewShell = SfxViewFrame::Current()->GetViewShell())
@@ -1507,7 +1513,9 @@ static void doc_postUnoCommand(LibreOfficeKitDocument* pThis, const char* pComma
     LibLODocument_Impl* pDocument = static_cast<LibLODocument_Impl*>(pThis);
 
     std::vector<beans::PropertyValue> aPropertyValuesVector(jsonToPropertyValuesVector(pArguments));
-    std::size_t nView = SfxLokHelper::getView();
+    int nView = SfxLokHelper::getView();
+    if (nView < 0)
+        return;
 
     // handle potential interaction
     if (gImpl && aCommand == ".uno:Save")
@@ -1593,7 +1601,10 @@ static void doc_postMouseEvent(LibreOfficeKitDocument* pThis, int nType, int nX,
     }
 
     LibLODocument_Impl* pLib = static_cast<LibLODocument_Impl*>(pThis);
-    std::size_t nView = SfxLokHelper::getView();
+    int nView = SfxLokHelper::getView();
+    if (nView < 0)
+        return;
+
     if (pLib->mpCallbackFlushHandlers[nView])
     {
         pLib->mpCallbackFlushHandlers[nView]->queue(LOK_CALLBACK_MOUSE_POINTER, aPointerString.getStr());
diff --git a/sfx2/source/view/lokhelper.cxx b/sfx2/source/view/lokhelper.cxx
index c5fb171..8225474 100644
--- a/sfx2/source/view/lokhelper.cxx
+++ b/sfx2/source/view/lokhelper.cxx
@@ -83,6 +83,10 @@ int SfxLokHelper::getView(SfxViewShell* pViewShell)
 {
     if (!pViewShell)
         pViewShell = SfxViewShell::Current();
+    // Still no valid view shell? Then no idea.
+    if (!pViewShell)
+        return -1;
+
     return pViewShell->GetViewShellId();
 }
 


More information about the Libreoffice-commits mailing list