94 lines
3.0 KiB
Diff
94 lines
3.0 KiB
Diff
From 3feb7993a800525395dca5a173ade5f8e4fbd8d5 Mon Sep 17 00:00:00 2001
|
|
From: Michael Schroeder <mls@suse.de>
|
|
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
|
|
|