From 02750bb69f9ad931fe26bef15a4b2615cdfcc27b Mon Sep 17 00:00:00 2001 From: Florian Festi Date: Fri, 27 Sep 2024 15:24:31 +0200 Subject: [PATCH] Use rpmlogOnce() in handleHdrVS Various existing test cases fail when the NOKEY message is omited or shown more than once. The code uses the pointer to the rpmts object as a domain and resets it when the rpmts is freed. Resolves: #3336 --- lib/package.cc | 31 +++++++------------------------ lib/rpmts.cc | 2 ++ 2 files changed, 9 insertions(+), 24 deletions(-) diff --git a/lib/package.cc b/lib/package.cc index 73e9f60505..a7aa62cbc2 100644 --- a/lib/package.cc +++ b/lib/package.cc @@ -18,6 +18,7 @@ #include "rpmlead.hh" #include "rpmio_internal.hh" /* fd digest bits */ +#include "rpmlog_internal.hh" /* rpmlogOnce */ #include "header_internal.hh" /* XXX headerCheck */ #include "rpmvs.hh" @@ -31,6 +32,7 @@ struct pkgdata_s { hdrvsmsg msgfunc; const char *fn; char *msg; + uint64_t logDomain; rpmRC rc; }; @@ -110,28 +112,6 @@ rpmTagVal headerMergeLegacySigs(Header h, Header sigh, char **msg) return xl->stag; } -/** - * Remember current key id. - * XXX: This s*** needs to die. Hook it into keyring or sumthin... - * @param keyid signature keyid - * @return 0 if new keyid, otherwise 1 - */ -static int stashKeyid(const char *keyid) -{ - static std::mutex keyid_mutex; - static std::set keyids; - int seen = 0; - - if (keyid == NULL) - return 0; - - std::lock_guard lock(keyid_mutex); - auto ret = keyids.insert(keyid); - seen = (ret.second == false); - - return seen; -} - static int handleHdrVS(struct rpmsinfo_s *sinfo, void *cbdata) { struct pkgdata_s *pkgdata = (struct pkgdata_s *)cbdata; @@ -170,6 +150,7 @@ rpmRC headerCheck(rpmts ts, const void * uh, size_t uc, char ** msg) .msgfunc = appendhdrmsg, .fn = NULL, .msg = NULL, + .logDomain = (uint64_t) ts, .rc = RPMRC_OK, }; @@ -294,8 +275,8 @@ static void loghdrmsg(struct rpmsinfo_s *sinfo, struct pkgdata_s *pkgdata, case RPMRC_NOTTRUSTED: /* Signature is OK, but key is not trusted. */ case RPMRC_NOKEY: /* Public key is unavailable. */ /* XXX Print NOKEY/NOTTRUSTED warning only once. */ - if (stashKeyid(sinfo->keyid) == 0) - lvl = RPMLOG_WARNING; + if (rpmlogOnce(pkgdata->logDomain, sinfo->keyid, RPMLOG_WARNING, "%s: %s\n", pkgdata->fn, msg)) + goto exit; break; case RPMRC_NOTFOUND: /* Signature/digest not present. */ lvl = RPMLOG_WARNING; @@ -307,6 +288,8 @@ static void loghdrmsg(struct rpmsinfo_s *sinfo, struct pkgdata_s *pkgdata, } rpmlog(lvl, "%s: %s\n", pkgdata->fn, msg); + exit: + ; } rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp) diff --git a/lib/rpmts.cc b/lib/rpmts.cc index cb894af532..758b893354 100644 --- a/lib/rpmts.cc +++ b/lib/rpmts.cc @@ -30,6 +30,7 @@ #include "rpmplugins.hh" #include "rpmts_internal.hh" #include "rpmte_internal.hh" +#include "rpmlog_internal.hh" #include "misc.hh" #include "rpmtriggers.hh" @@ -575,6 +576,7 @@ rpmts rpmtsFree(rpmts ts) ts->plugins = rpmpluginsFree(ts->plugins); rpmtriggersFree(ts->trigs2run); + rpmlogReset((uint64_t) ts); if (_rpmts_stats) rpmtsPrintStats(ts);