eio/sentry: destroy event handlers when deleting sentry
this will crash due to invalid memory access if an event is triggered after the sentry is destroyed Differential Revision: https://phab.enlightenment.org/D6845
This commit is contained in:
parent
91dd1d9f4b
commit
9f8a7acfcf
|
@ -88,23 +88,34 @@ _handle_event(void *data, int type, void *event)
|
||||||
static void
|
static void
|
||||||
_initialize_handlers(Eio_Sentry_Data *pd)
|
_initialize_handlers(Eio_Sentry_Data *pd)
|
||||||
{
|
{
|
||||||
|
Ecore_Event_Handler *h;
|
||||||
EINA_SAFETY_ON_NULL_RETURN(pd);
|
EINA_SAFETY_ON_NULL_RETURN(pd);
|
||||||
|
pd->handlers = eina_array_new(11);
|
||||||
|
|
||||||
ecore_event_handler_add(EIO_MONITOR_FILE_CREATED, _handle_event, pd);
|
h = ecore_event_handler_add(EIO_MONITOR_FILE_CREATED, _handle_event, pd);
|
||||||
ecore_event_handler_add(EIO_MONITOR_FILE_DELETED, _handle_event, pd);
|
eina_array_push(pd->handlers, h);
|
||||||
ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED, _handle_event, pd);
|
h = ecore_event_handler_add(EIO_MONITOR_FILE_DELETED, _handle_event, pd);
|
||||||
ecore_event_handler_add(EIO_MONITOR_FILE_CLOSED, _handle_event, pd);
|
eina_array_push(pd->handlers, h);
|
||||||
|
h = ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED, _handle_event, pd);
|
||||||
|
eina_array_push(pd->handlers, h);
|
||||||
|
h = ecore_event_handler_add(EIO_MONITOR_FILE_CLOSED, _handle_event, pd);
|
||||||
|
eina_array_push(pd->handlers, h);
|
||||||
|
|
||||||
ecore_event_handler_add(EIO_MONITOR_DIRECTORY_CREATED, _handle_event, pd);
|
h = ecore_event_handler_add(EIO_MONITOR_DIRECTORY_CREATED, _handle_event, pd);
|
||||||
ecore_event_handler_add(EIO_MONITOR_DIRECTORY_DELETED, _handle_event, pd);
|
eina_array_push(pd->handlers, h);
|
||||||
ecore_event_handler_add(EIO_MONITOR_DIRECTORY_MODIFIED, _handle_event, pd);
|
h = ecore_event_handler_add(EIO_MONITOR_DIRECTORY_DELETED, _handle_event, pd);
|
||||||
ecore_event_handler_add(EIO_MONITOR_DIRECTORY_CLOSED, _handle_event, pd);
|
eina_array_push(pd->handlers, h);
|
||||||
|
h = ecore_event_handler_add(EIO_MONITOR_DIRECTORY_MODIFIED, _handle_event, pd);
|
||||||
|
eina_array_push(pd->handlers, h);
|
||||||
|
h = ecore_event_handler_add(EIO_MONITOR_DIRECTORY_CLOSED, _handle_event, pd);
|
||||||
|
eina_array_push(pd->handlers, h);
|
||||||
|
|
||||||
ecore_event_handler_add(EIO_MONITOR_SELF_RENAME, _handle_event, pd);
|
h = ecore_event_handler_add(EIO_MONITOR_SELF_RENAME, _handle_event, pd);
|
||||||
ecore_event_handler_add(EIO_MONITOR_SELF_DELETED, _handle_event, pd);
|
eina_array_push(pd->handlers, h);
|
||||||
ecore_event_handler_add(EIO_MONITOR_ERROR, _handle_event, pd);
|
h = ecore_event_handler_add(EIO_MONITOR_SELF_DELETED, _handle_event, pd);
|
||||||
|
eina_array_push(pd->handlers, h);
|
||||||
pd->handlers_initialized = EINA_TRUE;
|
h = ecore_event_handler_add(EIO_MONITOR_ERROR, _handle_event, pd);
|
||||||
|
eina_array_push(pd->handlers, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
Eina_Bool
|
Eina_Bool
|
||||||
|
@ -113,7 +124,7 @@ _eio_sentry_add(Eo *obj EINA_UNUSED, Eio_Sentry_Data *pd, const char *path)
|
||||||
EINA_SAFETY_ON_NULL_RETURN_VAL(path, EINA_FALSE);
|
EINA_SAFETY_ON_NULL_RETURN_VAL(path, EINA_FALSE);
|
||||||
EINA_SAFETY_ON_NULL_RETURN_VAL(pd, EINA_FALSE);
|
EINA_SAFETY_ON_NULL_RETURN_VAL(pd, EINA_FALSE);
|
||||||
|
|
||||||
if (!pd->handlers_initialized)
|
if (!pd->handlers)
|
||||||
_initialize_handlers(pd);
|
_initialize_handlers(pd);
|
||||||
|
|
||||||
if (eina_hash_find(pd->targets, path))
|
if (eina_hash_find(pd->targets, path))
|
||||||
|
@ -165,7 +176,6 @@ Efl_Object * _eio_sentry_efl_object_constructor(Eo *obj, Eio_Sentry_Data *pd)
|
||||||
|
|
||||||
pd->object = obj;
|
pd->object = obj;
|
||||||
pd->targets = eina_hash_string_small_new((Eina_Free_Cb)&eio_monitor_del);
|
pd->targets = eina_hash_string_small_new((Eina_Free_Cb)&eio_monitor_del);
|
||||||
pd->handlers_initialized = EINA_FALSE;
|
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
@ -173,6 +183,12 @@ Efl_Object * _eio_sentry_efl_object_constructor(Eo *obj, Eio_Sentry_Data *pd)
|
||||||
void _eio_sentry_efl_object_destructor(Eo *obj, Eio_Sentry_Data *pd)
|
void _eio_sentry_efl_object_destructor(Eo *obj, Eio_Sentry_Data *pd)
|
||||||
{
|
{
|
||||||
eina_hash_free(pd->targets);
|
eina_hash_free(pd->targets);
|
||||||
|
if (pd->handlers)
|
||||||
|
{
|
||||||
|
while (eina_array_count(pd->handlers))
|
||||||
|
ecore_event_handler_del(eina_array_pop(pd->handlers));
|
||||||
|
eina_array_free(pd->handlers);
|
||||||
|
}
|
||||||
|
|
||||||
efl_destructor(efl_super(obj, EIO_SENTRY_CLASS));
|
efl_destructor(efl_super(obj, EIO_SENTRY_CLASS));
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ struct _Eio_Sentry_Data
|
||||||
{
|
{
|
||||||
Eo *object;
|
Eo *object;
|
||||||
Eina_Hash *targets;
|
Eina_Hash *targets;
|
||||||
Eina_Bool handlers_initialized;
|
Eina_Array *handlers;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue