diff options
author | Alexander Larsson <alexl@redhat.com> | 2018-08-13 18:18:51 +0200 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2018-08-13 21:31:09 +0000 |
commit | cbbc98b50d4294f68b29358fe8801dafabdf0798 (patch) | |
tree | 9e7e1f805b133308d621c2e73a6f276558df347b | |
parent | 45945c5d4523ba0d3cc711dd2e6b91de0d6dd0e0 (diff) | |
download | flatpak-cbbc98b50d4294f68b29358fe8801dafabdf0798.tar.gz |
Make FlatpakRemoteState refcounted
This is needed to fix a memory leak
Closes: #1964
Approved by: mwleeds
-rw-r--r-- | app/flatpak-builtins-ls-remote.c | 2 | ||||
-rw-r--r-- | common/flatpak-dir-private.h | 6 | ||||
-rw-r--r-- | common/flatpak-dir.c | 38 | ||||
-rw-r--r-- | common/flatpak-transaction.c | 2 |
4 files changed, 33 insertions, 15 deletions
diff --git a/app/flatpak-builtins-ls-remote.c b/app/flatpak-builtins-ls-remote.c index 48174622..7cecdf15 100644 --- a/app/flatpak-builtins-ls-remote.c +++ b/app/flatpak-builtins-ls-remote.c @@ -62,7 +62,7 @@ static void remote_dir_pair_free (RemoteDirPair *pair) { g_free (pair->remote_name); - flatpak_remote_state_free (pair->state); + flatpak_remote_state_unref (pair->state); g_object_unref (pair->dir); g_free (pair); } diff --git a/common/flatpak-dir-private.h b/common/flatpak-dir-private.h index 3a868f9a..a86fd36e 100644 --- a/common/flatpak-dir-private.h +++ b/common/flatpak-dir-private.h @@ -91,9 +91,11 @@ typedef struct GError *summary_fetch_error; GVariant *metadata; GError *metadata_fetch_error; + int refcount; } FlatpakRemoteState; -void flatpak_remote_state_free (FlatpakRemoteState *remote_state); +FlatpakRemoteState *flatpak_remote_state_ref (FlatpakRemoteState *remote_state); +void flatpak_remote_state_unref (FlatpakRemoteState *remote_state); gboolean flatpak_remote_state_ensure_summary (FlatpakRemoteState *self, GError **error); gboolean flatpak_remote_state_ensure_metadata (FlatpakRemoteState *self, @@ -122,7 +124,7 @@ GVariant *flatpak_remote_state_lookup_sparse_cache (FlatpakRemoteState *self, G_DEFINE_AUTOPTR_CLEANUP_FUNC (FlatpakDir, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (FlatpakDeploy, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (FlatpakRelated, flatpak_related_free) -G_DEFINE_AUTOPTR_CLEANUP_FUNC (FlatpakRemoteState, flatpak_remote_state_free) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (FlatpakRemoteState, flatpak_remote_state_unref) typedef struct { diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c index d9de54dc..a07f70e7 100644 --- a/common/flatpak-dir.c +++ b/common/flatpak-dir.c @@ -198,21 +198,37 @@ get_config_dir_location (void) static FlatpakRemoteState * flatpak_remote_state_new (void) { - return g_new0 (FlatpakRemoteState, 1); + FlatpakRemoteState *state = g_new0 (FlatpakRemoteState, 1); + state->refcount = 1; + return state; } -void -flatpak_remote_state_free (FlatpakRemoteState *remote_state) +FlatpakRemoteState * +flatpak_remote_state_ref (FlatpakRemoteState *remote_state) { - g_free (remote_state->remote_name); - g_free (remote_state->collection_id); - g_clear_pointer (&remote_state->summary, g_variant_unref); - g_clear_pointer (&remote_state->summary_sig_bytes, g_bytes_unref); - g_clear_error (&remote_state->summary_fetch_error); - g_clear_pointer (&remote_state->metadata, g_variant_unref); - g_clear_error (&remote_state->metadata_fetch_error); + g_assert (remote_state->refcount > 0); + remote_state->refcount++; + return remote_state; +} - g_free (remote_state); +void +flatpak_remote_state_unref (FlatpakRemoteState *remote_state) +{ + g_assert (remote_state->refcount > 0); + remote_state->refcount--; + + if (remote_state->refcount == 0) + { + g_free (remote_state->remote_name); + g_free (remote_state->collection_id); + g_clear_pointer (&remote_state->summary, g_variant_unref); + g_clear_pointer (&remote_state->summary_sig_bytes, g_bytes_unref); + g_clear_error (&remote_state->summary_fetch_error); + g_clear_pointer (&remote_state->metadata, g_variant_unref); + g_clear_error (&remote_state->metadata_fetch_error); + + g_free (remote_state); + } } gboolean diff --git a/common/flatpak-transaction.c b/common/flatpak-transaction.c index 094c579b..1bc09c5a 100644 --- a/common/flatpak-transaction.c +++ b/common/flatpak-transaction.c @@ -785,7 +785,7 @@ flatpak_transaction_init (FlatpakTransaction *self) FlatpakTransactionPrivate *priv = flatpak_transaction_get_instance_private (self); priv->last_op_for_ref = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); - priv->remote_states = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) flatpak_remote_state_free); + priv->remote_states = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) flatpak_remote_state_unref); priv->added_origin_remotes = g_ptr_array_new_with_free_func (g_free); priv->extra_dependency_dirs = g_ptr_array_new_with_free_func (g_object_unref); } |