eldbus: Fix crash caused when the object of an monitored proxy is deleted

This happen because proxy was already freed and we try print some information
about the proxy in error message.

This fix: https://phab.enlightenment.org/T543
This commit is contained in:
José Roberto de Souza 2013-11-29 17:21:14 -02:00
parent b25fd77827
commit 64687356b0
1 changed files with 15 additions and 2 deletions

View File

@ -728,13 +728,23 @@ _property_iter(void *data, const void *key, Eldbus_Message_Iter *var)
}
static void
_props_get_all(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
_on_monitored_proxy_del(void *data, Eldbus_Proxy *proxy EINA_UNUSED, void *event_info EINA_UNUSED)
{
Eldbus_Pending *pending = data;
eldbus_pending_cancel(pending);
}
static void
_props_get_all(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending)
{
Eldbus_Proxy *proxy = data;
Eldbus_Message_Iter *dict;
const char *name, *error_msg;
Eldbus_Proxy_Event_Property_Loaded event;
eldbus_proxy_event_callback_del(proxy, ELDBUS_PROXY_EVENT_DEL,
_on_monitored_proxy_del, pending);
if (eldbus_message_error_get(msg, &name, &error_msg))
{
ERR("Error getting all properties of %s %s, error message: %s %s",
@ -760,6 +770,7 @@ _props_get_all(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EI
EAPI Eina_Bool
eldbus_proxy_properties_monitor(Eldbus_Proxy *proxy, Eina_Bool enable)
{
Eldbus_Pending *pending;
ELDBUS_PROXY_CHECK_RETVAL(proxy, EINA_FALSE);
if (proxy->monitor_enabled == enable)
return proxy->props ? !!eina_hash_population(proxy->props) : EINA_FALSE;
@ -787,7 +798,9 @@ eldbus_proxy_properties_monitor(Eldbus_Proxy *proxy, Eina_Bool enable)
if (!proxy->props)
proxy->props = eina_hash_string_superfast_new(_props_cache_free);
eldbus_proxy_property_get_all(proxy, _props_get_all, proxy);
pending = eldbus_proxy_property_get_all(proxy, _props_get_all, proxy);
eldbus_proxy_event_callback_add(proxy, ELDBUS_PROXY_EVENT_DEL,
_on_monitored_proxy_del, pending);
if (proxy->properties_changed)
return !!eina_hash_population(proxy->props);