public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
To: git-commits@fedoraproject.org
Subject: [rpms/python3-rpm] epel9: Merge epel9-next into epel9
Date: Thu, 04 Jun 2026 15:28:15 GMT	[thread overview]
Message-ID: <178058689587.1.11497074657938363385.rpms-python3-rpm-e64f2d8ccd93@fedoraproject.org> (raw)

A new commit has been pushed.

Repo   : rpms/python3-rpm
Branch : epel9
Commit : e64f2d8ccd93ec1d5f91826e7e4aca5a8e2a7401
Author : Miro Hrončok <miro@hroncok.cz>
Date   : 2026-06-04T17:04:00+02:00
Stats  : +254/-2 in 3 file(s)
URL    : https://src.fedoraproject.org/rpms/python3-rpm/c/e64f2d8ccd93ec1d5f91826e7e4aca5a8e2a7401?branch=epel9

Log:
Merge epel9-next into epel9

---
diff --git a/0001-Improve-error-handling-on-keystore-load.patch b/0001-Improve-error-handling-on-keystore-load.patch
new file mode 100644
index 0000000..8d16b69
--- /dev/null
+++ b/0001-Improve-error-handling-on-keystore-load.patch
@@ -0,0 +1,168 @@
+From 38ccf257f278e6b71f73dee9ccb568fe2ad3037a Mon Sep 17 00:00:00 2001
+From: Michal Domonkos <mdomonko@redhat.com>
+Date: Fri, 31 Oct 2025 11:21:28 +0100
+Subject: [PATCH 1/2] Obtain nvr string only once, before the loop
+
+Refactor loadKeyringFromDB() a bit so that the nvr string can be reused
+in multiple places. This will be handy in the next commit.
+
+No functional change.
+---
+ lib/rpmts.c | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+diff --git a/lib/rpmts.c b/lib/rpmts.c
+index 69888acfc..ceb021789 100644
+--- a/lib/rpmts.c
++++ b/lib/rpmts.c
+@@ -327,10 +327,12 @@ static int loadKeyringFromDB(rpmts ts)
+     while ((h = rpmdbNextIterator(mi)) != NULL) {
+ 	struct rpmtd_s pubkeys;
+ 	const char *key;
++	char *nvr;
+ 
+ 	if (!headerGet(h, RPMTAG_PUBKEYS, &pubkeys, HEADERGET_MINMEM))
+ 	   continue;
+ 
++	nvr = headerGetAsString(h, RPMTAG_NVR);
+ 	while ((key = rpmtdNextString(&pubkeys))) {
+ 	    uint8_t *pkt;
+ 	    size_t pktlen;
+@@ -341,9 +343,7 @@ static int loadKeyringFromDB(rpmts ts)
+ 		rpmPubkey *subkeys = rpmGetSubkeys(key, &subkeysCount);
+ 
+ 		if (rpmKeyringAddKey(ts->keyring, key) == 0) {
+-		    char *nvr = headerGetAsString(h, RPMTAG_NVR);
+ 		    rpmlog(RPMLOG_DEBUG, "added key %s to keyring\n", nvr);
+-		    free(nvr);
+ 		    nkeys++;
+ 		}
+ 		rpmPubkeyFree(key);
+@@ -352,12 +352,10 @@ static int loadKeyringFromDB(rpmts ts)
+ 		    rpmPubkey subkey = subkeys[i];
+ 
+ 		    if (rpmKeyringAddKey(ts->keyring, subkey) == 0) {
+-			char *nvr = headerGetAsString(h, RPMTAG_NVR);
+ 			rpmlog(RPMLOG_DEBUG,
+ 			    "added subkey %d of main key %s to keyring\n",
+ 			    i, nvr);
+ 
+-			free(nvr);
+ 			nkeys++;
+ 		    }
+ 		    rpmPubkeyFree(subkey);
+@@ -367,6 +365,7 @@ static int loadKeyringFromDB(rpmts ts)
+ 	    }
+ 	}
+ 	rpmtdFreeData(&pubkeys);
++	free(nvr);
+     }
+     rpmdbFreeIterator(mi);
+ 
+-- 
+2.51.1
+
+
+From c68a557146c594458fb00109863565651cbe8f0a Mon Sep 17 00:00:00 2001
+From: Michal Domonkos <mdomonko@redhat.com>
+Date: Fri, 31 Oct 2025 14:17:25 +0100
+Subject: [PATCH 2/2] Improve error handling on keystore load
+
+Report a failure to load a key, but only as a non-fatal warning so that
+other keys can still be loaded, if any. This behavior is in the spirit
+of #3996, too.
+
+Only emit *one* warning in the keystore_rpmdb, to keep the (code) noise
+down. This covers all three steps (rpmBase64Decode, rpmPubkeyNew and
+rpmKeyringAddKey). We don't need to check if key is NULL since that's
+handled by rpmKeyringAddKey() which returns immediately if that's the
+case.
+
+In the other two backends, we already handle a failure to *read* a key,
+so keep that and just add another warning for a failed addition.
+
+This would be difficult to test (especially in the rpmdb backend) so
+skimping on that here.
+
+(backported from commit 75de4f3eb28c686e7f73b750ca116a8e57b7a690)
+---
+ lib/rpmts.c | 18 +++++++++++++++---
+ 1 file changed, 15 insertions(+), 3 deletions(-)
+
+diff --git a/lib/rpmts.c b/lib/rpmts.c
+index ceb021789..f6fe38c7a 100644
+--- a/lib/rpmts.c
++++ b/lib/rpmts.c
+@@ -281,6 +281,7 @@ static int loadKeyringFromFiles(rpmts ts)
+     }
+ 
+     for (char **f = files; *f; f++) {
++	int rc = 1;
+ 	int subkeysCount, i;
+ 	rpmPubkey *subkeys;
+ 	rpmPubkey key = rpmPubkeyRead(*f);
+@@ -289,7 +290,7 @@ static int loadKeyringFromFiles(rpmts ts)
+ 	    rpmlog(RPMLOG_ERR, _("%s: reading of public key failed.\n"), *f);
+ 	    continue;
+ 	}
+-	if (rpmKeyringAddKey(ts->keyring, key) == 0) {
++	if ((rc = rpmKeyringAddKey(ts->keyring, key)) == 0) {
+ 	    nkeys++;
+ 	    rpmlog(RPMLOG_DEBUG, "added key %s to keyring\n", *f);
+ 	}
+@@ -305,10 +306,15 @@ static int loadKeyringFromFiles(rpmts ts)
+ 		    i, *f);
+ 
+ 		nkeys++;
++	    } else {
++		rc = 1;
+ 	    }
+ 	    rpmPubkeyFree(subkey);
+ 	}
+ 	free(subkeys);
++
++	if (rc)
++	    rpmlog(RPMLOG_WARNING, _("Could not load key %s\n"), *f);
+     }
+ exit:
+     free(pkpath);
+@@ -334,15 +340,16 @@ static int loadKeyringFromDB(rpmts ts)
+ 
+ 	nvr = headerGetAsString(h, RPMTAG_NVR);
+ 	while ((key = rpmtdNextString(&pubkeys))) {
++	    int rc = 1;
+ 	    uint8_t *pkt;
+ 	    size_t pktlen;
+ 
+-	    if (rpmBase64Decode(key, (void **) &pkt, &pktlen) == 0) {
++	    if ((rc = rpmBase64Decode(key, (void **) &pkt, &pktlen)) == 0) {
+ 		rpmPubkey key = rpmPubkeyNew(pkt, pktlen);
+ 		int subkeysCount, i;
+ 		rpmPubkey *subkeys = rpmGetSubkeys(key, &subkeysCount);
+ 
+-		if (rpmKeyringAddKey(ts->keyring, key) == 0) {
++		if ((rc = rpmKeyringAddKey(ts->keyring, key)) == 0) {
+ 		    rpmlog(RPMLOG_DEBUG, "added key %s to keyring\n", nvr);
+ 		    nkeys++;
+ 		}
+@@ -357,12 +364,17 @@ static int loadKeyringFromDB(rpmts ts)
+ 			    i, nvr);
+ 
+ 			nkeys++;
++		    } else {
++			rc = 1;
+ 		    }
+ 		    rpmPubkeyFree(subkey);
+ 		}
+ 		free(subkeys);
+ 		free(pkt);
+ 	    }
++
++	    if (rc)
++		rpmlog(RPMLOG_WARNING, _("Could not load key %s\n"), nvr);
+ 	}
+ 	rpmtdFreeData(&pubkeys);
+ 	free(nvr);
+-- 
+2.51.1
+

diff --git a/0001-Sort-files-before-passing-to-file-attribute-dependen.patch b/0001-Sort-files-before-passing-to-file-attribute-dependen.patch
new file mode 100644
index 0000000..0f4c312
--- /dev/null
+++ b/0001-Sort-files-before-passing-to-file-attribute-dependen.patch
@@ -0,0 +1,61 @@
+From 08d5e162c2ec3a415a5e657fd8b63f0cdf14ddd8 Mon Sep 17 00:00:00 2001
+From: Chris Riches <chris.riches@nutanix.com>
+Date: Thu, 5 Jun 2025 09:47:02 +0000
+Subject: [PATCH] Sort files before passing to file attribute dependency
+ generators
+
+The fc->fahash map is constructed in parallel, and so ends up with
+non-deterministic ordering of files. Passing this unordered list through
+to file attribute dependency generators can therefore result in
+non-reproducible RPM builds.
+
+In theory, a file attribute generator should only care about each
+individual file it is given, and so the order should not matter.
+However, some generators track state in-between files and so this
+property does not hold. Notably, the python3-rpm-generators in RHEL
+(ab)use this system to apply package-level dependencies that are based
+on the package name rather than the content of any particular file, and
+simply apply this to the first file that they see from a matching
+package. Therefore, different input file orderings will result in
+different files getting the dependency, and therefore different output
+RPMs.
+
+To avoid this, sort the files before passing them to the generators.
+Since the fc->fn array is already sorted by filename, we just need to
+sort the list of indices into that array.
+
+(backported from commit bc0b94026bc5651435819043394cbe9a766a4fd5)
+---
+ build/rpmfc.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/build/rpmfc.c b/build/rpmfc.c
+index c3015ffcb..b5fb611db 100644
+--- a/build/rpmfc.c
++++ b/build/rpmfc.c
+@@ -1010,6 +1010,13 @@ static const struct applyDep_s applyDepTable[] = {
+     { 0, 0, NULL },
+ };
+ 
++static int compareInts(const void *a, const void *b)
++{
++    int ia = *((int*)a);
++    int ib = *((int*)b);
++    return ia > ib ? 1 : ia < ib ? -1 : 0;
++}
++
+ static int applyAttr(rpmfc fc, int aix, const char *aname,
+ 			const struct exclreg_s *excl,
+ 			const struct applyDep_s *dep)
+@@ -1032,6 +1039,8 @@ static int applyAttr(rpmfc fc, int aix, const char *aname,
+ 
+ 	if (!rstreq(cmd, "")) {
+ 	    char *ns = rpmfcAttrMacro(aname, "namespace", NULL);
++	    /* Sort for reproducibility - hashmap was constructed in parallel */
++	    qsort(ixs, n, sizeof(*ixs), compareInts);
+ 	    for (int i = 0; i < n; i++) {
+ 		if (rpmfcHelper(fc, ixs[i], excl, dep->type, dep->tag,
+ 				ns, cmd, callable))
+-- 
+2.51.1
+

diff --git a/python3-rpm.spec b/python3-rpm.spec
index 21f0240..7330b95 100644
--- a/python3-rpm.spec
+++ b/python3-rpm.spec
@@ -31,14 +31,14 @@
 
 %global rpmver 4.16.1.3
 #global snapver rc1
-%global rel 39
+%global rel 40
 %global sover 9
 %global rhelrel %{?snapver:0.%{snapver}.}%{rel}
 %global rel_next %{lua:print(tonumber(rpm.expand("%rel")) + 1)}
 %global rhelrel_next %{?snapver:0.%{snapver}.}%{rel_next}
 
 # Bump this for EPEL only rebuilds, reset when %%rel was bumped
-%global baserelease 1
+%global baserelease 2
 
 %global srcver %{rpmver}%{?snapver:-%{snapver}}
 %global srcdir %{?snapver:testing}%{!?snapver:rpm-%(echo %{rpmver} | cut -d'.' -f1-2).x}
@@ -126,6 +126,8 @@ Patch152: 0001-Fix-a-race-condition-in-brp-strip.patch
 Patch153: 0002-Store-configurable-digest-s-on-packages-from-verific.patch
 Patch154: 0003-Add-support-for-spec-local-file-attributes-and-gener.patch
 Patch155: 0001-Allow-an-optional-override-clock-for-deterministic-t.patch
+Patch156: 0001-Improve-error-handling-on-keystore-load.patch
+Patch157: 0001-Sort-files-before-passing-to-file-attribute-dependen.patch
 
 # These are not yet upstream
 Patch906: rpm-4.7.1-geode-i686.patch
@@ -241,6 +243,8 @@ programs that will manipulate RPM packages and databases.}
 %python3x_package
 %global python3_pkgversion 3.13
 %python3x_package
+%global python3_pkgversion 3.14
+%python3x_package
 
 %prep
 %autosetup -n rpm-%{srcver} %{?with_int_bdb:-a 1} -p1
@@ -305,6 +309,8 @@ pushd python
 %py3_build
 %global python3_pkgversion 3.13
 %py3_build
+%global python3_pkgversion 3.14
+%py3_build
 popd
 
 %install
@@ -319,6 +325,8 @@ pushd python
 %py3_install
 %global python3_pkgversion 3.13
 %py3_install
+%global python3_pkgversion 3.14
+%py3_install
 popd
 
 cat > $RPM_BUILD_ROOT/%{rpmhome}/debugedit << END
@@ -386,6 +394,8 @@ rm -r %{buildroot}%{_sysconfdir}
 %py3_check_import rpm rpm.transaction
 %global python3_pkgversion 3.13
 %py3_check_import rpm rpm.transaction
+%global python3_pkgversion 3.14
+%py3_check_import rpm rpm.transaction
 %if %{with check}
 make check TESTSUITEFLAGS=-j%{_smp_build_ncpus} || (cat tests/rpmtests.log; exit 1)
 # rpm >= 4.16.0 testsuite leaves a read-only tree behind, clean it up
@@ -410,7 +420,20 @@ make clean
 %{python3_sitearch}/rpm/
 %{python3_sitearch}/rpm-%{rpmver}*.egg-info/
 
+%global python3_pkgversion 3.14
+%files -n python%{python3_pkgversion}-rpm
+%license COPYING
+%{python3_sitearch}/rpm/
+%{python3_sitearch}/rpm-%{rpmver}*.egg-info/
+
 %changelog
+* Tue Mar 17 2026 Miro Hrončok <mhroncok@redhat.com> - 4.16.1.3-40.2
+- Add python3.14-rpm
+
+* Fri Nov 21 2025 Michal Domonkos <mdomonko@redhat.com> - 4.16.1.3-40
+- Improve error handling on keystore load (RHEL-114837)
+- Sort files before passing to file attr dependency generators (RHEL-95376)
+
 * Wed Aug 20 2025 Michal Domonkos <mdomonko@redhat.com> - 4.16.1.3-39
 - Allow an optional "override clock" for deterministic timestamps (RHEL-106672)
 

                 reply	other threads:[~2026-06-04 15:28 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=178058689587.1.11497074657938363385.rpms-python3-rpm-e64f2d8ccd93@fedoraproject.org \
    --to=git-commits@fedoraproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox