Skip to content

Commit

Permalink
Use rpmlogOnce() in handleHdrVS
Browse files Browse the repository at this point in the history
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
  • Loading branch information
ffesti committed Oct 31, 2024
1 parent c0bb2aa commit 02750bb
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 24 deletions.
31 changes: 7 additions & 24 deletions lib/package.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand All @@ -31,6 +32,7 @@ struct pkgdata_s {
hdrvsmsg msgfunc;
const char *fn;
char *msg;
uint64_t logDomain;
rpmRC rc;
};

Expand Down Expand Up @@ -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<std::string> keyids;
int seen = 0;

if (keyid == NULL)
return 0;

std::lock_guard<std::mutex> 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;
Expand Down Expand Up @@ -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,
};

Expand Down Expand Up @@ -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;
Expand All @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions lib/rpmts.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 02750bb

Please sign in to comment.