efl/ecore_evas_extn: fix memory errors.

- EVAS_CALLBACK_FREE and EVAS_CALLBACK_DEL were doing the same thing
   at different stages, causing a segv due double free.

 - extn->file.updates and its Ipc_Data_Update were leaking.

PS: I can't backport this to 1.7, but the problem is still
there. Could someone look into those?



SVN revision: 81304
This commit is contained in:
Gustavo Sverzut Barbieri 2012-12-18 20:51:50 +00:00
parent 6483c8d1e6
commit 57da05d406
1 changed files with 6 additions and 13 deletions

View File

@ -576,7 +576,7 @@ static void
_ecore_evas_extn_plug_image_obj_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Ecore_Evas *ee = data;
if (ee) ecore_evas_free(ee);
ecore_evas_free(ee);
}
static void
@ -629,6 +629,7 @@ _ecore_evas_extn_free(Ecore_Evas *ee)
if (extn)
{
Ecore_Event_Handler *hdl;
Ipc_Data_Update *ipc;
if (extn->file.have_lock) _ecore_evas_socket_unlock(ee, 0);
if (extn->file.have_lock2) _ecore_evas_socket_unlock(ee, 1);
@ -666,6 +667,9 @@ _ecore_evas_extn_free(Ecore_Evas *ee)
shmfile_close(extn->file.shmfile);
}
EINA_LIST_FREE(extn->file.updates, ipc)
free(ipc);
EINA_LIST_FREE(extn->ipc.handlers, hdl)
ecore_event_handler_del(hdl);
free(extn);
@ -1058,15 +1062,6 @@ _ecore_evas_extn_cb_multi_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj
}
}
static void
_ecore_evas_extn_cb_free(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Ecore_Evas *ee;
ee = data;
if (ee->driver) _ecore_evas_free(ee);
}
static void
_ecore_evas_extn_cb_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
{
@ -1452,6 +1447,7 @@ _ipc_server_data(void *data, int type EINA_UNUSED, void *event)
evas_object_image_data_update_add(bdata->image,
ipc->x, ipc->y,
ipc->w, ipc->h);
free(ipc);
}
}
break;
@ -1642,9 +1638,6 @@ ecore_evas_extn_plug_new_internal(Ecore_Evas *ee_target)
evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_MULTI_MOVE,
_ecore_evas_extn_cb_multi_move, ee);
evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_FREE,
_ecore_evas_extn_cb_free, ee);
evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_KEY_DOWN,
_ecore_evas_extn_cb_key_down, ee);