summaryrefslogtreecommitdiff
path: root/tp-account-widgets
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2015-07-30 09:55:31 +0200
committerChristophe Fergeau <cfergeau@redhat.com>2015-07-30 21:24:05 +0200
commitef1e65f32b03631b48b7d3deba4b7054274216d6 (patch)
tree9df207bfcd2eb3fddc122eee08991074a14a217d /tp-account-widgets
parenta72609e2d2f2afeacaadff304688d63bed164270 (diff)
downloadtelepathy-account-widgets-ef1e65f32b03631b48b7d3deba4b7054274216d6.tar.gz
account-settings: Always take ownership of variant in ::set()
In one codepath, tpaw_account_settings_set() takes ownership of the passed-in GVariant through g_variant_ref_sink, but in the other codepath, ownership is left to the caller, which is unusual with functions with GVariant parameters. This commit unconditionnally calls g_variant_sink_ref() on the GVariant arg rather than doing it in just one codepath, and then makes sure we unref() the passed in GVariant when we don't want to keep it around. This fixes a memory leak in tpaw_account_settings_set() This fixes ==26855== 507 (240 direct, 267 indirect) bytes in 6 blocks are definitely lost in loss record 32,940 of 3 ==26855== at 0x4A06C50: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) ==26855== by 0x8A120AC: g_malloc (gmem.c:97) ==26855== by 0x8A2B0F7: g_slice_alloc (gslice.c:1007) ==26855== by 0x8A52C0B: g_variant_alloc (gvariant-core.c:476) ==26855== by 0x8A52C9B: g_variant_new_from_bytes (gvariant-core.c:512) ==26855== by 0x8A4A60F: g_variant_new_from_trusted (gvariant.c:295) ==26855== by 0x8A4BAF6: g_variant_new_string (gvariant.c:1232) ==26855== by 0x4CBBE2E: account_widget_entry_changed_common (tpaw-account-widget.c:281) ==26855== by 0x4CBBED8: account_widget_entry_changed_cb (tpaw-account-widget.c:299) ==26855== by 0x87741EA: g_cclosure_marshal_VOID__VOID (gmarshal.c:875) ==26855== by 0x8771238: g_closure_invoke (gclosure.c:801) ==26855== by 0x878E070: signal_emit_unlocked_R (gsignal.c:3581) ==26855== by 0x878D3A7: g_signal_emit_valist (gsignal.c:3337) ==26855== by 0x878DA56: g_signal_emit_by_name (gsignal.c:3433) ==26855== by 0x73C0612: end_change (gtkentry.c:2928) ==26855== by 0x73C5F0D: gtk_entry_real_insert_text (gtkentry.c:5360) ==26855== by 0x7495B9A: _gtk_marshal_VOID__STRING_INT_POINTER (gtkmarshalers.c:7351) ==26855== by 0x87719A3: g_type_iface_meta_marshal (gclosure.c:1045) https://bugzilla.gnome.org/show_bug.cgi?id=752938
Diffstat (limited to 'tp-account-widgets')
-rw-r--r--tp-account-widgets/tpaw-account-settings.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/tp-account-widgets/tpaw-account-settings.c b/tp-account-widgets/tpaw-account-settings.c
index e0d2a128..541ef390 100644
--- a/tp-account-widgets/tpaw-account-settings.c
+++ b/tp-account-widgets/tpaw-account-settings.c
@@ -1027,16 +1027,18 @@ tpaw_account_settings_set (TpawAccountSettings *settings,
g_return_if_fail (param != NULL);
g_return_if_fail (v != NULL);
+ g_variant_ref_sink (v);
+
if (!tp_strdiff (param, "password") && settings->priv->supports_sasl &&
g_variant_is_of_type (v, G_VARIANT_TYPE_STRING))
{
g_free (settings->priv->password);
settings->priv->password = g_variant_dup_string (v, NULL);
+ g_variant_unref (v);
}
else
{
- g_hash_table_insert (settings->priv->parameters, g_strdup (param),
- g_variant_ref_sink (v));
+ g_hash_table_insert (settings->priv->parameters, g_strdup (param), v);
}
account_settings_remove_from_unset (settings, param);