summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPanu Matilainen <pmatilai@redhat.com>2022-03-18 13:31:31 +0200
committerPanu Matilainen <pmatilai@redhat.com>2022-03-31 09:56:03 +0300
commit3e4c0a95d3c2c8c500fdfd07db5408ac44dde50c (patch)
tree8c77bc58e810b5b08306e4c9c51c62ec484c296f
parent8948ec79f6c300e91319469ba72b9bd3480fe686 (diff)
downloadrpm-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.c33
-rw-r--r--lib/rpmts_internal.h1
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} */