From 3feb7993a800525395dca5a173ade5f8e4fbd8d5 Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Fri, 10 Jan 2020 11:55:32 +0100 Subject: [PATCH] ndb: add a verify method This adds a verify method for ndb's Packages.db database. The Index.db database is currently not verified. URL:https://github.com/rpm-software-management/rpm/commit/3feb7993a800525395dca5a173ade5f8e4fbd8d5 --- lib/backend/ndb/glue.c | 8 +++++++- lib/backend/ndb/rpmpkg.c | 26 ++++++++++++++++++++++++++ lib/backend/ndb/rpmpkg.h | 1 + 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/lib/backend/ndb/glue.c b/lib/backend/ndb/glue.c index 07ddb0a..376e360 100644 --- a/lib/backend/ndb/glue.c +++ b/lib/backend/ndb/glue.c @@ -179,7 +179,13 @@ static int ndb_Open(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags) static int ndb_Verify(dbiIndex dbi, unsigned int flags) { - return 0; + int rc; + if (dbi->dbi_type == DBI_PRIMARY) { + rc = rpmpkgVerify(dbi->dbi_db); + } else { + rc = 0; /* cannot verify the index databases */ + } + return rc; } static void ndb_SetFSync(rpmdb rdb, int enable) diff --git a/lib/backend/ndb/rpmpkg.c b/lib/backend/ndb/rpmpkg.c index b95f29f..2213872 100644 --- a/lib/backend/ndb/rpmpkg.c +++ b/lib/backend/ndb/rpmpkg.c @@ -1101,6 +1101,22 @@ static int rpmpkgListInternal(rpmpkgdb pkgdb, unsigned int **pkgidxlistp, unsign return RPMRC_OK; } +static int rpmpkgVerifyInternal(rpmpkgdb pkgdb) +{ + unsigned int i, nslots; + pkgslot *slot; + + if (rpmpkgReadSlots(pkgdb)) + return RPMRC_FAIL; + rpmpkgOrderSlots(pkgdb); + nslots = pkgdb->nslots; + for (i = 0, slot = pkgdb->slots; i < nslots; i++, slot++) { + if (rpmpkgVerifyblob(pkgdb, slot->pkgidx, slot->blkoff, slot->blkcnt)) + return RPMRC_FAIL; + } + return RPMRC_OK; +} + int rpmpkgGet(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned char **blobp, unsigned int *bloblp) { int rc; @@ -1157,6 +1173,16 @@ int rpmpkgList(rpmpkgdb pkgdb, unsigned int **pkgidxlistp, unsigned int *npkgidx return rc; } +int rpmpkgVerify(rpmpkgdb pkgdb) +{ + int rc; + if (rpmpkgLockReadHeader(pkgdb, 0)) + return RPMRC_FAIL; + rc = rpmpkgVerifyInternal(pkgdb); + rpmpkgUnlock(pkgdb, 0); + return rc; +} + int rpmpkgNextPkgIdx(rpmpkgdb pkgdb, unsigned int *pkgidxp) { if (rpmpkgLockReadHeader(pkgdb, 1)) diff --git a/lib/backend/ndb/rpmpkg.h b/lib/backend/ndb/rpmpkg.h index 7e5d0c6..72d05c4 100644 --- a/lib/backend/ndb/rpmpkg.h +++ b/lib/backend/ndb/rpmpkg.h @@ -12,6 +12,7 @@ int rpmpkgGet(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned char **blobp, unsign int rpmpkgPut(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned char *blob, unsigned int blobl); int rpmpkgDel(rpmpkgdb pkgdb, unsigned int pkgidx); int rpmpkgList(rpmpkgdb pkgdb, unsigned int **pkgidxlistp, unsigned int *npkgidxlistp); +int rpmpkgVerify(rpmpkgdb pkgdb); int rpmpkgNextPkgIdx(rpmpkgdb pkgdb, unsigned int *pkgidxp); int rpmpkgGeneration(rpmpkgdb pkgdb, unsigned int *generationp); -- 1.8.3.1