Add patches for release 11
Resolves: #2037186 Resolves: #2018937 Resolves: #2023692
This commit is contained in:
parent
1a9baff802
commit
0b3e36cfc6
@ -1,155 +1,17 @@
|
|||||||
From 1f63621d098741158b5e1e7158cc570a415d88cd Mon Sep 17 00:00:00 2001
|
From b66422161d68ed7f7b1cb30e4db900bf42bed146 Mon Sep 17 00:00:00 2001
|
||||||
From: Panu Matilainen <pmatilai@redhat.com>
|
From: Panu Matilainen <pmatilai@redhat.com>
|
||||||
Date: Mon, 29 Nov 2021 14:01:39 +0200
|
Date: Mon, 29 Nov 2021 14:01:39 +0200
|
||||||
Subject: [PATCH] Fix IMA signature lengths assumed constant (#1833,
|
Subject: [PATCH 1/4] Add Python bindings for rpmfilesFSignature()
|
||||||
RhBug:2018937)
|
|
||||||
|
|
||||||
At least ECDSA and RSA signatures can vary in length, but the IMA code
|
Only, use more descriptive names than the C-side counterparts.
|
||||||
assumes constant lengths and thus may either place invalid signatures on
|
Python has nice facilities for dealing with binary data so return it
|
||||||
disk from either truncating or overshooting, and segfault if the stars are
|
as such rather than converting to hex.
|
||||||
just so.
|
|
||||||
|
|
||||||
Luckily the signatures are stored as strings so we can calculate the
|
Backported for 4.16.1.3 (removed rpmfilesVSignature()).
|
||||||
actual lengths at runtime and ignore the stored constant length info.
|
|
||||||
Extend hex2bin() to optionally calculate the lengths and maximum,
|
|
||||||
and use these for returning IMA data from the rpmfi(les) API.
|
|
||||||
|
|
||||||
Additionally update the signing code to store the largest IMA signature
|
|
||||||
length rather than what happened to be last to be on the safe side.
|
|
||||||
We can't rely on this value due to invalid packages being out there,
|
|
||||||
but then we need to calculate the lengths on rpmfiles populate so there's
|
|
||||||
not a lot to gain anyhow.
|
|
||||||
|
|
||||||
Fixes: #1833
|
|
||||||
|
|
||||||
Backported for 4.16.1.3 and combined with:
|
|
||||||
31e9daf823f7052135d1decc0802b6fa775a88c5 (fix-up)
|
|
||||||
0c1ad364d65c4144ff71c376e0b49fbc322b686d (python bindings)
|
|
||||||
|
|
||||||
Note that the test case has been removed due to it including a binary
|
|
||||||
file (test package) for which we'd have to use -Sgit with %autopatch and
|
|
||||||
thus depend on git-core at build time. Nevertheless, we do have this BZ
|
|
||||||
covered in our internal test suite, so no need for it anyway.
|
|
||||||
---
|
---
|
||||||
lib/rpmfi.c | 59 +++++++++++++++++++++++++++++++++-----------
|
python/rpmfiles-py.c | 18 ++++++++++++++++++
|
||||||
python/rpmfiles-py.c | 18 ++++++++++++++
|
1 file changed, 18 insertions(+)
|
||||||
sign/rpmsignfiles.c | 5 +++-
|
|
||||||
3 files changed, 67 insertions(+), 15 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/rpmfi.c b/lib/rpmfi.c
|
|
||||||
index af428468c..ed8927fd5 100644
|
|
||||||
--- a/lib/rpmfi.c
|
|
||||||
+++ b/lib/rpmfi.c
|
|
||||||
@@ -115,7 +115,8 @@ struct rpmfiles_s {
|
|
||||||
struct fingerPrint_s * fps; /*!< File fingerprint(s). */
|
|
||||||
|
|
||||||
int digestalgo; /*!< File digest algorithm */
|
|
||||||
- int signaturelength; /*!< File signature length */
|
|
||||||
+ int *signaturelengths; /*!< File signature lengths */
|
|
||||||
+ int signaturemaxlen; /*!< Largest file signature length */
|
|
||||||
unsigned char * digests; /*!< File digests in binary. */
|
|
||||||
unsigned char * signatures; /*!< File signatures in binary. */
|
|
||||||
|
|
||||||
@@ -575,9 +576,9 @@ const unsigned char * rpmfilesFSignature(rpmfiles fi, int ix, size_t *len)
|
|
||||||
|
|
||||||
if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
|
|
||||||
if (fi->signatures != NULL)
|
|
||||||
- signature = fi->signatures + (fi->signaturelength * ix);
|
|
||||||
+ signature = fi->signatures + (fi->signaturemaxlen * ix);
|
|
||||||
if (len)
|
|
||||||
- *len = fi->signaturelength;
|
|
||||||
+ *len = fi->signaturelengths ? fi->signaturelengths[ix] : 0;
|
|
||||||
}
|
|
||||||
return signature;
|
|
||||||
}
|
|
||||||
@@ -1257,6 +1258,7 @@ rpmfiles rpmfilesFree(rpmfiles fi)
|
|
||||||
fi->flangs = _free(fi->flangs);
|
|
||||||
fi->digests = _free(fi->digests);
|
|
||||||
fi->signatures = _free(fi->signatures);
|
|
||||||
+ fi->signaturelengths = _free(fi->signaturelengths);
|
|
||||||
fi->fcaps = _free(fi->fcaps);
|
|
||||||
|
|
||||||
fi->cdict = _free(fi->cdict);
|
|
||||||
@@ -1486,23 +1488,52 @@ err:
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert a tag of hex strings to binary presentation */
|
|
||||||
-static uint8_t *hex2bin(Header h, rpmTagVal tag, rpm_count_t num, size_t len)
|
|
||||||
+/* If lengths is non-NULL, assume variable length strings */
|
|
||||||
+static uint8_t *hex2bin(Header h, rpmTagVal tag, rpm_count_t num, size_t len,
|
|
||||||
+ int **lengths, int *maxlen)
|
|
||||||
{
|
|
||||||
struct rpmtd_s td;
|
|
||||||
uint8_t *bin = NULL;
|
|
||||||
|
|
||||||
if (headerGet(h, tag, &td, HEADERGET_MINMEM) && rpmtdCount(&td) == num) {
|
|
||||||
- uint8_t *t = bin = xmalloc(num * len);
|
|
||||||
const char *s;
|
|
||||||
+ int maxl = 0;
|
|
||||||
+ int *lens = NULL;
|
|
||||||
+
|
|
||||||
+ /* Figure string sizes + max length for allocation purposes */
|
|
||||||
+ if (lengths) {
|
|
||||||
+ int i = 0;
|
|
||||||
+ lens = xmalloc(num * sizeof(*lens));
|
|
||||||
+
|
|
||||||
+ while ((s = rpmtdNextString(&td))) {
|
|
||||||
+ lens[i] = strlen(s) / 2;
|
|
||||||
+ if (lens[i] > maxl)
|
|
||||||
+ maxl = lens[i];
|
|
||||||
+ i++;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ *lengths = lens;
|
|
||||||
+ *maxlen = maxl;
|
|
||||||
+
|
|
||||||
+ /* Reinitialize iterator for next round */
|
|
||||||
+ rpmtdInit(&td);
|
|
||||||
+ } else {
|
|
||||||
+ maxl = len;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
+ uint8_t *t = bin = xmalloc(num * maxl);
|
|
||||||
+ int i = 0;
|
|
||||||
while ((s = rpmtdNextString(&td))) {
|
|
||||||
if (*s == '\0') {
|
|
||||||
- memset(t, 0, len);
|
|
||||||
- t += len;
|
|
||||||
- continue;
|
|
||||||
+ memset(t, 0, maxl);
|
|
||||||
+ } else {
|
|
||||||
+ if (lens)
|
|
||||||
+ len = lens[i];
|
|
||||||
+ for (int j = 0; j < len; j++, s += 2)
|
|
||||||
+ t[j] = (rnibble(s[0]) << 4) | rnibble(s[1]);
|
|
||||||
}
|
|
||||||
- for (int j = 0; j < len; j++, t++, s += 2)
|
|
||||||
- *t = (rnibble(s[0]) << 4) | rnibble(s[1]);
|
|
||||||
+ t += maxl;
|
|
||||||
+ i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
rpmtdFreeData(&td);
|
|
||||||
@@ -1570,15 +1601,15 @@ static int rpmfilesPopulate(rpmfiles fi, Header h, rpmfiFlags flags)
|
|
||||||
/* grab hex digests from header and store in binary format */
|
|
||||||
if (!(flags & RPMFI_NOFILEDIGESTS)) {
|
|
||||||
size_t diglen = rpmDigestLength(fi->digestalgo);
|
|
||||||
- fi->digests = hex2bin(h, RPMTAG_FILEDIGESTS, totalfc, diglen);
|
|
||||||
+ fi->digests = hex2bin(h, RPMTAG_FILEDIGESTS, totalfc, diglen,
|
|
||||||
+ NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
fi->signatures = NULL;
|
|
||||||
/* grab hex signatures from header and store in binary format */
|
|
||||||
if (!(flags & RPMFI_NOFILESIGNATURES)) {
|
|
||||||
- fi->signaturelength = headerGetNumber(h, RPMTAG_FILESIGNATURELENGTH);
|
|
||||||
- fi->signatures = hex2bin(h, RPMTAG_FILESIGNATURES,
|
|
||||||
- totalfc, fi->signaturelength);
|
|
||||||
+ fi->signatures = hex2bin(h, RPMTAG_FILESIGNATURES, totalfc, 0,
|
|
||||||
+ &fi->signaturelengths, &fi->signaturemaxlen);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* XXX TR_REMOVED doesn;t need fmtimes, frdevs, finodes */
|
|
||||||
diff --git a/python/rpmfiles-py.c b/python/rpmfiles-py.c
|
diff --git a/python/rpmfiles-py.c b/python/rpmfiles-py.c
|
||||||
index 27666021d..48189a0ac 100644
|
index 27666021d..48189a0ac 100644
|
||||||
--- a/python/rpmfiles-py.c
|
--- a/python/rpmfiles-py.c
|
||||||
@ -186,15 +48,226 @@ index 27666021d..48189a0ac 100644
|
|||||||
{ NULL, NULL, NULL, NULL }
|
{ NULL, NULL, NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
||||||
|
From 9c4622998d3d0666edbea3ed1ae518502c3ed987 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Panu Matilainen <pmatilai@redhat.com>
|
||||||
|
Date: Mon, 7 Feb 2022 11:52:55 +0200
|
||||||
|
Subject: [PATCH 2/4] Add a testcase for --dump query
|
||||||
|
|
||||||
|
---
|
||||||
|
tests/rpmquery.at | 18 ++++++++++++++++++
|
||||||
|
1 file changed, 18 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/tests/rpmquery.at b/tests/rpmquery.at
|
||||||
|
index 9a4f1cb76..9bd391ac5 100644
|
||||||
|
--- a/tests/rpmquery.at
|
||||||
|
+++ b/tests/rpmquery.at
|
||||||
|
@@ -83,6 +83,24 @@ hello.spec
|
||||||
|
[ignore])
|
||||||
|
AT_CLEANUP
|
||||||
|
|
||||||
|
+AT_SETUP([rpm -qp --dump])
|
||||||
|
+AT_KEYWORDS([query])
|
||||||
|
+AT_CHECK([
|
||||||
|
+RPMDB_INIT
|
||||||
|
+runroot rpm \
|
||||||
|
+ -qp --dump \
|
||||||
|
+ /data/RPMS/hello-2.0-1.x86_64.rpm
|
||||||
|
+],
|
||||||
|
+[0],
|
||||||
|
+[/usr/bin/hello 7120 1489670606 c89fa87aeb1143969c0b6be9334b21d932f77f74e8f60120b5de316406369cf0 0100751 root root 0 0 0 X
|
||||||
|
+/usr/share/doc/hello-2.0 4096 1489670606 0000000000000000000000000000000000000000000000000000000000000000 040755 root root 0 0 0 X
|
||||||
|
+/usr/share/doc/hello-2.0/COPYING 48 908894882 fac3b28492ecdc16da172a6f1a432ceed356ca4d9248157b2a962b395e37b3b0 0100644 root root 0 1 0 X
|
||||||
|
+/usr/share/doc/hello-2.0/FAQ 36 908895030 678b87e217a415f05e43460e2c7b668245b412e2b4f18a75aa7399d9774ed0b4 0100644 root root 0 1 0 X
|
||||||
|
+/usr/share/doc/hello-2.0/README 39 908884468 d63fdc6c986106f57230f217d36b2395d83ecf491d2b7187af714dc8db9629e9 0100644 root root 0 1 0 X
|
||||||
|
+],
|
||||||
|
+[])
|
||||||
|
+AT_CLEANUP
|
||||||
|
+
|
||||||
|
# ------------------------------
|
||||||
|
AT_SETUP([rpmspec -q])
|
||||||
|
AT_KEYWORDS([query])
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
||||||
|
From 9b2bc10881db7691439005fd74ea53d75b15ac76 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Panu Matilainen <pmatilai@redhat.com>
|
||||||
|
Date: Thu, 10 Feb 2022 11:15:04 +0200
|
||||||
|
Subject: [PATCH 3/4] Ensure sane string lengths for file digests from header
|
||||||
|
|
||||||
|
---
|
||||||
|
lib/rpmfi.c | 4 ++++
|
||||||
|
1 file changed, 4 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/lib/rpmfi.c b/lib/rpmfi.c
|
||||||
|
index af428468c..2dffab3aa 100644
|
||||||
|
--- a/lib/rpmfi.c
|
||||||
|
+++ b/lib/rpmfi.c
|
||||||
|
@@ -1501,6 +1501,10 @@ static uint8_t *hex2bin(Header h, rpmTagVal tag, rpm_count_t num, size_t len)
|
||||||
|
t += len;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
+ if (strlen(s) != len * 2) {
|
||||||
|
+ bin = rfree(bin);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
for (int j = 0; j < len; j++, t++, s += 2)
|
||||||
|
*t = (rnibble(s[0]) << 4) | rnibble(s[1]);
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
||||||
|
From ddfed9e1842a1b60a8c40de3a18add6f6d68c515 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Panu Matilainen <pmatilai@redhat.com>
|
||||||
|
Date: Mon, 29 Nov 2021 14:01:39 +0200
|
||||||
|
Subject: [PATCH 4/4] Fix IMA signature fubar, take III (#1833, RhBug:2018937)
|
||||||
|
|
||||||
|
At least ECDSA and RSA signatures can vary in length, but the IMA code
|
||||||
|
assumes constant lengths and thus may either place invalid signatures on
|
||||||
|
disk from either truncating or overshooting, and segfault if the stars are
|
||||||
|
just so.
|
||||||
|
|
||||||
|
As we can't assume static lengths and attempts to use maximum length
|
||||||
|
have proven problematic for other reasons, use a data structure that
|
||||||
|
can actually handle variable length data properly: store offsets into
|
||||||
|
the decoded binary blob and use them to calculate lengths when needed,
|
||||||
|
empty data is simply consequtive identical offsets. This avoids a whole
|
||||||
|
class of silly overflow issues with multiplying, makes zero-length data
|
||||||
|
actually presentable in the data structure and saves memory too.
|
||||||
|
|
||||||
|
Add tests to show behavior with variable length signatures and missing
|
||||||
|
signatures.
|
||||||
|
|
||||||
|
Additionally update the signing code to store the largest IMA signature
|
||||||
|
length rather than what happened to be last to be on the safe side.
|
||||||
|
We can't rely on this value due to invalid packages being out there,
|
||||||
|
but then we need to calculate the lengths on rpmfiles populate so there's
|
||||||
|
not a lot to gain anyhow.
|
||||||
|
|
||||||
|
Fixes: #1833
|
||||||
|
|
||||||
|
Backported for 4.16.1.3. Note that the test case has been removed due
|
||||||
|
to it including a binary file (test package) for which we'd have to use
|
||||||
|
-Sgit with %autopatch and thus depend on git-core at build time.
|
||||||
|
Nevertheless, we do have this BZ covered in our internal test suite, so
|
||||||
|
no need for it anyway.
|
||||||
|
---
|
||||||
|
lib/rpmfi.c | 61 +++++++++++++++++++++++++++++++++++++++------
|
||||||
|
sign/rpmsignfiles.c | 5 +++-
|
||||||
|
2 files changed, 58 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/rpmfi.c b/lib/rpmfi.c
|
||||||
|
index 2dffab3aa..77e73442c 100644
|
||||||
|
--- a/lib/rpmfi.c
|
||||||
|
+++ b/lib/rpmfi.c
|
||||||
|
@@ -115,7 +115,7 @@ struct rpmfiles_s {
|
||||||
|
struct fingerPrint_s * fps; /*!< File fingerprint(s). */
|
||||||
|
|
||||||
|
int digestalgo; /*!< File digest algorithm */
|
||||||
|
- int signaturelength; /*!< File signature length */
|
||||||
|
+ uint32_t *signatureoffs; /*!< File signature offsets */
|
||||||
|
unsigned char * digests; /*!< File digests in binary. */
|
||||||
|
unsigned char * signatures; /*!< File signatures in binary. */
|
||||||
|
|
||||||
|
@@ -574,10 +574,15 @@ const unsigned char * rpmfilesFSignature(rpmfiles fi, int ix, size_t *len)
|
||||||
|
const unsigned char *signature = NULL;
|
||||||
|
|
||||||
|
if (fi != NULL && ix >= 0 && ix < rpmfilesFC(fi)) {
|
||||||
|
- if (fi->signatures != NULL)
|
||||||
|
- signature = fi->signatures + (fi->signaturelength * ix);
|
||||||
|
+ size_t slen = 0;
|
||||||
|
+ if (fi->signatures != NULL && fi->signatureoffs != NULL) {
|
||||||
|
+ uint32_t off = fi->signatureoffs[ix];
|
||||||
|
+ slen = fi->signatureoffs[ix+1] - off;
|
||||||
|
+ if (slen > 0)
|
||||||
|
+ signature = fi->signatures + off;
|
||||||
|
+ }
|
||||||
|
if (len)
|
||||||
|
- *len = fi->signaturelength;
|
||||||
|
+ *len = slen;
|
||||||
|
}
|
||||||
|
return signature;
|
||||||
|
}
|
||||||
|
@@ -1257,6 +1262,7 @@ rpmfiles rpmfilesFree(rpmfiles fi)
|
||||||
|
fi->flangs = _free(fi->flangs);
|
||||||
|
fi->digests = _free(fi->digests);
|
||||||
|
fi->signatures = _free(fi->signatures);
|
||||||
|
+ fi->signatureoffs = _free(fi->signatureoffs);
|
||||||
|
fi->fcaps = _free(fi->fcaps);
|
||||||
|
|
||||||
|
fi->cdict = _free(fi->cdict);
|
||||||
|
@@ -1485,6 +1491,48 @@ err:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * Convert a tag of variable len hex strings to binary presentation,
|
||||||
|
+ * accessed via offsets to a contiguous binary blob. Empty values
|
||||||
|
+ * are represented by identical consequtive offsets. The offsets array
|
||||||
|
+ * always has one extra element to allow calculating the size of the
|
||||||
|
+ * last element.
|
||||||
|
+ */
|
||||||
|
+static uint8_t *hex2binv(Header h, rpmTagVal tag, rpm_count_t num,
|
||||||
|
+ uint32_t **offsetp)
|
||||||
|
+{
|
||||||
|
+ struct rpmtd_s td;
|
||||||
|
+ uint8_t *bin = NULL;
|
||||||
|
+ uint32_t *offs = NULL;
|
||||||
|
+
|
||||||
|
+ if (headerGet(h, tag, &td, HEADERGET_MINMEM) && rpmtdCount(&td) == num) {
|
||||||
|
+ const char *s;
|
||||||
|
+ int i = 0;
|
||||||
|
+ uint8_t *t = bin = xmalloc(((rpmtdSize(&td) / 2) + 1));
|
||||||
|
+ offs = xmalloc((num + 1) * sizeof(*offs));
|
||||||
|
+
|
||||||
|
+ while ((s = rpmtdNextString(&td))) {
|
||||||
|
+ uint32_t slen = strlen(s);
|
||||||
|
+ uint32_t len = slen / 2;
|
||||||
|
+ if (slen % 2) {
|
||||||
|
+ bin = rfree(bin);
|
||||||
|
+ offs = rfree(offs);
|
||||||
|
+ goto exit;
|
||||||
|
+ }
|
||||||
|
+ offs[i] = t - bin;
|
||||||
|
+ for (int j = 0; j < len; j++, t++, s += 2)
|
||||||
|
+ *t = (rnibble(s[0]) << 4) | rnibble(s[1]);
|
||||||
|
+ i++;
|
||||||
|
+ }
|
||||||
|
+ offs[i] = t - bin;
|
||||||
|
+ *offsetp = offs;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+exit:
|
||||||
|
+ rpmtdFreeData(&td);
|
||||||
|
+ return bin;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* Convert a tag of hex strings to binary presentation */
|
||||||
|
static uint8_t *hex2bin(Header h, rpmTagVal tag, rpm_count_t num, size_t len)
|
||||||
|
{
|
||||||
|
@@ -1580,9 +1628,8 @@ static int rpmfilesPopulate(rpmfiles fi, Header h, rpmfiFlags flags)
|
||||||
|
fi->signatures = NULL;
|
||||||
|
/* grab hex signatures from header and store in binary format */
|
||||||
|
if (!(flags & RPMFI_NOFILESIGNATURES)) {
|
||||||
|
- fi->signaturelength = headerGetNumber(h, RPMTAG_FILESIGNATURELENGTH);
|
||||||
|
- fi->signatures = hex2bin(h, RPMTAG_FILESIGNATURES,
|
||||||
|
- totalfc, fi->signaturelength);
|
||||||
|
+ fi->signatures = hex2binv(h, RPMTAG_FILESIGNATURES,
|
||||||
|
+ totalfc, &fi->signatureoffs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* XXX TR_REMOVED doesn;t need fmtimes, frdevs, finodes */
|
||||||
diff --git a/sign/rpmsignfiles.c b/sign/rpmsignfiles.c
|
diff --git a/sign/rpmsignfiles.c b/sign/rpmsignfiles.c
|
||||||
index b143c5b9b..6f39db6be 100644
|
index b143c5b9b..372ba634c 100644
|
||||||
--- a/sign/rpmsignfiles.c
|
--- a/sign/rpmsignfiles.c
|
||||||
+++ b/sign/rpmsignfiles.c
|
+++ b/sign/rpmsignfiles.c
|
||||||
@@ -98,8 +98,9 @@ rpmRC rpmSignFiles(Header sigh, Header h, const char *key, char *keypass)
|
@@ -98,8 +98,9 @@ rpmRC rpmSignFiles(Header sigh, Header h, const char *key, char *keypass)
|
||||||
td.count = 1;
|
td.count = 1;
|
||||||
|
|
||||||
while (rpmfiNext(fi) >= 0) {
|
while (rpmfiNext(fi) >= 0) {
|
||||||
+ uint32_t slen;
|
+ uint32_t slen = 0;
|
||||||
digest = rpmfiFDigest(fi, NULL, NULL);
|
digest = rpmfiFDigest(fi, NULL, NULL);
|
||||||
- signature = signFile(algoname, digest, diglen, key, keypass, &siglen);
|
- signature = signFile(algoname, digest, diglen, key, keypass, &siglen);
|
||||||
+ signature = signFile(algoname, digest, diglen, key, keypass, &slen);
|
+ signature = signFile(algoname, digest, diglen, key, keypass, &slen);
|
||||||
@ -211,5 +284,5 @@ index b143c5b9b..6f39db6be 100644
|
|||||||
|
|
||||||
if (siglen > 0) {
|
if (siglen > 0) {
|
||||||
--
|
--
|
||||||
2.33.1
|
2.35.1
|
||||||
|
|
||||||
|
88
rpm-4.16.1.3-fix-regression-reading-rpm-v3-pkgs.patch
Normal file
88
rpm-4.16.1.3-fix-regression-reading-rpm-v3-pkgs.patch
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
From f5695d04f56e27d9cf947c0502eb549c28aa817e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Panu Matilainen <pmatilai@redhat.com>
|
||||||
|
Date: Tue, 25 May 2021 14:07:18 +0300
|
||||||
|
Subject: [PATCH] Fix regression reading rpm v3 and other rare packages (#1635)
|
||||||
|
|
||||||
|
Commit d6a86b5e69e46cc283b1e06c92343319beb42e21 introduced far stricter
|
||||||
|
checks on what tags are allowed in signature and main headers than rpm
|
||||||
|
had previously seen, and unsurprisingly this introduced some regressions
|
||||||
|
on less common cases:
|
||||||
|
|
||||||
|
- On rpm v3 packages and some newer 3rd party created packages (such as
|
||||||
|
install4j < 9.0.2), RPMTAG_ARCHIVESIZE resides in the main header
|
||||||
|
to begin with
|
||||||
|
- In rpm 4.13 - 4.14, file IMA signatures were incorrectly placed in
|
||||||
|
the main header.
|
||||||
|
|
||||||
|
As a quirk, permit the existence of RPMTAG_ARCHIVESIZE,
|
||||||
|
RPMTAG_FILESIGNATURES and RPMTAG_FILESIGNATURELENGTH in the main header
|
||||||
|
too provided that the corresponding signature tag is not there (so
|
||||||
|
they can reside in either but not both headers).
|
||||||
|
|
||||||
|
Initial workaround patch by Demi Marie Obenour.
|
||||||
|
|
||||||
|
Fixes: #1635
|
||||||
|
|
||||||
|
Backported for 4.16.1.3.
|
||||||
|
---
|
||||||
|
lib/package.c | 35 ++++++++++++++++++++---------------
|
||||||
|
1 file changed, 20 insertions(+), 15 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/package.c b/lib/package.c
|
||||||
|
index 36ed5abc6..8c2b66b0b 100644
|
||||||
|
--- a/lib/package.c
|
||||||
|
+++ b/lib/package.c
|
||||||
|
@@ -35,21 +35,22 @@ struct taglate_s {
|
||||||
|
rpmTagVal stag;
|
||||||
|
rpmTagVal xtag;
|
||||||
|
rpm_count_t count;
|
||||||
|
+ int quirk;
|
||||||
|
} const xlateTags[] = {
|
||||||
|
- { RPMSIGTAG_SIZE, RPMTAG_SIGSIZE, 1 },
|
||||||
|
- { RPMSIGTAG_PGP, RPMTAG_SIGPGP, 0 },
|
||||||
|
- { RPMSIGTAG_MD5, RPMTAG_SIGMD5, 16 },
|
||||||
|
- { RPMSIGTAG_GPG, RPMTAG_SIGGPG, 0 },
|
||||||
|
- /* { RPMSIGTAG_PGP5, RPMTAG_SIGPGP5, 0 }, */ /* long obsolete, dont use */
|
||||||
|
- { RPMSIGTAG_PAYLOADSIZE, RPMTAG_ARCHIVESIZE, 1 },
|
||||||
|
- { RPMSIGTAG_FILESIGNATURES, RPMTAG_FILESIGNATURES, 0 },
|
||||||
|
- { RPMSIGTAG_FILESIGNATURELENGTH, RPMTAG_FILESIGNATURELENGTH, 1 },
|
||||||
|
- { RPMSIGTAG_SHA1, RPMTAG_SHA1HEADER, 1 },
|
||||||
|
- { RPMSIGTAG_SHA256, RPMTAG_SHA256HEADER, 1 },
|
||||||
|
- { RPMSIGTAG_DSA, RPMTAG_DSAHEADER, 0 },
|
||||||
|
- { RPMSIGTAG_RSA, RPMTAG_RSAHEADER, 0 },
|
||||||
|
- { RPMSIGTAG_LONGSIZE, RPMTAG_LONGSIGSIZE, 1 },
|
||||||
|
- { RPMSIGTAG_LONGARCHIVESIZE, RPMTAG_LONGARCHIVESIZE, 1 },
|
||||||
|
+ { RPMSIGTAG_SIZE, RPMTAG_SIGSIZE, 1, 0 },
|
||||||
|
+ { RPMSIGTAG_PGP, RPMTAG_SIGPGP, 0, 0 },
|
||||||
|
+ { RPMSIGTAG_MD5, RPMTAG_SIGMD5, 16, 0 },
|
||||||
|
+ { RPMSIGTAG_GPG, RPMTAG_SIGGPG, 0, 0 },
|
||||||
|
+ /* { RPMSIGTAG_PGP5, RPMTAG_SIGPGP5, 0, 0 }, */ /* long obsolete, dont use */
|
||||||
|
+ { RPMSIGTAG_PAYLOADSIZE, RPMTAG_ARCHIVESIZE, 1, 1 },
|
||||||
|
+ { RPMSIGTAG_FILESIGNATURES, RPMTAG_FILESIGNATURES, 0, 1 },
|
||||||
|
+ { RPMSIGTAG_FILESIGNATURELENGTH, RPMTAG_FILESIGNATURELENGTH, 1, 1 },
|
||||||
|
+ { RPMSIGTAG_SHA1, RPMTAG_SHA1HEADER, 1, 0 },
|
||||||
|
+ { RPMSIGTAG_SHA256, RPMTAG_SHA256HEADER, 1, 0 },
|
||||||
|
+ { RPMSIGTAG_DSA, RPMTAG_DSAHEADER, 0, 0 },
|
||||||
|
+ { RPMSIGTAG_RSA, RPMTAG_RSAHEADER, 0, 0 },
|
||||||
|
+ { RPMSIGTAG_LONGSIZE, RPMTAG_LONGSIGSIZE, 1, 0 },
|
||||||
|
+ { RPMSIGTAG_LONGARCHIVESIZE, RPMTAG_LONGARCHIVESIZE, 1, 0 },
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -67,8 +68,12 @@ rpmTagVal headerMergeLegacySigs(Header h, Header sigh, char **msg)
|
||||||
|
|
||||||
|
for (xl = xlateTags; xl->stag; xl++) {
|
||||||
|
/* There mustn't be one in the main header */
|
||||||
|
- if (headerIsEntry(h, xl->xtag))
|
||||||
|
+ if (headerIsEntry(h, xl->xtag)) {
|
||||||
|
+ /* Some tags may exist in either header, but never both */
|
||||||
|
+ if (xl->quirk && !headerIsEntry(sigh, xl->stag))
|
||||||
|
+ continue;
|
||||||
|
goto exit;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
rpmtdReset(&td);
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
123
rpm-4.16.1.3-fix-spurious-transfiletriggerpostun-execution.patch
Normal file
123
rpm-4.16.1.3-fix-spurious-transfiletriggerpostun-execution.patch
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
From 8c37dff4ce9c887eda5ad61f78001e87473002ed Mon Sep 17 00:00:00 2001
|
||||||
|
From: Panu Matilainen <pmatilai@redhat.com>
|
||||||
|
Date: Tue, 16 Nov 2021 11:49:18 +0200
|
||||||
|
Subject: [PATCH] Fix spurious %transfiletriggerpostun execution
|
||||||
|
(RhBug:2023311)
|
||||||
|
|
||||||
|
If a package has multiple %transfiletriggerpostun triggers, any one
|
||||||
|
of them matching would cause all of them to run, due to disconnect
|
||||||
|
in the intel gathering stage: we'd gather all the headers with matching
|
||||||
|
files into a lump, and then add any postun triggers found in them,
|
||||||
|
but this loses the triggering file information and causes all postuns
|
||||||
|
to run.
|
||||||
|
|
||||||
|
The triggers need to be added while looping over the file matches,
|
||||||
|
like runFileTriggers() does. Doing so actually simplifies the code.
|
||||||
|
These should really be unified to use the same code, but leaving
|
||||||
|
that exercise to another rainy day.
|
||||||
|
|
||||||
|
Combined with 0988ccb53abf426587d228df5c60c4042da71999 (fix-up).
|
||||||
|
---
|
||||||
|
lib/rpmtriggers.c | 65 ++++++++++++++++++++++++-----------------------
|
||||||
|
1 file changed, 33 insertions(+), 32 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/rpmtriggers.c b/lib/rpmtriggers.c
|
||||||
|
index fc809a65e..8d8f57450 100644
|
||||||
|
--- a/lib/rpmtriggers.c
|
||||||
|
+++ b/lib/rpmtriggers.c
|
||||||
|
@@ -97,19 +97,39 @@ static void rpmtriggersSortAndUniq(rpmtriggers trigs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void addTriggers(rpmts ts, Header trigH, rpmsenseFlags filter,
|
||||||
|
+ const char *prefix)
|
||||||
|
+{
|
||||||
|
+ int tix = 0;
|
||||||
|
+ rpmds ds;
|
||||||
|
+ rpmds triggers = rpmdsNew(trigH, RPMTAG_TRANSFILETRIGGERNAME, 0);
|
||||||
|
+
|
||||||
|
+ while ((ds = rpmdsFilterTi(triggers, tix))) {
|
||||||
|
+ if ((rpmdsNext(ds) >= 0) && (rpmdsFlags(ds) & filter) &&
|
||||||
|
+ strcmp(prefix, rpmdsN(ds)) == 0) {
|
||||||
|
+ struct rpmtd_s priorities;
|
||||||
|
+
|
||||||
|
+ if (headerGet(trigH, RPMTAG_TRANSFILETRIGGERPRIORITIES,
|
||||||
|
+ &priorities, HEADERGET_MINMEM)) {
|
||||||
|
+ rpmtdSetIndex(&priorities, tix);
|
||||||
|
+ rpmtriggersAdd(ts->trigs2run, headerGetInstance(trigH),
|
||||||
|
+ tix, *rpmtdGetUint32(&priorities));
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ rpmdsFree(ds);
|
||||||
|
+ tix++;
|
||||||
|
+ }
|
||||||
|
+ rpmdsFree(triggers);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void rpmtriggersPrepPostUnTransFileTrigs(rpmts ts, rpmte te)
|
||||||
|
{
|
||||||
|
- rpmdbMatchIterator mi;
|
||||||
|
rpmdbIndexIterator ii;
|
||||||
|
- Header trigH;
|
||||||
|
const void *key;
|
||||||
|
size_t keylen;
|
||||||
|
rpmfiles files;
|
||||||
|
- rpmds rpmdsTriggers;
|
||||||
|
- rpmds rpmdsTrigger;
|
||||||
|
|
||||||
|
ii = rpmdbIndexIteratorInit(rpmtsGetRdb(ts), RPMDBI_TRANSFILETRIGGERNAME);
|
||||||
|
- mi = rpmdbNewIterator(rpmtsGetRdb(ts), RPMDBI_PACKAGES);
|
||||||
|
files = rpmteFiles(te);
|
||||||
|
|
||||||
|
/* Iterate over file triggers in rpmdb */
|
||||||
|
@@ -121,39 +141,20 @@ void rpmtriggersPrepPostUnTransFileTrigs(rpmts ts, rpmte te)
|
||||||
|
rpmfi fi = rpmfilesFindPrefix(files, pfx);
|
||||||
|
while (rpmfiNext(fi) >= 0) {
|
||||||
|
if (RPMFILE_IS_INSTALLED(rpmfiFState(fi))) {
|
||||||
|
- /* If yes then store it */
|
||||||
|
- rpmdbAppendIterator(mi, rpmdbIndexIteratorPkgOffsets(ii),
|
||||||
|
- rpmdbIndexIteratorNumPkgs(ii));
|
||||||
|
+ unsigned int npkg = rpmdbIndexIteratorNumPkgs(ii);
|
||||||
|
+ const unsigned int *offs = rpmdbIndexIteratorPkgOffsets(ii);
|
||||||
|
+ /* Save any postun triggers matching this prefix */
|
||||||
|
+ for (int i = 0; i < npkg; i++) {
|
||||||
|
+ Header h = rpmdbGetHeaderAt(rpmtsGetRdb(ts), offs[i]);
|
||||||
|
+ addTriggers(ts, h, RPMSENSE_TRIGGERPOSTUN, pfx);
|
||||||
|
+ headerFree(h);
|
||||||
|
+ }
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rpmfiFree(fi);
|
||||||
|
}
|
||||||
|
rpmdbIndexIteratorFree(ii);
|
||||||
|
-
|
||||||
|
- if (rpmdbGetIteratorCount(mi)) {
|
||||||
|
- /* Filter triggers and save only trans postun triggers into ts */
|
||||||
|
- while ((trigH = rpmdbNextIterator(mi)) != NULL) {
|
||||||
|
- int tix = 0;
|
||||||
|
- rpmdsTriggers = rpmdsNew(trigH, RPMTAG_TRANSFILETRIGGERNAME, 0);
|
||||||
|
- while ((rpmdsTrigger = rpmdsFilterTi(rpmdsTriggers, tix))) {
|
||||||
|
- if ((rpmdsNext(rpmdsTrigger) >= 0) &&
|
||||||
|
- (rpmdsFlags(rpmdsTrigger) & RPMSENSE_TRIGGERPOSTUN)) {
|
||||||
|
- struct rpmtd_s priorities;
|
||||||
|
-
|
||||||
|
- headerGet(trigH, RPMTAG_TRANSFILETRIGGERPRIORITIES,
|
||||||
|
- &priorities, HEADERGET_MINMEM);
|
||||||
|
- rpmtdSetIndex(&priorities, tix);
|
||||||
|
- rpmtriggersAdd(ts->trigs2run, rpmdbGetIteratorOffset(mi),
|
||||||
|
- tix, *rpmtdGetUint32(&priorities));
|
||||||
|
- }
|
||||||
|
- rpmdsFree(rpmdsTrigger);
|
||||||
|
- tix++;
|
||||||
|
- }
|
||||||
|
- rpmdsFree(rpmdsTriggers);
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- rpmdbFreeIterator(mi);
|
||||||
|
rpmfilesFree(files);
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
11
rpm.spec
11
rpm.spec
@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
%global rpmver 4.16.1.3
|
%global rpmver 4.16.1.3
|
||||||
#global snapver rc1
|
#global snapver rc1
|
||||||
%global rel 10
|
%global rel 11
|
||||||
%global sover 9
|
%global sover 9
|
||||||
|
|
||||||
%global srcver %{rpmver}%{?snapver:-%{snapver}}
|
%global srcver %{rpmver}%{?snapver:-%{snapver}}
|
||||||
@ -80,6 +80,8 @@ Patch108: rpm-4.16.1.3-validate-and-require-subkey-binding-sigs.patch
|
|||||||
Patch109: rpm-4.16.1.3-bump-rpmdb-cookie-hash-to-SHA256-for-FIPS.patch
|
Patch109: rpm-4.16.1.3-bump-rpmdb-cookie-hash-to-SHA256-for-FIPS.patch
|
||||||
Patch110: rpm-4.16.1.3-add-path-query-option.patch
|
Patch110: rpm-4.16.1.3-add-path-query-option.patch
|
||||||
Patch111: rpm-4.16.1.3-skip-recorded-symlinks-in-setperms.patch
|
Patch111: rpm-4.16.1.3-skip-recorded-symlinks-in-setperms.patch
|
||||||
|
Patch112: rpm-4.16.1.3-fix-regression-reading-rpm-v3-pkgs.patch
|
||||||
|
Patch113: rpm-4.16.1.3-fix-spurious-transfiletriggerpostun-execution.patch
|
||||||
|
|
||||||
# These are not yet upstream
|
# These are not yet upstream
|
||||||
Patch906: rpm-4.7.1-geode-i686.patch
|
Patch906: rpm-4.7.1-geode-i686.patch
|
||||||
@ -609,6 +611,11 @@ fi
|
|||||||
%doc doc/librpm/html/*
|
%doc doc/librpm/html/*
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Feb 14 2022 Michal Domonkos <mdomonko@redhat.com> - 4.16.1.3-11
|
||||||
|
- Fix IMA signature lengths assumed constant, take III (#2018937)
|
||||||
|
- Fix regression reading rpm v3 and other rare packages (#2037186)
|
||||||
|
- Fix spurious %transfiletriggerpostun execution (#2023692)
|
||||||
|
|
||||||
* Mon Jan 31 2022 Michal Domonkos <mdomonko@redhat.com> - 4.16.1.3-10
|
* Mon Jan 31 2022 Michal Domonkos <mdomonko@redhat.com> - 4.16.1.3-10
|
||||||
- Address covscan issues in binding sigs validation patch (#1943724)
|
- Address covscan issues in binding sigs validation patch (#1943724)
|
||||||
- Bump hash for rpmdb cookie to SHA256 for FIPS (#2048455)
|
- Bump hash for rpmdb cookie to SHA256 for FIPS (#2048455)
|
||||||
@ -616,7 +623,7 @@ fi
|
|||||||
- Skip recorded symlinks in --setperms (#2025906)
|
- Skip recorded symlinks in --setperms (#2025906)
|
||||||
|
|
||||||
* Mon Dec 13 2021 Michal Domonkos <mdomonko@redhat.com> - 4.16.1.3-9
|
* Mon Dec 13 2021 Michal Domonkos <mdomonko@redhat.com> - 4.16.1.3-9
|
||||||
- Fix-up IMA signature lengths patch (#2018937)
|
- Fix IMA signature lengths assumed constant, take II (#2018937)
|
||||||
|
|
||||||
* Thu Dec 09 2021 Michal Domonkos <mdomonko@redhat.com> - 4.16.1.3-8
|
* Thu Dec 09 2021 Michal Domonkos <mdomonko@redhat.com> - 4.16.1.3-8
|
||||||
- Support hash v8 databases from BDB < 4.6 (#1965147)
|
- Support hash v8 databases from BDB < 4.6 (#1965147)
|
||||||
|
Loading…
Reference in New Issue
Block a user