Add OOM exception handler 41/143641/1 submit/tizen_3.0/20170811.063413
authorSeungha Son <seungha.son@samsung.com>
Tue, 8 Aug 2017 04:50:26 +0000 (13:50 +0900)
committerSeungha Son <seungha.son@samsung.com>
Thu, 10 Aug 2017 23:33:26 +0000 (08:33 +0900)
Signed-off-by: Seungha Son <seungha.son@samsung.com>
Change-Id: Ic86db1a8e8e713effe6af78bf1979e382e3c9071

src/wgt/step/configuration/step_parse.cc
src/wgt/step/filesystem/step_wgt_patch_icons.cc
src/wgt/step/security/step_add_default_privileges.cc
src/wgt/step/security/step_check_extension_privileges.cc
src/wgt/step/security/step_check_wgt_ime_privilege.cc

index b68a733..705c616 100644 (file)
@@ -64,11 +64,27 @@ const char kTTSCategoryName[] = "http://tizen.org/category/tts";
 const char kResWgt[] = "res/wgt";
 const char kConfigFileName[] = "config.xml";
 
+void FreeMetadataList(gpointer data)
+{
+  metadata_x* metadata = reinterpret_cast<metadata_x*>(data);
+  if (metadata) {
+    if (metadata->key)
+      free(const_cast<char*>(metadata->key));
+    if (metadata->value)
+      free(const_cast<char*>(metadata->value));
+    free(metadata);
+  }
+}
+
 GList* GenerateMetadataListX(const wgt::parse::MetaDataInfo& meta_info) {
   GList* list = nullptr;
   for (auto& meta : meta_info.metadata()) {
     metadata_x* new_meta =
         static_cast<metadata_x*>(calloc(1, sizeof(metadata_x)));
+    if (!new_meta) {
+      g_list_free_full(list, &FreeMetadataList);
+      return nullptr;
+    }
     new_meta->key = strdup(meta.first.c_str());
     if (!meta.second.empty())
       new_meta->value = strdup(meta.second.c_str());
@@ -83,6 +99,8 @@ void AppendWidgetMetadata(GList** metadatas,
   for (auto& meta : metadata) {
     metadata_x* new_meta =
         static_cast<metadata_x*>(calloc(1, sizeof(metadata_x)));
+    if (!new_meta)
+      return nullptr;
     new_meta->key = strdup(meta.first.c_str());
     if (!meta.second.empty())
       new_meta->value = strdup(meta.second.c_str());
@@ -113,6 +131,8 @@ template<typename T>
 void AppendLabel(T* root, const std::string& label,
                  const std::string& locale) {
   label_x* label_item = reinterpret_cast<label_x*>(calloc(1, sizeof(label_x)));
+  if (!label_item)
+    return;
   label_item->name = strdup(label.c_str());
   label_item->text = strdup(label.c_str());
   label_item->lang = !locale.empty() ?
@@ -188,6 +208,8 @@ bool StepParse::FillIconPaths(manifest_x* manifest) {
     found_locales.insert(locale);
 
     icon_x* icon = reinterpret_cast<icon_x*>(calloc(1, sizeof(icon_x)));
+    if (!icon)
+      return false;
     bf::path icon_path = context_->root_application_path.get()
         / app_info->package() / "res" / "wgt" / application_icon.path();
     icon->text = strdup(icon_path.c_str());
@@ -218,6 +240,8 @@ bool StepParse::FillWidgetInfo(manifest_x* manifest) {
   for (auto& item : wgt_info->description_set()) {
     description_x* description = reinterpret_cast<description_x*>
         (calloc(1, sizeof(description_x)));
+    if (!description)
+      return false;
     description->text = strdup(item.second.c_str());
     description->lang = !item.first.empty() ?
         strdup(item.first.c_str()) : strdup(DEFAULT_LOCALE);
@@ -241,6 +265,8 @@ bool StepParse::FillWidgetInfo(manifest_x* manifest) {
   }
 
   author_x* author = reinterpret_cast<author_x*>(calloc(1, sizeof(author_x)));
+  if (!author)
+    return false;
   if (!wgt_info->author().empty())
     author->text = strdup(wgt_info->author().c_str());
   if (!wgt_info->author_email().empty())
@@ -329,6 +355,8 @@ bool StepParse::FillMainApplicationInfo(manifest_x* manifest) {
   // application data
   application_x* application = reinterpret_cast<application_x*>(
       calloc(1, sizeof(application_x)));
+  if (!application)
+    return false;
   application->component_type =
       has_watch_category ? strdup("watchapp") : strdup("uiapp");
   application->mainapp = strdup("true");
@@ -364,6 +392,8 @@ bool StepParse::FillMainApplicationInfo(manifest_x* manifest) {
   application->launch_mode = strdup(app_info->launch_mode().c_str());
   for (auto& icon : GListRange<icon_x*>(manifest->icon)) {
     icon_x* app_icon = reinterpret_cast<icon_x*>(calloc(1, sizeof(icon_x)));
+    if (!app_icon)
+      return false;
     app_icon->text = strdup(icon->text);
     app_icon->lang = strdup(icon->lang);
     application->icon = g_list_append(application->icon, app_icon);
@@ -385,6 +415,8 @@ bool StepParse::FillServiceApplicationInfo(manifest_x* manifest) {
   for (auto& service_info : service_list->services) {
     application_x* application = reinterpret_cast<application_x*>
         (calloc(1, sizeof(application_x)));
+    if (!application)
+      return false;
     application->component_type = strdup("svcapp");
     application->mainapp = strdup("false");
     application->appid = strdup(service_info.id().c_str());
@@ -410,6 +442,8 @@ bool StepParse::FillServiceApplicationInfo(manifest_x* manifest) {
       bf::path icon_path = context_->root_application_path.get()
           / manifest->package / "res" / "wgt" / service_info.icon();
       icon_x* icon = reinterpret_cast<icon_x*>(calloc(1, sizeof(icon_x)));
+      if (!icon)
+        return false;
       icon->text = strdup(icon_path.c_str());
       icon->lang = strdup(DEFAULT_LOCALE);
       application->icon = g_list_append(application->icon, icon);
@@ -423,6 +457,8 @@ bool StepParse::FillServiceApplicationInfo(manifest_x* manifest) {
     for (auto& pair : service_info.metadata_set()) {
       metadata_x* item = reinterpret_cast<metadata_x*>(
           calloc(1, sizeof(metadata_x)));
+      if (!item)
+        return false;
       item->key = strdup(pair.first.c_str());
       if (!pair.second.empty())
         item->value = strdup(pair.second.c_str());
@@ -443,6 +479,8 @@ bool StepParse::FillWidgetApplicationInfo(manifest_x* manifest) {
   for (auto& app_widget : appwidget_info->app_widgets()) {
     application_x* application = reinterpret_cast<application_x*>
         (calloc(1, sizeof(application_x)));
+    if (!application)
+      return false;
     application->component_type = strdup("widgetapp");
     application->mainapp = strdup("false");
     application->appid = strdup(app_widget.id.c_str());
@@ -466,6 +504,8 @@ bool StepParse::FillWidgetApplicationInfo(manifest_x* manifest) {
 
     if (!app_widget.icon_src.empty()) {
       icon_x* icon = reinterpret_cast<icon_x*>(calloc(1, sizeof(icon_x)));
+      if (!icon)
+        return false;
       icon->text = strdup(app_widget.icon_src.c_str());
       icon->lang = strdup(DEFAULT_LOCALE);
       application->icon = g_list_append(application->icon, icon);
@@ -512,6 +552,8 @@ bool StepParse::FillAppControl(manifest_x* manifest) {
     for (const auto& control : app_info_list->controls) {
       appcontrol_x* app_control =
           static_cast<appcontrol_x*>(calloc(1, sizeof(appcontrol_x)));
+      if (!app_control)
+        return false;
       app_control->operation = strdup(control.operation().c_str());
       app_control->mime = strdup(control.mime().c_str());
       app_control->uri = strdup(control.uri().c_str());
@@ -532,6 +574,8 @@ bool StepParse::FillPrivileges(manifest_x* manifest) {
   for (auto& priv : privileges) {
     privilege_x* privilege =
         reinterpret_cast<privilege_x*>(calloc(1, sizeof(privilege_x)));
+    if (!privilege)
+      return false;
     privilege->type = strdup(common_installer::kWebPrivilegeType);
     privilege->value = strdup(priv.c_str());
     manifest->privileges = g_list_append(manifest->privileges, privilege);
@@ -729,6 +773,8 @@ common_installer::Step::Status StepParse::process() {
 
   manifest_x* manifest =
       static_cast<manifest_x*>(calloc(1, sizeof(manifest_x)));
+  if (!manifest)
+    return common_installer::Step::Status::ERROR;
   if (!FillManifestX(manifest)) {
     LOG(ERROR) << "[Parse] Storing manifest_x failed. "
                <<  parser_->GetErrorMessage();
index 9eaa321..8bc647f 100644 (file)
@@ -83,6 +83,8 @@ common_installer::Step::Status StepWgtPatchIcons::process() {
         return Status::ICON_ERROR;
       }
       icon_x* icon = reinterpret_cast<icon_x*>(calloc(1, sizeof(icon_x)));
+      if (!icon)
+        return Status::ICON_ERROR;
       icon->text = strdup(icon_path.c_str());
       icon->lang = strdup(DEFAULT_LOCALE);
       app->icon = g_list_append(app->icon, icon);
index 47098d3..17d83a6 100644 (file)
@@ -26,8 +26,18 @@ common_installer::Step::Status StepAddDefaultPrivileges::process() {
   manifest_x* m = context_->manifest_data.get();
   privilege_x* privilege =
       reinterpret_cast<privilege_x*>(calloc(1, sizeof(privilege_x)));
+  if (!privilege)
+    return Status::ERROR;
   privilege->type = strdup(common_installer::kWebPrivilegeType);
+  if (!privilege->type) {
+    common_installer::FreePrivilegeX(privilege);
+    return Status::ERROR;
+  }
   privilege->value = strdup(common_installer::privileges::kPrivForWebApp);
+  if (!privilege->value) {
+    common_installer::FreePrivilegeX(privilege);
+    return Status::ERROR;
+  }
   m->privileges = g_list_append(m->privileges, privilege);
   return Status::OK;
 }
index 2e8d2a2..0aa90a7 100755 (executable)
@@ -41,6 +41,7 @@ common_installer::Step::Status StepCheckExtensionPrivileges::precheck() {
   }
   return Status::OK;
 }
+
 common_installer::Step::Status StepCheckExtensionPrivileges::process() {
   std::string app_ext_config_pattern(GetExtensionPath());
 
@@ -71,8 +72,22 @@ common_installer::Step::Status StepCheckExtensionPrivileges::process() {
       if (current_privileges.find(priv) == current_privileges.end()) {
         privilege_x* privilege =
             reinterpret_cast<privilege_x*>(calloc(1, sizeof(privilege_x)));
+        if (!privilege) {
+          g_list_free_full(privileges, &common_installer::FreePrivilegeX);
+          return Status::ERROR;
+        }
         privilege->type = strdup(common_installer::kWebPrivilegeType);
+        if (!privilege->type) {
+          common_installer::FreePrivilegeX(privilege);
+          g_list_free_full(privileges, &common_installer::FreePrivilegeX);
+          return Status::ERROR;
+        }
         privilege->value = strdup(priv.c_str());
+        if (!privilege->value) {
+          common_installer::FreePrivilegeX(privilege);
+          g_list_free_full(privileges, &common_installer::FreePrivilegeX);
+          return Status::ERROR;
+        }
         privileges = g_list_append(privileges, privilege);
       }
     }
index aedbbaf..48c3590 100644 (file)
@@ -49,8 +49,18 @@ common_installer::Step::Status StepCheckWgtImePrivilege::process() {
     // be sure there's a privilege in manifest
     privilege_x* privilege =
         reinterpret_cast<privilege_x*>(calloc(1, sizeof(privilege_x)));
+    if (!privilege)
+      return Status::ERROR;
     privilege->type = strdup(common_installer::kWebPrivilegeType);
+    if (!privilege->type) {
+      common_installer::FreePrivilegeX(privilege);
+      return Status::ERROR;
+    }
     privilege->value = strdup(common_installer::privileges::kImePrivilegeName);
+    if (!privilege->value) {
+      common_installer::FreePrivilegeX(privilege);
+      return Status::ERROR;
+    }
     context_->manifest_data.get()->privileges =
         g_list_append(context_->manifest_data.get()->privileges, privilege);
   }