forked from enlightenment/efl
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:
parent
6483c8d1e6
commit
57da05d406
|
@ -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_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;
|
Ecore_Evas *ee = data;
|
||||||
if (ee) ecore_evas_free(ee);
|
ecore_evas_free(ee);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -629,6 +629,7 @@ _ecore_evas_extn_free(Ecore_Evas *ee)
|
||||||
if (extn)
|
if (extn)
|
||||||
{
|
{
|
||||||
Ecore_Event_Handler *hdl;
|
Ecore_Event_Handler *hdl;
|
||||||
|
Ipc_Data_Update *ipc;
|
||||||
|
|
||||||
if (extn->file.have_lock) _ecore_evas_socket_unlock(ee, 0);
|
if (extn->file.have_lock) _ecore_evas_socket_unlock(ee, 0);
|
||||||
if (extn->file.have_lock2) _ecore_evas_socket_unlock(ee, 1);
|
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);
|
shmfile_close(extn->file.shmfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EINA_LIST_FREE(extn->file.updates, ipc)
|
||||||
|
free(ipc);
|
||||||
|
|
||||||
EINA_LIST_FREE(extn->ipc.handlers, hdl)
|
EINA_LIST_FREE(extn->ipc.handlers, hdl)
|
||||||
ecore_event_handler_del(hdl);
|
ecore_event_handler_del(hdl);
|
||||||
free(extn);
|
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
|
static void
|
||||||
_ecore_evas_extn_cb_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
|
_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,
|
evas_object_image_data_update_add(bdata->image,
|
||||||
ipc->x, ipc->y,
|
ipc->x, ipc->y,
|
||||||
ipc->w, ipc->h);
|
ipc->w, ipc->h);
|
||||||
|
free(ipc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1642,9 +1638,6 @@ ecore_evas_extn_plug_new_internal(Ecore_Evas *ee_target)
|
||||||
evas_object_event_callback_add(bdata->image,
|
evas_object_event_callback_add(bdata->image,
|
||||||
EVAS_CALLBACK_MULTI_MOVE,
|
EVAS_CALLBACK_MULTI_MOVE,
|
||||||
_ecore_evas_extn_cb_multi_move, ee);
|
_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_object_event_callback_add(bdata->image,
|
||||||
EVAS_CALLBACK_KEY_DOWN,
|
EVAS_CALLBACK_KEY_DOWN,
|
||||||
_ecore_evas_extn_cb_key_down, ee);
|
_ecore_evas_extn_cb_key_down, ee);
|
||||||
|
|
Loading…
Reference in New Issue