summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hult <rhult@src.gnome.org>2003-11-29 23:56:06 +0000
committerRichard Hult <rhult@src.gnome.org>2003-11-29 23:56:06 +0000
commit0dbe4caf7504b5d072f24da8ddbbad75ec463c06 (patch)
tree199b8e4c13651cdb44f5dfeb34f2e9bfbd846670
parentb041d682cad6b61e7cfbe667099d6444f53accb0 (diff)
downloadgconf-0dbe4caf7504b5d072f24da8ddbbad75ec463c06.tar.gz
Fix leaks, handle invalid value in notify, don't g_free dbus memory,
don't try to propagate a NULL error.
-rw-r--r--gconf/gconf-database.c10
-rw-r--r--gconf/gconf-dbus-utils.c32
-rw-r--r--gconf/gconf-dbus.c50
3 files changed, 65 insertions, 27 deletions
diff --git a/gconf/gconf-database.c b/gconf/gconf-database.c
index 15aea169..e890f546 100644
--- a/gconf/gconf-database.c
+++ b/gconf/gconf-database.c
@@ -446,10 +446,12 @@ gconf_database_recursive_unset (GConfDatabase *db,
&error);
if (error)
- gconf_log (GCL_ERR, _("Error getting new value for \"%s\": %s"),
- notify_key, error->message);
- g_propagate_error (err, error);
- error = NULL;
+ {
+ gconf_log (GCL_ERR, _("Error getting new value for \"%s\": %s"),
+ notify_key, error->message);
+ g_propagate_error (err, error);
+ error = NULL;
+ }
gconf_database_schedule_sync (db);
diff --git a/gconf/gconf-dbus-utils.c b/gconf/gconf-dbus-utils.c
index 98b0f4e3..10eed4e4 100644
--- a/gconf/gconf-dbus-utils.c
+++ b/gconf/gconf-dbus-utils.c
@@ -49,11 +49,12 @@ gconf_value_from_dict (DBusMessageIter *iter,
{
case DBUS_TYPE_STRING:
{
- const char *str;
+ gchar *str;
value = gconf_value_new (GCONF_VALUE_STRING);
str = dbus_message_iter_get_string (&dict);
gconf_value_set_string (value, str);
+ dbus_free (str);
return value;
}
@@ -116,7 +117,12 @@ set_dict_value_from_gconf_value (DBusMessageIter *dict,
case GCONF_VALUE_BOOL:
dbus_message_iter_append_boolean (dict, gconf_value_get_bool (value));
break;
- /* FIXME: Add list and pair types */
+
+ /* Note: This is only used for setting the values in a pair, and lists and
+ * pairs are not allowed inside a pair.
+ */
+ case GCONF_VALUE_PAIR:
+ case GCONF_VALUE_LIST:
default:
g_assert_not_reached ();
}
@@ -413,7 +419,7 @@ gconf_dbus_message_iter_append_gconf_value (DBusMessageIter *iter,
case GCONF_VALUE_PAIR:
{
DBusMessageIter dict;
-
+
dbus_message_iter_append_dict (iter, &dict);
set_dict_value_from_gconf_value (&dict, "car", gconf_value_get_car (value));
@@ -606,7 +612,7 @@ gconf_dbus_message_append_entry (DBusMessage *message,
const gchar *schema_name)
{
DBusMessageIter iter, dict;
-
+
dbus_message_append_iter_init (message, &iter);
dbus_message_iter_append_dict (&iter, &dict);
@@ -615,7 +621,7 @@ gconf_dbus_message_append_entry (DBusMessage *message,
dbus_message_iter_append_dict_key (&dict, "value");
gconf_dbus_message_iter_append_gconf_value (&dict, value);
-
+
dbus_message_iter_append_dict_key (&dict, "is_default");
dbus_message_iter_append_boolean (&dict, is_default);
@@ -650,6 +656,7 @@ check_next_dict_key (DBusMessageIter *dict, const gchar *key)
}
#endif
+/* Note: The returned key and schema_name must be freed with g_free. */
gboolean
gconf_dbus_get_entry_values_from_message_iter (DBusMessageIter *iter,
gchar **key,
@@ -659,6 +666,7 @@ gconf_dbus_get_entry_values_from_message_iter (DBusMessageIter *iter,
gchar **schema_name)
{
DBusMessageIter dict;
+ gchar *str;
if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_DICT)
return FALSE;
@@ -677,7 +685,11 @@ gconf_dbus_get_entry_values_from_message_iter (DBusMessageIter *iter,
if (strcmp (name, "key") == 0)
{
if (key)
- *key = dbus_message_iter_get_string (&dict);
+ {
+ str = dbus_message_iter_get_string (&dict);
+ *key = g_strdup (str);
+ dbus_free (str);
+ }
}
else if (strcmp (name, "value") == 0)
{
@@ -697,10 +709,16 @@ gconf_dbus_get_entry_values_from_message_iter (DBusMessageIter *iter,
else if (strcmp (name, "schema_name") == 0)
{
if (schema_name)
- *schema_name = dbus_message_iter_get_string (&dict);
+ {
+ str = dbus_message_iter_get_string (&dict);
+ *schema_name = g_strdup (str);
+ dbus_free (str);
+ }
}
else
g_assert_not_reached ();
+
+ dbus_free (name);
if (!dbus_message_iter_next (&dict))
break;
diff --git a/gconf/gconf-dbus.c b/gconf/gconf-dbus.c
index 7c353e69..1037a9b7 100644
--- a/gconf/gconf-dbus.c
+++ b/gconf/gconf-dbus.c
@@ -1028,10 +1028,19 @@ gconf_engine_get_fuller (GConfEngine *conf,
&is_default,
&is_writable,
&schema_name);
+
+ dbus_message_unref (reply);
+
if (!success)
{
- /* FIXME: handle this */
- d(g_print ("FIXME: Couldn't get value\n"));
+ if (err)
+ g_set_error (err, GCONF_ERROR,
+ GCONF_ERROR_FAILED,
+ _("Couldn't get value"));
+
+ g_free (schema_name);
+
+ return NULL;
}
if (is_default_p)
@@ -1042,16 +1051,14 @@ gconf_engine_get_fuller (GConfEngine *conf,
if (schema_name && schema_name[0] != '/')
{
- dbus_free (schema_name);
+ g_free (schema_name);
schema_name = NULL;
}
if (schema_name_p)
- *schema_name_p = g_strdup (schema_name);
-
- dbus_free (schema_name);
-
- dbus_message_unref (reply);
+ *schema_name_p = schema_name;
+ else
+ g_free (schema_name);
return val;
}
@@ -1674,8 +1681,8 @@ gconf_engine_all_entries (GConfEngine* conf, const gchar* dir, GError** err)
entries = g_slist_prepend (entries, entry);
- dbus_free (key);
- dbus_free (schema_name);
+ g_free (key);
+ g_free (schema_name);
if (!dbus_message_iter_next (&iter))
break;
@@ -2292,13 +2299,21 @@ handle_notify (DBusConnection *connection,
dbus_message_iter_init (message, &iter);
- gconf_dbus_get_entry_values_from_message_iter (&iter,
- &key,
- &value,
- &is_default,
- &is_writable,
- &schema_name);
+ if (!gconf_dbus_get_entry_values_from_message_iter (&iter,
+ &key,
+ &value,
+ &is_default,
+ &is_writable,
+ &schema_name))
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ if (value == NULL)
+ {
+ g_free (key);
+ g_free (schema_name);
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ }
+
d(g_print ("Got notify on %s\n", key));
dir = g_strdup (key);
@@ -2341,6 +2356,9 @@ handle_notify (DBusConnection *connection,
gconf_value_free (value);
g_free (dir);
+ g_free (key);
+ g_free (schema_name);
+
if (!match)
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;