[Libreoffice-commits] online.git: kit/Kit.cpp

Ashod Nakashian ashod.nakashian at collabora.co.uk
Mon Jan 2 05:55:28 UTC 2017


 kit/Kit.cpp |   30 ++++++++++++++++++------------
 1 file changed, 18 insertions(+), 12 deletions(-)

New commits:
commit 9d49e1595dddde7711ea281cd6d063c5b9bf08dd
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Fri Dec 23 15:42:15 2016 -0500

    wsd: check session before releasing lock
    
    By the time load() is invoked, _mutex is already
    unlocked in onLoad(), so it is no longer safe
    to access _sessions.
    
    So we need to get the session and pass it to load.
    
    Change-Id: I671647f6df4128b8595082af2355fbef33994cdd
    Reviewed-on: https://gerrit.libreoffice.org/32601
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/kit/Kit.cpp b/kit/Kit.cpp
index edf03c9..f40b56c 100644
--- a/kit/Kit.cpp
+++ b/kit/Kit.cpp
@@ -896,13 +896,23 @@ private:
             _cvLoading.wait(lock);
         }
 
+        // This shouldn't happen, but for sanity.
+        const auto it = _sessions.find(sessionId);
+        if (it == _sessions.end() || !it->second)
+        {
+            LOG_ERR("Cannot find session [" << sessionId << "] to load view for.");
+            return false;
+        }
+
+        auto session = it->second;
+
         // Flag and release lock.
         ++_isLoading;
         lock.unlock();
 
         try
         {
-            load(sessionId, uri, userName, docPassword, renderOpts, haveDocPassword);
+            load(session, uri, userName, docPassword, renderOpts, haveDocPassword);
             if (!_loKitDocument || !_loKitDocument->get())
             {
                 return false;
@@ -915,9 +925,12 @@ private:
             return false;
         }
 
+        // Retake the lock (technically, not needed).
+        lock.lock();
+
         // Done loading, let the next one in (if any).
         LOG_CHECK_RET(_loKitDocument && _loKitDocument->get() && "Uninitialized lok::Document instance", false);
-        lock.lock();
+
         --_isLoading;
         _cvLoading.notify_one();
 
@@ -1087,22 +1100,15 @@ private:
         return viewColors;
     }
 
-    std::shared_ptr<lok::Document> load(const std::string& sessionId,
+    std::shared_ptr<lok::Document> load(const std::shared_ptr<ChildSession>& session,
                                         const std::string& uri,
                                         const std::string& userName,
                                         const std::string& docPassword,
                                         const std::string& renderOpts,
                                         const bool haveDocPassword)
     {
-        const auto it = _sessions.find(sessionId);
-        if (it == _sessions.end() || !it->second)
-        {
-            LOG_ERR("Cannot find session [" << sessionId << "].");
-            return nullptr;
-        }
+        const std::string sessionId = session->getId();
 
-        auto session = it->second;
-        int viewId = 0;
         std::unique_lock<std::mutex> lockLokDoc;
 
         if (!_loKitDocument)
@@ -1222,7 +1228,7 @@ private:
         // registerCallback(), as the previous creates a new view in Impress.
         _loKitDocument->initializeForRendering(ossRenderOpts.str().c_str());
 
-        viewId = _loKitDocument->getView();
+        const int viewId = _loKitDocument->getView();
         session->setViewId(viewId);
         _viewIdToCallbackDescr.emplace(viewId,
                                        std::unique_ptr<CallbackDescriptor>(new CallbackDescriptor({ this, viewId })));


More information about the Libreoffice-commits mailing list