e_hal: make sure dbus doesn't free strings we use
authorenglebass <englebass@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Fri, 7 May 2010 19:18:02 +0000 (19:18 +0000)
committerenglebass <englebass@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Fri, 7 May 2010 19:18:02 +0000 (19:18 +0000)
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
src/lib/hal/e_hal_manager.c
src/lib/hal/e_hal_util.c

index 6420848..bf4f191 100644 (file)
@@ -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);
           }
         }
index 2db3286..e640be0 100644 (file)
@@ -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);
 }
 
index 522c2fe..065558a 100644 (file)
@@ -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);
 }