[libsecret] Fix secret_schema_unref detection of 0 refcount
- From: Christophe Fergeau <teuf src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libsecret] Fix secret_schema_unref detection of 0 refcount
- Date: Mon, 19 Oct 2015 13:15:40 +0000 (UTC)
commit 1b55291feb1e44977193989cf488e0dcd4bf518b
Author: Christophe Fergeau <cfergeau redhat com>
Date: Sun Jul 26 22:36:20 2015 +0200
Fix secret_schema_unref detection of 0 refcount
g_atomic_int_add (&schema->refs, -1); will return the value of 'refs'
_before_ adding -1 to it, so checking this value for 0 to see if the
refcount dropped to 0 after adding -1 is not going to work and will
cause a leak.
Using g_atomic_int_dec_and_test() fixes this problem as this will return
TRUE when the value drops to 0 after being decremented.
https://bugzilla.gnome.org/show_bug.cgi?id=756766
libsecret/secret-schema.c | 12 ++++--------
1 files changed, 4 insertions(+), 8 deletions(-)
---
diff --git a/libsecret/secret-schema.c b/libsecret/secret-schema.c
index 8bf7fa8..33522ef 100644
--- a/libsecret/secret-schema.c
+++ b/libsecret/secret-schema.c
@@ -355,16 +355,12 @@ _secret_schema_ref_if_nonstatic (const SecretSchema *schema)
void
secret_schema_unref (SecretSchema *schema)
{
- gint refs;
- gint i;
-
g_return_if_fail (schema != NULL);
+ /* statically-allocated or invalid SecretSchema */
+ g_return_if_fail (g_atomic_int_get (&schema->reserved) > 0);
- refs = g_atomic_int_add (&schema->reserved, -1);
- if (refs < 0) {
- g_warning ("should not unreference a static or invalid SecretSchema");
-
- } else if (refs == 0) {
+ if (g_atomic_int_dec_and_test (&schema->reserved)) {
+ gint i;
g_free ((gpointer)schema->name);
for (i = 0; i < G_N_ELEMENTS (schema->attributes); i++)
g_free ((gpointer)schema->attributes[i].name);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]