From 2b82a4f63e886b9157a1863f1d09b717e07494c9 Mon Sep 17 00:00:00 2001 From: Ariadne Conill Date: Thu, 7 Oct 2021 00:23:35 -0600 Subject: [PATCH] use a serial instead of PKGCONF_PKG_PROPF_SEEN --- libpkgconf/libpkgconf.h | 6 +++++- libpkgconf/pkg.c | 7 ++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/libpkgconf/libpkgconf.h b/libpkgconf/libpkgconf.h index 5acfe2c..c235ac8 100644 --- a/libpkgconf/libpkgconf.h +++ b/libpkgconf/libpkgconf.h @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -123,7 +124,6 @@ struct pkgconf_path_ { #define PKGCONF_PKG_PROPF_NONE 0x00 #define PKGCONF_PKG_PROPF_STATIC 0x01 #define PKGCONF_PKG_PROPF_CACHED 0x02 -#define PKGCONF_PKG_PROPF_SEEN 0x04 #define PKGCONF_PKG_PROPF_UNINSTALLED 0x08 #define PKGCONF_PKG_PROPF_VIRTUAL 0x10 @@ -160,6 +160,8 @@ struct pkgconf_pkg_ { */ pkgconf_tuple_t *orig_prefix; pkgconf_tuple_t *prefix; + + uint64_t serial; }; typedef bool (*pkgconf_pkg_iteration_func_t)(const pkgconf_pkg_t *pkg, void *data); @@ -194,6 +196,8 @@ struct pkgconf_client_ { char *prefix_varname; bool already_sent_notice; + + uint64_t serial; }; struct pkgconf_cross_personality_ { diff --git a/libpkgconf/pkg.c b/libpkgconf/pkg.c index 2ba961c..d7b6a63 100644 --- a/libpkgconf/pkg.c +++ b/libpkgconf/pkg.c @@ -1463,7 +1463,7 @@ pkgconf_pkg_walk_list(pkgconf_client_t *client, if (pkgdep == NULL) continue; - if (pkgdep->flags & PKGCONF_PKG_PROPF_SEEN) + if (pkgdep->serial == client->serial) { pkgconf_pkg_unref(client, pkgdep); continue; @@ -1477,9 +1477,8 @@ pkgconf_pkg_walk_list(pkgconf_client_t *client, pkgconf_audit_log_dependency(client, pkgdep, depnode); - pkgdep->flags |= PKGCONF_PKG_PROPF_SEEN; + pkgdep->serial = client->serial; eflags |= pkgconf_pkg_traverse(client, pkgdep, func, data, depth - 1, skip_flags); - pkgdep->flags &= ~PKGCONF_PKG_PROPF_SEEN; pkgconf_pkg_unref(client, pkgdep); } @@ -1562,6 +1561,8 @@ pkgconf_pkg_traverse(pkgconf_client_t *client, if (maxdepth == 0) return eflags; + ++client->serial; + PKGCONF_TRACE(client, "%s: level %d", root->id, maxdepth); if ((root->flags & PKGCONF_PKG_PROPF_VIRTUAL) != PKGCONF_PKG_PROPF_VIRTUAL || (client->flags & PKGCONF_PKG_PKGF_SKIP_ROOT_VIRTUAL) != PKGCONF_PKG_PKGF_SKIP_ROOT_VIRTUAL)