summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSemun Lee <sm79.lee@samsung.com>2016-07-07 11:10:16 (GMT)
committerSemun Lee <sm79.lee@samsung.com>2016-07-07 12:21:00 (GMT)
commit28e81640c7c8c6e4d1b2d1fb60748ce7b983a847 (patch)
tree55062863c7ea4273a7f9b2ea3eda659a518d5aba
parent45d05396088457b0f8aa1cfaa3969ecdeeea4ab4 (diff)
downloadui-gadget-1-28e81640c7c8c6e4d1b2d1fb60748ce7b983a847.zip
ui-gadget-1-28e81640c7c8c6e4d1b2d1fb60748ce7b983a847.tar.gz
ui-gadget-1-28e81640c7c8c6e4d1b2d1fb60748ce7b983a847.tar.bz2
dlopen ug shared library file again to prevent crash while terminating app. In some case, unloaded memory could be accessed by other libaries clean up routine. Fix double free of ad.name Change-Id: I612c318ccb798d76a0ac8b77ab8f23dbe2b1e974 Signed-off-by: Semun Lee <sm79.lee@samsung.com>
-rw-r--r--client/ug-client.c19
-rw-r--r--include/ug-module.h2
-rw-r--r--src/module.c15
-rw-r--r--src/ug.c11
4 files changed, 36 insertions, 11 deletions
diff --git a/client/ug-client.c b/client/ug-client.c
index 38fe98f..bce59d5 100644
--- a/client/ug-client.c
+++ b/client/ug-client.c
@@ -20,8 +20,11 @@
*/
#include <stdio.h>
+#include <dlfcn.h>
+#include <errno.h>
#include <appcore-efl.h>
#include <ui-gadget.h>
+#include <ug-module.h>
#include <dlog.h>
#include <aul.h>
@@ -492,9 +495,22 @@ func_out:
static int app_terminate(void *data)
{
struct appdata *ad = data;
+ char *ug_file_path = NULL;
+ void *handle;
+ int ret;
LOGD("app_terminate called");
+ ret = ug_module_get_file_path(ad->name, &ug_file_path);
+ if (ret == 0) {
+ handle = dlopen(ug_file_path, RTLD_LAZY);
+ if (!handle)
+ LOGE("Failed to dlopen the ug file (%d)", errno);
+ }
+
+ if (ug_file_path)
+ free(ug_file_path);
+
_ug_client_dbus_signal_handler_fini(data);
evas_object_smart_callback_del(ad->win, "wm,rotation,changed", rotate);
@@ -513,9 +529,6 @@ static int app_terminate(void *data)
app_control_destroy(ad->request);
- if (ad->name)
- free(ad->name);
-
LOGD("app_terminate end");
return 0;
diff --git a/include/ug-module.h b/include/ug-module.h
index 2db135f..36811d4 100644
--- a/include/ug-module.h
+++ b/include/ug-module.h
@@ -33,6 +33,6 @@ struct ug_module {
struct ug_module *ug_module_load(const char *name);
int ug_module_unload(struct ug_module *module);
-int ug_exist(const char* name);
+int ug_module_get_file_path(const char *name, char **ug_file_path);
#endif /* __UG_MODULE_H__ */
diff --git a/src/module.c b/src/module.c
index 2df10e2..b66e772 100644
--- a/src/module.c
+++ b/src/module.c
@@ -42,6 +42,11 @@
#define MEM_ADDR_LEN 8
#define MEM_ADDR_TOT_LEN 17
+#ifndef UG_API
+#define UG_API __attribute__ ((visibility("default")))
+#endif
+
+
static char *__ug_module_get_addr(const char *ug_name)
{
FILE *file;
@@ -278,14 +283,12 @@ int ug_module_unload(struct ug_module *module)
return 0;
}
-int ug_exist(const char* name)
+UG_API int ug_module_get_file_path(const char *name, char **ug_file_path)
{
- int ret = 1;
-
- if (__get_ug_info(name, NULL) < 0) {
+ if (__get_ug_info(name, ug_file_path) < 0) {
_ERR("error in getting ug file path");
- ret = 0;
+ return -1;
}
- return ret;
+ return 0;
}
diff --git a/src/ug.c b/src/ug.c
index ad4bcf4..6045237 100644
--- a/src/ug.c
+++ b/src/ug.c
@@ -377,12 +377,21 @@ UG_API int ug_disable_effect(ui_gadget_h ug)
UG_API int ug_is_installed(const char *name)
{
+ int ret = 1;
+ char *ug_file_path = NULL;
+
if (name == NULL) {
_ERR("name is null");
return -1;
}
- return ug_exist(name);
+ if (!ug_module_get_file_path(name, &ug_file_path))
+ ret = 0;
+
+ if (ug_file_path)
+ free(ug_file_path);
+
+ return ret;
}
#ifdef ENABLE_UG_CREATE_CB