Blame 0001-Only-read-through-payload-on-verify-if-actually-need.patch

James Antill ee2eafd
From 362c4401979f896de1e69a3e18d33954953912cc Mon Sep 17 00:00:00 2001
James Antill ee2eafd
Message-Id: <362c4401979f896de1e69a3e18d33954953912cc.1554983588.git.pmatilai@redhat.com>
James Antill ee2eafd
From: Panu Matilainen <pmatilai@redhat.com>
James Antill ee2eafd
Date: Tue, 11 Dec 2018 13:21:47 +0200
James Antill ee2eafd
Subject: [PATCH] Only read through payload on verify if actually needed
James Antill ee2eafd
James Antill ee2eafd
If none of our verify items ranges over the payload, then why bother?
James Antill ee2eafd
James Antill ee2eafd
To do this, add an internal rpmvs API to get it's range, and use
James Antill ee2eafd
that to decide whether trip over the payload is needed or not.
James Antill ee2eafd
In addition, the payload digest tag needs to be grabbed outside of the
James Antill ee2eafd
condition to avoid depending on other values. The details including
James Antill ee2eafd
RPMVSF_NEEDPAYLOAD will be handled internally to rpmvs which makes it
James Antill ee2eafd
actually nicer code-wise too.
James Antill ee2eafd
---
James Antill ee2eafd
 lib/rpmchecksig.c |  8 ++++----
James Antill ee2eafd
 lib/rpmvs.c       | 12 ++++++++++++
James Antill ee2eafd
 lib/rpmvs.h       |  3 +++
James Antill ee2eafd
 3 files changed, 19 insertions(+), 4 deletions(-)
James Antill ee2eafd
James Antill ee2eafd
diff --git a/lib/rpmchecksig.c b/lib/rpmchecksig.c
James Antill ee2eafd
index 1ba72a45e..810f7153d 100644
James Antill ee2eafd
--- a/lib/rpmchecksig.c
James Antill ee2eafd
+++ b/lib/rpmchecksig.c
James Antill ee2eafd
@@ -187,11 +187,11 @@ rpmRC rpmpkgRead(struct rpmvs_s *vs, FD_t fd,
James Antill ee2eafd
     /* Finalize header range */
James Antill ee2eafd
     rpmvsFiniRange(vs, RPMSIG_HEADER);
James Antill ee2eafd
 
James Antill ee2eafd
-    /* Unless disabled, read the payload, generating digest(s) on the fly. */
James Antill ee2eafd
-    if (!(rpmvsFlags(vs) & RPMVSF_NEEDPAYLOAD)) {
James Antill ee2eafd
-	/* Fish interesting tags from the main header. This is a bit hacky... */
James Antill ee2eafd
-	rpmvsAppendTag(vs, blob, RPMTAG_PAYLOADDIGEST);
James Antill ee2eafd
+    /* Fish interesting tags from the main header. This is a bit hacky... */
James Antill ee2eafd
+    rpmvsAppendTag(vs, blob, RPMTAG_PAYLOADDIGEST);
James Antill ee2eafd
 
James Antill ee2eafd
+    /* If needed and not explicitly disabled, read the payload as well. */
James Antill ee2eafd
+    if (rpmvsRange(vs) & RPMSIG_PAYLOAD) {
James Antill ee2eafd
 	/* Initialize digests ranging over the payload only */
James Antill ee2eafd
 	rpmvsInitRange(vs, RPMSIG_PAYLOAD);
James Antill ee2eafd
 
James Antill ee2eafd
diff --git a/lib/rpmvs.c b/lib/rpmvs.c
James Antill ee2eafd
index 622e48011..0d475af86 100644
James Antill ee2eafd
--- a/lib/rpmvs.c
James Antill ee2eafd
+++ b/lib/rpmvs.c
James Antill ee2eafd
@@ -396,6 +396,18 @@ void rpmvsFiniRange(struct rpmvs_s *sis, int range)
James Antill ee2eafd
     }
James Antill ee2eafd
 }
James Antill ee2eafd
 
James Antill ee2eafd
+int rpmvsRange(struct rpmvs_s *vs)
James Antill ee2eafd
+{
James Antill ee2eafd
+    int range = 0;
James Antill ee2eafd
+    for (int i = 0; i < vs->nsigs; i++) {
James Antill ee2eafd
+	if (rpmsinfoDisabled(&vs->sigs[i], vs->vsflags))
James Antill ee2eafd
+	    continue;
James Antill ee2eafd
+	range |= vs->sigs[i].range;
James Antill ee2eafd
+    }
James Antill ee2eafd
+
James Antill ee2eafd
+    return range;
James Antill ee2eafd
+}
James Antill ee2eafd
+
James Antill ee2eafd
 static int sinfoCmp(const void *a, const void *b)
James Antill ee2eafd
 {
James Antill ee2eafd
     const struct rpmsinfo_s *sa = a;
James Antill ee2eafd
--- rpm-4.14.3/lib/rpmvs.h.orig	2020-04-28 10:57:19.727347211 +0200
James Antill ee2eafd
+++ rpm-4.14.3/lib/rpmvs.h	2020-04-28 10:57:43.622612015 +0200
James Antill ee2eafd
@@ -66,6 +66,8 @@
James Antill ee2eafd
 
James Antill ee2eafd
 void rpmvsFiniRange(struct rpmvs_s *sis, int range);
James Antill ee2eafd
 
James Antill ee2eafd
+int rpmvsRange(struct rpmvs_s *vs); 
James Antill ee2eafd
+
James Antill ee2eafd
 int rpmvsVerify(struct rpmvs_s *sis, int type,
James Antill ee2eafd
                        rpmsinfoCb cb, void *cbdata);
James Antill ee2eafd
 
James Antill ee2eafd
-- 
James Antill ee2eafd
2.20.1