diff options
author | Christophe Fergeau <cfergeau@redhat.com> | 2015-07-30 09:55:31 +0200 |
---|---|---|
committer | Christophe Fergeau <cfergeau@redhat.com> | 2015-07-30 21:24:05 +0200 |
commit | ef1e65f32b03631b48b7d3deba4b7054274216d6 (patch) | |
tree | 9df207bfcd2eb3fddc122eee08991074a14a217d /tp-account-widgets | |
parent | a72609e2d2f2afeacaadff304688d63bed164270 (diff) | |
download | telepathy-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.c | 6 |
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); |