From 2f5a2c56d4d806343aadaf7b0d5c2a519c5cb4c8 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Wed, 27 Jul 2022 11:46:59 -0700 Subject: [PATCH] dependency: add a reference to dependency when adding to graph This makes internal uses more annoying, but fixes a potential bug in libpkgconf where there are two pointers (one returned and on in the graph), but only one refcount. --- libpkgconf/dependency.c | 8 +++++--- libpkgconf/pkg.c | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/libpkgconf/dependency.c b/libpkgconf/dependency.c index d2d78ac..751a43a 100644 --- a/libpkgconf/dependency.c +++ b/libpkgconf/dependency.c @@ -113,7 +113,7 @@ add_or_replace_dependency_node(pkgconf_client_t *client, pkgconf_dependency_t *d } PKGCONF_TRACE(client, "added dependency [%s] to list @%p; flags=%x", dependency_to_str(dep, depbuf, sizeof depbuf), list, dep->flags); - pkgconf_node_insert_tail(&dep->iter, dep, list); + pkgconf_node_insert_tail(&dep->iter, pkgconf_dependency_ref(dep->owner, dep), list); return pkgconf_dependency_ref(dep->owner, dep); } @@ -357,7 +357,8 @@ pkgconf_dependency_parse_str(pkgconf_client_t *client, pkgconf_list_t *deplist_h if (state == OUTSIDE_MODULE) { - pkgconf_dependency_addraw(client, deplist_head, package, package_sz, NULL, 0, compare, flags); + pkgconf_dependency_t *dep = pkgconf_dependency_addraw(client, deplist_head, package, package_sz, NULL, 0, compare, flags); + pkgconf_dependency_unref(dep->owner, dep); compare = PKGCONF_CMP_ANY; package_sz = 0; @@ -401,7 +402,8 @@ pkgconf_dependency_parse_str(pkgconf_client_t *client, pkgconf_list_t *deplist_h version_sz = ptr - vstart; state = OUTSIDE_MODULE; - pkgconf_dependency_addraw(client, deplist_head, package, package_sz, version, version_sz, compare, flags); + pkgconf_dependency_t *dep = pkgconf_dependency_addraw(client, deplist_head, package, package_sz, version, version_sz, compare, flags); + pkgconf_dependency_unref(dep->owner, dep); compare = PKGCONF_CMP_ANY; cnameptr = cmpname; diff --git a/libpkgconf/pkg.c b/libpkgconf/pkg.c index ed3fd5f..d94752c 100644 --- a/libpkgconf/pkg.c +++ b/libpkgconf/pkg.c @@ -453,7 +453,8 @@ pkgconf_pkg_new_from_file(pkgconf_client_t *client, const char *filename, FILE * return NULL; } - pkgconf_dependency_add(client, &pkg->provides, pkg->id, pkg->version, PKGCONF_CMP_EQUAL, 0); + pkgconf_dependency_t *dep = pkgconf_dependency_add(client, &pkg->provides, pkg->id, pkg->version, PKGCONF_CMP_EQUAL, 0); + pkgconf_dependency_unref(dep->owner, dep); return pkgconf_pkg_ref(client, pkg); }