From 4b87e256d3ead493b836f9f889df39cbb83d484e Mon Sep 17 00:00:00 2001 From: Ariadne Conill Date: Tue, 17 Aug 2021 15:29:55 -0600 Subject: [PATCH] cache: clear package cache without using the refcounts --- libpkgconf/cache.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/libpkgconf/cache.c b/libpkgconf/cache.c index 7715e33..259577d 100644 --- a/libpkgconf/cache.c +++ b/libpkgconf/cache.c @@ -115,6 +115,18 @@ pkgconf_cache_remove(pkgconf_client_t *client, pkgconf_pkg_t *pkg) pkgconf_node_delete(&pkg->cache_iter, &client->pkg_cache); } +static inline void +clear_dependency_matches(pkgconf_list_t *list) +{ + pkgconf_node_t *iter; + + PKGCONF_FOREACH_LIST_ENTRY(list->head, iter) + { + pkgconf_dependency_t *dep = iter->data; + dep->match = NULL; + } +} + /* * !doc * @@ -131,10 +143,22 @@ pkgconf_cache_free(pkgconf_client_t *client) { pkgconf_node_t *iter, *iter2; + /* first we clear cached match pointers */ + PKGCONF_FOREACH_LIST_ENTRY(client->pkg_cache.head, iter) + { + pkgconf_pkg_t *pkg = iter->data; + + clear_dependency_matches(&pkg->required); + clear_dependency_matches(&pkg->requires_private); + clear_dependency_matches(&pkg->provides); + clear_dependency_matches(&pkg->conflicts); + } + + /* now forcibly free everything */ PKGCONF_FOREACH_LIST_ENTRY_SAFE(client->pkg_cache.head, iter2, iter) { pkgconf_pkg_t *pkg = iter->data; - pkgconf_pkg_unref(client, pkg); + pkgconf_pkg_free(client, pkg); } memset(&client->pkg_cache, 0, sizeof client->pkg_cache);