A WebProcess crash issue by confusion of widget handle after DynamicBox re-installation.
authorTae-Jeong Lee <taejeong.lee@samsung.com>
Thu, 10 Oct 2013 12:01:14 +0000 (21:01 +0900)
committerTae-Jeong Lee <taejeong.lee@samsung.com>
Thu, 10 Oct 2013 13:48:07 +0000 (22:48 +0900)
[Issue#]   PLM-131009-03049
[Problem]  Make a DynamicBox is located in homescreen and if try to update its package by
           re-installation, a WebProcess crash occurs.
[Cause]    When a DynamicBox is updated, web-provider re-uses WebProcess which was used by
           previous one. So then the widget handle is updated, but plugin-logic couldn't know that.
           Because wrt plugin-logic was not been considered about such reuse case.
           So, there was a problem on accessing widget handle which is internal variable of singleton.
[Solution] Fixed the wrt plugin-logic to update internal variable of singleton properly even in that case.

Change-Id: I0ecde7906b941778ee9027914d7a695aad59c036

src/Commons/WrtAccess/WrtAccess.cpp
src/plugin-loading/plugin_container_support.cpp
src/plugin-loading/plugin_container_support.h
src/plugin-loading/plugin_logic.cpp

index 128dbf5..766ca44 100644 (file)
@@ -146,12 +146,13 @@ void WrtAccess::initialize(int widgetId)
         Throw(Exception);
     }
 
+    m_widgetId = widgetId;
+
     if (!m_pluginOwners++) {
         DPL::Log::LogSystemSingleton::Instance().SetTag("SECURITY_DAEMON");
         ace_return_t ret = ace_client_initialize(Wrt::Popup::run_popup);
         DPL::Log::LogSystemSingleton::Instance().SetTag("WRT_PLUGINS");
         Assert(ACE_OK == ret);
-        m_widgetId = widgetId;
     }
 }
 
index 1a8868f..064e8a4 100644 (file)
@@ -32,7 +32,9 @@
 
 #include <dpl/wrt-dao-ro/widget_dao_read_only.h>
 
-PluginContainerSupport::PluginContainerSupport() : m_initialized(false)
+PluginContainerSupport::PluginContainerSupport() :
+    m_initialized(false),
+    m_widgetHandle(0)
 {
      // Reading root plugins list from so files
     readRootPluginsList();
@@ -49,7 +51,18 @@ PluginContainerSupport::~PluginContainerSupport()
 
 void PluginContainerSupport::Initialize(int widgetHandle)
 {
+    if (isInitialized() == true && m_widgetHandle != widgetHandle) {
+        // re-initialize required
+        m_initialized = false;
+
+        m_pluginModels.clear();
+        m_featureModels.clear();
+    }
+
     if (isInitialized() == false) {
+        m_initialized = true;
+        m_widgetHandle = widgetHandle;
+
         readAllowedPlugins(widgetHandle);
         readRootPlugins(widgetHandle);
     }
@@ -96,8 +109,6 @@ void PluginContainerSupport::readAllowedPlugins(int widgetHandle)
         registerPluginModel(dt->pluginHandle);
         registerFeatureModel(data->first, dt, deviceCapabilities);
     }
-
-    m_initialized = true;
 }
 
 void PluginContainerSupport::readRootPlugins(int widgetHandle)
@@ -113,7 +124,6 @@ void PluginContainerSupport::readRootPlugins(int widgetHandle)
     } else {
         _D("Not defined app type");
     }
-    m_initialized = true;
 }
 
 void PluginContainerSupport::registerFeatureModel(
index 1f0b2aa..dbdf6c5 100644 (file)
@@ -54,6 +54,8 @@ class PluginContainerSupport
 
     bool m_initialized;
 
+    int m_widgetHandle;
+
   private:
     // Reading
      void readRootPluginsList();
@@ -76,6 +78,10 @@ class PluginContainerSupport
     {
         return m_initialized;
     }
+    bool isInitialized(int widgetHandle)
+    {
+        return (m_initialized && m_widgetHandle == widgetHandle);
+    }
     void Initialize(int widgetHandle);
     void registerPluginModel(WrtDB::DbPluginHandle handle);
     std::list<std::string> getAllowedFeatures(int widgetHandle) const;
index d3df0da..8458501 100644 (file)
@@ -286,7 +286,7 @@ void PluginLogic::Impl::startSession(int widgetHandle,
 {
     _D("========== start session START ==========");
 
-    if (!m_pluginsSupport->isInitialized()) {
+    if (!m_pluginsSupport->isInitialized(widgetHandle)) {
         m_pluginsSupport->Initialize(widgetHandle);
     }
     auto sessionIt = m_sessions.find(context);