7fefa01
From 2d85f74afc3ccfa584dd8f0981673ff2b06277d1 Mon Sep 17 00:00:00 2001
7fefa01
Message-Id: <2d85f74afc3ccfa584dd8f0981673ff2b06277d1.1643803240.git.pmatilai@redhat.com>
7fefa01
From: Panu Matilainen <pmatilai@redhat.com>
7fefa01
Date: Wed, 2 Feb 2022 13:46:23 +0200
7fefa01
Subject: [PATCH] Really fix spurious %transfiletriggerpostun execution
7fefa01
 (RhBug:2023311)
7fefa01
7fefa01
Commit b3d672a5523dfec033160e5cc866432a0e808649 got the base reasoning
7fefa01
in the ballpark but the code all wrong, introducing a severe performance
7fefa01
regression without actually fixing what it claimed to.
7fefa01
7fefa01
The missing incredient is actually comparing the current prefix with the
7fefa01
triggers in matched package (trying to describe this makes my head
7fefa01
spin): a package may have multiple triggers on multiple prefixes and
7fefa01
we need to make sure we only execute triggers of this type, from this
7fefa01
prefix.
7fefa01
7fefa01
Fixes: b3d672a5523dfec033160e5cc866432a0e808649
7fefa01
---
7fefa01
 lib/rpmtriggers.c | 11 +++++++----
7fefa01
 1 file changed, 7 insertions(+), 4 deletions(-)
7fefa01
7fefa01
diff --git a/lib/rpmtriggers.c b/lib/rpmtriggers.c
7fefa01
index 6fe4db65d..3f8fa22d0 100644
7fefa01
--- a/lib/rpmtriggers.c
7fefa01
+++ b/lib/rpmtriggers.c
7fefa01
@@ -97,14 +97,16 @@ static void rpmtriggersSortAndUniq(rpmtriggers trigs)
7fefa01
     }
7fefa01
 }
7fefa01
 
7fefa01
-static void addTriggers(rpmts ts, Header trigH, rpmsenseFlags filter)
7fefa01
+static void addTriggers(rpmts ts, Header trigH, rpmsenseFlags filter,
7fefa01
+			const char *prefix)
7fefa01
 {
7fefa01
     int tix = 0;
7fefa01
     rpmds ds;
7fefa01
     rpmds triggers = rpmdsNew(trigH, RPMTAG_TRANSFILETRIGGERNAME, 0);
7fefa01
 
7fefa01
     while ((ds = rpmdsFilterTi(triggers, tix))) {
7fefa01
-	if ((rpmdsNext(ds) >= 0) && (rpmdsFlags(ds) & filter)) {
7fefa01
+	if ((rpmdsNext(ds) >= 0) && (rpmdsFlags(ds) & filter) &&
7fefa01
+		strcmp(prefix, rpmdsN(ds)) == 0) {
7fefa01
 	    struct rpmtd_s priorities;
7fefa01
 
7fefa01
 	    if (headerGet(trigH, RPMTAG_TRANSFILETRIGGERPRIORITIES,
7fefa01
@@ -141,12 +143,13 @@ void rpmtriggersPrepPostUnTransFileTrigs(rpmts ts, rpmte te)
7fefa01
 	    if (RPMFILE_IS_INSTALLED(rpmfiFState(fi))) {
7fefa01
 		unsigned int npkg = rpmdbIndexIteratorNumPkgs(ii);
7fefa01
 		const unsigned int *offs = rpmdbIndexIteratorPkgOffsets(ii);
7fefa01
-		/* Save any matching postun triggers */
7fefa01
+		/* Save any postun triggers matching this prefix */
7fefa01
 		for (int i = 0; i < npkg; i++) {
7fefa01
 		    Header h = rpmdbGetHeaderAt(rpmtsGetRdb(ts), offs[i]);
7fefa01
-		    addTriggers(ts, h, RPMSENSE_TRIGGERPOSTUN);
7fefa01
+		    addTriggers(ts, h, RPMSENSE_TRIGGERPOSTUN, pfx);
7fefa01
 		    headerFree(h);
7fefa01
 		}
7fefa01
+		break;
7fefa01
 	    }
7fefa01
 	}
7fefa01
 	rpmfiFree(fi);
7fefa01
-- 
7fefa01
2.34.1
7fefa01