From dfa1a789e5d641961894053de5a5ada415802a48 Mon Sep 17 00:00:00 2001 From: englebass Date: Fri, 7 May 2010 19:18:02 +0000 Subject: [PATCH] e_hal: make sure dbus doesn't free strings we use git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/e_dbus@48674 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/lib/hal/e_hal_device.c | 23 +++++++++++++++++++---- src/lib/hal/e_hal_manager.c | 6 ++++-- src/lib/hal/e_hal_util.c | 8 +++++++- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/lib/hal/e_hal_device.c b/src/lib/hal/e_hal_device.c index 6420848..bf4f191 100644 --- a/src/lib/hal/e_hal_device.c +++ b/src/lib/hal/e_hal_device.c @@ -17,6 +17,7 @@ unmarshal_device_get_property(DBusMessage *msg, DBusError *err) E_Hal_Device_Get_Property_Return *ret = NULL; DBusMessageIter iter; int type; + const char *str; ret = calloc(1, sizeof(E_Hal_Device_Get_Property_Return)); if (!ret) @@ -30,15 +31,20 @@ unmarshal_device_get_property(DBusMessage *msg, DBusError *err) switch(type) { case DBUS_TYPE_STRING: - dbus_message_iter_get_basic(&iter, &(ret->val.s)); + ret->type = E_HAL_PROPERTY_TYPE_STRING; + dbus_message_iter_get_basic(&iter, &str); + ret->val.s = eina_stringshare_add(str); break; case DBUS_TYPE_INT32: + ret->type = E_HAL_PROPERTY_TYPE_INT; dbus_message_iter_get_basic(&iter, &(ret->val.i)); break; case DBUS_TYPE_BOOLEAN: + ret->type = E_HAL_PROPERTY_TYPE_BOOL; dbus_message_iter_get_basic(&iter, &(ret->val.b)); break; case DBUS_TYPE_DOUBLE: + ret->type = E_HAL_PROPERTY_TYPE_DOUBLE; dbus_message_iter_get_basic(&iter, &(ret->val.d)); break; } @@ -52,6 +58,14 @@ free_device_get_property(void *data) E_Hal_Device_Get_Property_Return *ret = data; if (!ret) return; + if (ret->type == E_HAL_PROPERTY_TYPE_STRLIST) + { + const char *str; + EINA_LIST_FREE(ret->val.strlist, str) + eina_stringshare_del(str); + } + else if (ret->type == E_HAL_PROPERTY_TYPE_STRING) + eina_stringshare_del(ret->val.s); free(ret); } @@ -97,6 +111,7 @@ unmarshal_device_get_all_properties(DBusMessage *msg, DBusError *err) while (dbus_message_iter_get_arg_type(&a_iter) != DBUS_TYPE_INVALID) { const char *name; + const char *str; E_Hal_Property *prop = calloc(1, sizeof(E_Hal_Property)); dbus_message_iter_recurse(&a_iter, &s_iter); dbus_message_iter_get_basic(&s_iter, &name); @@ -107,7 +122,8 @@ unmarshal_device_get_all_properties(DBusMessage *msg, DBusError *err) { case DBUS_TYPE_STRING: prop->type = E_HAL_PROPERTY_TYPE_STRING; - dbus_message_iter_get_basic(&v_iter, &(prop->val.s)); + dbus_message_iter_get_basic(&v_iter, &str); + prop->val.s = eina_stringshare_add(str); break; case DBUS_TYPE_INT32: prop->type = E_HAL_PROPERTY_TYPE_INT; @@ -133,9 +149,8 @@ unmarshal_device_get_all_properties(DBusMessage *msg, DBusError *err) dbus_message_iter_recurse(&v_iter, &list_iter); while (dbus_message_iter_get_arg_type(&list_iter) != DBUS_TYPE_INVALID) { - char *str; dbus_message_iter_get_basic(&list_iter, &str); - prop->val.strlist = eina_list_append(prop->val.strlist, str); + prop->val.strlist = eina_list_append(prop->val.strlist, eina_stringshare_add(str)); dbus_message_iter_next(&list_iter); } } diff --git a/src/lib/hal/e_hal_manager.c b/src/lib/hal/e_hal_manager.c index 2db3286..e640be0 100644 --- a/src/lib/hal/e_hal_manager.c +++ b/src/lib/hal/e_hal_manager.c @@ -34,7 +34,7 @@ unmarshal_string_list(DBusMessage *msg, DBusError *err) dbus_message_iter_get_basic(&sub, &dev); if (dev) - ret->strings = eina_list_append(ret->strings, dev); + ret->strings = eina_list_append(ret->strings, eina_stringshare_add(dev)); dbus_message_iter_next(&sub); } @@ -45,9 +45,11 @@ static void free_string_list(void *data) { E_Hal_String_List_Return *ret = data; + const char *str; if (!ret) return; - eina_list_free(ret->strings); + EINA_LIST_FREE(ret->strings, str) + eina_stringshare_del(str); free(ret); } diff --git a/src/lib/hal/e_hal_util.c b/src/lib/hal/e_hal_util.c index 522c2fe..065558a 100644 --- a/src/lib/hal/e_hal_util.c +++ b/src/lib/hal/e_hal_util.c @@ -11,7 +11,13 @@ EAPI void e_hal_property_free(E_Hal_Property *prop) { if (prop->type == E_HAL_PROPERTY_TYPE_STRLIST) - eina_list_free(prop->val.strlist); + { + const char *str; + EINA_LIST_FREE(prop->val.strlist, str) + eina_stringshare_del(str); + } + else if (prop->type == E_HAL_PROPERTY_TYPE_STRING) + eina_stringshare_del(prop->val.s); free(prop); } -- 2.7.4