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>
*/
#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>
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);
app_control_destroy(ad->request);
- if (ad->name)
- free(ad->name);
-
LOGD("app_terminate end");
return 0;
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__ */
#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;
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;
}
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