diff options
author | Panu Matilainen <pmatilai@redhat.com> | 2022-03-18 13:31:31 +0200 |
---|---|---|
committer | Panu Matilainen <pmatilai@redhat.com> | 2022-03-31 09:56:03 +0300 |
commit | 3e4c0a95d3c2c8c500fdfd07db5408ac44dde50c (patch) | |
tree | 8c77bc58e810b5b08306e4c9c51c62ec484c296f | |
parent | 8948ec79f6c300e91319469ba72b9bd3480fe686 (diff) | |
download | rpm-3e4c0a95d3c2c8c500fdfd07db5408ac44dde50c.tar.gz |
Remember used keyring type in the transaction set
The keyring a transaction uses shouldn't change by somebody defining
macro in the meanwhile. Add an enum for known types and a helper to
lazily determine it on the first keyring load.
-rw-r--r-- | lib/rpmts.c | 33 | ||||
-rw-r--r-- | lib/rpmts_internal.h | 1 |
2 files changed, 27 insertions, 7 deletions
diff --git a/lib/rpmts.c b/lib/rpmts.c index 3c281104c..3d5a0f1a4 100644 --- a/lib/rpmts.c +++ b/lib/rpmts.c @@ -34,6 +34,11 @@ #include "debug.h" +enum { + KEYRING_RPMDB = 1, + KEYRING_FS = 2, +}; + /** * Iterator across transaction elements, forward on install, backward on erase. */ @@ -373,23 +378,36 @@ static int loadKeyringFromDB(rpmts ts) return nkeys; } +static int getKeyringType(void) +{ + int kt = KEYRING_RPMDB; + char *krtype = rpmExpand("%{?_keyring}", NULL); + + if (rstreq(krtype, "fs")) { + kt = KEYRING_FS; + } else if (*krtype && !rstreq(krtype, "rpmdb")) { + /* Fall back to using rpmdb if unknown, for now at least */ + rpmlog(RPMLOG_WARNING, + _("unknown keyring type: %s, using rpmdb\n"), krtype); + } + free(krtype); + + return kt; +} + static void loadKeyring(rpmts ts) { /* Never load the keyring if signature checking is disabled */ if ((rpmtsVSFlags(ts) & RPMVSF_MASK_NOSIGNATURES) != RPMVSF_MASK_NOSIGNATURES) { - char *krtype = rpmExpand("%{?_keyring}", NULL); ts->keyring = rpmKeyringNew(); - if (rstreq(krtype, "fs")) { + if (!ts->keyringtype) + ts->keyringtype = getKeyringType(); + if (ts->keyringtype == KEYRING_FS) { loadKeyringFromFiles(ts); } else { - /* Fall back to using rpmdb if unknown, for now at least */ - if (!(rstreq(krtype, "") || rstreq(krtype, "rpmdb"))) - rpmlog(RPMLOG_WARNING, - _("unknown keyring type: %s, using rpmdb\n"), krtype); loadKeyringFromDB(ts); } - free(krtype); } } @@ -1187,6 +1205,7 @@ rpmts rpmtsCreate(void) ts->rootDir = NULL; ts->keyring = NULL; + ts->keyringtype = 0; ts->vfyflags = rpmExpandNumeric("%{?_pkgverify_flags}"); ts->vfylevel = vfylevel_init(); diff --git a/lib/rpmts_internal.h b/lib/rpmts_internal.h index fc6e15883..6bd11a5fc 100644 --- a/lib/rpmts_internal.h +++ b/lib/rpmts_internal.h @@ -78,6 +78,7 @@ struct rpmts_s { rpmVSFlags vfyflags; /*!< Package verification flags */ int vfylevel; /*!< Package verification level */ rpmKeyring keyring; /*!< Keyring in use. */ + int keyringtype; /*!< Keyring type */ ARGV_t netsharedPaths; /*!< From %{_netsharedpath} */ ARGV_t installLangs; /*!< From %{_install_langs} */ |