[glib] GSettings: two memory use fixes



commit da386705f9e03ebf2cb9abbc523d84146b075444
Author: Ryan Lortie <desrt desrt ca>
Date:   Fri Jan 27 03:00:23 2012 -0500

    GSettings: two memory use fixes
    
    First, correct a rather dubious case of accessing a GSettingsSchemaKey
    after clearing it.  This was technically okay because only the key name
    was accessed (and it is not owned by the struct) but it looks very
    wrong.
    
    Second, have g_settings_backend_write() sink the passed in GVariant*.
    Not all backends get this right, and I'm starting to like the pattern of
    virtual function wrappers being responsible for sinking the parameters
    that they are documented as consuming.

 gio/gsettings.c        |    4 +++-
 gio/gsettingsbackend.c |    8 +++++++-
 2 files changed, 10 insertions(+), 2 deletions(-)
---
diff --git a/gio/gsettings.c b/gio/gsettings.c
index 95f0489..7db7196 100644
--- a/gio/gsettings.c
+++ b/gio/gsettings.c
@@ -1322,6 +1322,7 @@ g_settings_set_value (GSettings   *settings,
                       GVariant    *value)
 {
   GSettingsSchemaKey skey;
+  gboolean success;
 
   g_return_val_if_fail (G_IS_SETTINGS (settings), FALSE);
   g_return_val_if_fail (key != NULL, FALSE);
@@ -1349,9 +1350,10 @@ g_settings_set_value (GSettings   *settings,
         return FALSE;
     }
 
+  success = g_settings_write_to_backend (settings, &skey, value);
   g_settings_schema_key_clear (&skey);
 
-  return g_settings_write_to_backend (settings, &skey, value);
+  return success;
 }
 
 /**
diff --git a/gio/gsettingsbackend.c b/gio/gsettingsbackend.c
index 6075d7f..f2f11eb 100644
--- a/gio/gsettingsbackend.c
+++ b/gio/gsettingsbackend.c
@@ -772,8 +772,14 @@ g_settings_backend_write (GSettingsBackend *backend,
                           GVariant         *value,
                           gpointer          origin_tag)
 {
-  return G_SETTINGS_BACKEND_GET_CLASS (backend)
+  gboolean success;
+
+  g_variant_ref_sink (value);
+  success = G_SETTINGS_BACKEND_GET_CLASS (backend)
     ->write (backend, key, value, origin_tag);
+  g_variant_unref (value);
+
+  return success;
 }
 
 /*< private >



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]