diff options
author | Richard Hult <rhult@src.gnome.org> | 2003-11-29 23:56:06 +0000 |
---|---|---|
committer | Richard Hult <rhult@src.gnome.org> | 2003-11-29 23:56:06 +0000 |
commit | 0dbe4caf7504b5d072f24da8ddbbad75ec463c06 (patch) | |
tree | 199b8e4c13651cdb44f5dfeb34f2e9bfbd846670 | |
parent | b041d682cad6b61e7cfbe667099d6444f53accb0 (diff) | |
download | gconf-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.c | 10 | ||||
-rw-r--r-- | gconf/gconf-dbus-utils.c | 32 | ||||
-rw-r--r-- | gconf/gconf-dbus.c | 50 |
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; |