From 1019b3af3533a0e57ba5ff34baf9ecaee08da90d Mon Sep 17 00:00:00 2001 From: Mike McLean Date: Fri, 27 Sep 2024 16:17:32 -0400 Subject: [PATCH 1/3] fix store offsets when duplicate tags are present For context, see https://pagure.io/koji/issue/4200 If an rpm has duplicate tags in a header, Koji would miscalculate the start of that data store. --- koji/__init__.py | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/koji/__init__.py b/koji/__init__.py index 99667475..44ef330c 100644 --- a/koji/__init__.py +++ b/koji/__init__.py @@ -688,6 +688,7 @@ class RawHeader(object): data = [_ord(x) for x in self.header[8:12]] il = multibyte(data[:4]) dl = multibyte(data[4:8]) + self._store = 16 + il * 16 # read the index (starts at offset 16) index = {} @@ -705,12 +706,8 @@ class RawHeader(object): def dump(self, sig=None): print("HEADER DUMP:") - # calculate start of store - il = len(self.index) - store = 16 + il * 16 - # print("start is: %d" % start) - # print("index length: %d" % il) - print("Store at offset %d (%0x)" % (store, store)) + store = self._store + print("Store at offset %d (0x%0x)" % (store, store)) # sort entries by offset, dtype # also rearrange: tag, dtype, offset, count -> offset, dtype, tag, count order = sorted([(x[2], x[1], x[0], x[3]) for x in six.itervalues(self.index)]) @@ -869,9 +866,7 @@ class RawHeader(object): def _getitem(self, dtype, offset, count, decode=None): if decode is None: decode = self.decode - # calculate start of store - il = len(self.index) - store = 16 + il * 16 + store = self._store pos = store + offset if dtype >= 2 and dtype <= 5: values = [] From 5973d7a13b988425bf360cbf9ab67549e5391121 Mon Sep 17 00:00:00 2001 From: Mike McLean Date: Fri, 27 Sep 2024 16:43:02 -0400 Subject: [PATCH 2/3] show dups in header dump --- koji/__init__.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/koji/__init__.py b/koji/__init__.py index 44ef330c..ac514ab8 100644 --- a/koji/__init__.py +++ b/koji/__init__.py @@ -688,10 +688,10 @@ class RawHeader(object): data = [_ord(x) for x in self.header[8:12]] il = multibyte(data[:4]) dl = multibyte(data[4:8]) - self._store = 16 + il * 16 # read the index (starts at offset 16) - index = {} + index = [] + tag_index = {} for i in range(il): entry = [] for j in range(4): @@ -700,9 +700,14 @@ class RawHeader(object): entry.append(multibyte(data)) # print("Tag: %d, Type: %d, Offset: %x, Count: %d" % tuple(entry)) - index[entry[0]] = entry + index.append(entry) + tag_index[entry[0]] = entry + # in case of duplicate tags, last one wins + self.datalen = dl - self.index = index + self._store = 16 + il * 16 + self._index = index # list + self.index = tag_index # dict def dump(self, sig=None): print("HEADER DUMP:") @@ -710,7 +715,7 @@ class RawHeader(object): print("Store at offset %d (0x%0x)" % (store, store)) # sort entries by offset, dtype # also rearrange: tag, dtype, offset, count -> offset, dtype, tag, count - order = sorted([(x[2], x[1], x[0], x[3]) for x in six.itervalues(self.index)]) + order = sorted([(x[2], x[1], x[0], x[3]) for x in self._index]) # map some rpmtag codes tags = {} if rpm: From 3696539c264d92a275e4d6de167189cd2beade75 Mon Sep 17 00:00:00 2001 From: Mike McLean Date: Fri, 27 Sep 2024 16:56:43 -0400 Subject: [PATCH 3/3] fix misleading comment --- kojihub/kojihub.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/kojihub/kojihub.py b/kojihub/kojihub.py index 223886d4..5ee96adb 100644 --- a/kojihub/kojihub.py +++ b/kojihub/kojihub.py @@ -8185,12 +8185,7 @@ def add_rpm_sig(an_rpm, sighdr): if not sigkey: sigkey = rawhdr.get(koji.RPM_SIGTAG_RSA) else: - # In older rpms, this field in the signature header does not actually match - # sigmd5 (I think rpmlib pulls it from SIGTAG_GPG). Anyway, this - # sanity check fails incorrectly for those rpms, so we fall back to - # a somewhat more expensive check. - # ALSO, for these older rpms, the layout of SIGTAG_GPG is different too, so - # we need to pull that differently as well + # Double check using rpm in case we have somehow misread rpm_path = "%s/%s" % (builddir, koji.pathinfo.rpm(rinfo)) sigmd5, sigkey = _scan_sighdr(sighdr, rpm_path) sigmd5 = koji.hex_string(sigmd5)