summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPanu Matilainen <pmatilai@redhat.com>2017-12-15 16:24:50 +0200
committerPanu Matilainen <pmatilai@redhat.com>2018-03-28 14:09:16 +0300
commit7c5a3da0b4f52f40025788efec3689c107768ea3 (patch)
treeb7dc40a54ec984408d8a08eb0219935d3c1e5199
parentaedc90edd22ecf63ae675ae9e78a776eb8fa686e (diff)
downloadrpm-7c5a3da0b4f52f40025788efec3689c107768ea3.tar.gz
Don't fire file triggers on non-installed files
Files that are not actually being installed (or removed) should not fire triggers. Look at the file states on installed packages and file actions on transaction elements to determine this. (cherry picked from commit b22f9609d82625ec451d48515d6d318c5bf72d83)
-rw-r--r--lib/rpmfiles.h7
-rw-r--r--lib/rpmtriggers.c40
2 files changed, 30 insertions, 17 deletions
diff --git a/lib/rpmfiles.h b/lib/rpmfiles.h
index acac6fdf9..1ef55c7c0 100644
--- a/lib/rpmfiles.h
+++ b/lib/rpmfiles.h
@@ -137,14 +137,17 @@ typedef rpmFlags rpmfiFlags;
(RPMFI_NOFILECLASS | RPMFI_NOFILEDEPS | RPMFI_NOFILELANGS | \
RPMFI_NOFILECOLORS | RPMFI_NOFILEVERIFYFLAGS)
-#define RPMFI_FLAGS_ONLY_FILENAMES \
+#define RPMFI_FLAGS_FILETRIGGER \
(RPMFI_NOFILECLASS | RPMFI_NOFILEDEPS | RPMFI_NOFILELANGS | \
RPMFI_NOFILEUSER | RPMFI_NOFILEGROUP | RPMFI_NOFILEMODES | \
RPMFI_NOFILESIZES | RPMFI_NOFILECAPS | RPMFI_NOFILELINKTOS | \
RPMFI_NOFILEDIGESTS | RPMFI_NOFILEMTIMES | RPMFI_NOFILERDEVS | \
- RPMFI_NOFILEINODES | RPMFI_NOFILESTATES | RPMFI_NOFILECOLORS | \
+ RPMFI_NOFILEINODES | RPMFI_NOFILECOLORS | \
RPMFI_NOFILEVERIFYFLAGS | RPMFI_NOFILEFLAGS)
+#define RPMFI_FLAGS_ONLY_FILENAMES \
+ (RPMFI_FLAGS_FILETRIGGER | RPMFI_NOFILESTATES)
+
typedef enum rpmFileIter_e {
RPMFI_ITER_FWD = 0,
RPMFI_ITER_BACK = 1,
diff --git a/lib/rpmtriggers.c b/lib/rpmtriggers.c
index 08ed14e0b..7935360f0 100644
--- a/lib/rpmtriggers.c
+++ b/lib/rpmtriggers.c
@@ -11,6 +11,7 @@
#include "lib/rpmdb_internal.h"
#include "lib/rpmds_internal.h"
#include "lib/rpmfi_internal.h"
+#include "lib/rpmte_internal.h"
#include "lib/rpmchroot.h"
#define TRIGGER_PRIORITY_BOUND 10000
@@ -116,12 +117,15 @@ void rpmtriggersPrepPostUnTransFileTrigs(rpmts ts, rpmte te)
char pfx[keylen + 1];
memcpy(pfx, key, keylen);
pfx[keylen] = '\0';
- /* Check if file trigger matches any file in this te */
+ /* Check if file trigger matches any installed file in this te */
rpmfi fi = rpmfilesFindPrefix(files, pfx);
- if (rpmfiFC(fi) > 0) {
- /* If yes then store it */
- rpmdbAppendIterator(mi, rpmdbIndexIteratorPkgOffsets(ii),
+ while (rpmfiNext(fi) >= 0) {
+ if (RPMFILE_IS_INSTALLED(rpmfiFState(fi))) {
+ /* If yes then store it */
+ rpmdbAppendIterator(mi, rpmdbIndexIteratorPkgOffsets(ii),
rpmdbIndexIteratorNumPkgs(ii));
+ break;
+ }
}
rpmfiFree(fi);
}
@@ -230,7 +234,7 @@ static rpmfiles rpmtsNextFiles(rpmts ts, rpmdbMatchIterator mi)
h = rpmdbNextIterator(mi);
if (h) {
files = rpmfilesNew(pool, h, RPMTAG_BASENAMES,
- RPMFI_FLAGS_ONLY_FILENAMES);
+ RPMFI_FLAGS_FILETRIGGER);
}
}
@@ -243,17 +247,19 @@ typedef struct matchFilesIter_s {
rpmds rpmdsTrigger;
rpmfiles files;
rpmfi fi;
+ rpmfs fs;
const char *pfx;
rpmdbMatchIterator pi;
packageHash tranPkgs;
} *matchFilesIter;
-static matchFilesIter matchFilesIterator(rpmds trigger, rpmfiles files)
+static matchFilesIter matchFilesIterator(rpmds trigger, rpmfiles files, rpmte te)
{
matchFilesIter mfi = xcalloc(1, sizeof(*mfi));
rpmdsInit(trigger);
mfi->rpmdsTrigger = trigger;
mfi->files = rpmfilesLink(files);
+ mfi->fs = rpmteGetFileStates(te);
return mfi;
}
@@ -289,11 +295,13 @@ static const char *matchFilesNext(matchFilesIter mfi)
if (!mfi->ts)
do {
/* Get next file from mfi->fi */
- rpmfiNext(mfi->fi);
- matchFile = rpmfiFN(mfi->fi);
- if (strlen(matchFile))
- break;
matchFile = NULL;
+ while (matchFile == NULL && rpmfiNext(mfi->fi) >= 0) {
+ if (!XFA_SKIPPING(rpmfsGetAction(mfi->fs, rpmfiFX(mfi->fi))))
+ matchFile = rpmfiFN(mfi->fi);
+ }
+ if (matchFile)
+ break;
/* If we are done with current mfi->fi, create mfi->fi for next prefix */
fx = rpmdsNext(mfi->rpmdsTrigger);
@@ -305,11 +313,13 @@ static const char *matchFilesNext(matchFilesIter mfi)
/* or we iterate over files in rpmdb */
else
do {
- rpmfiNext(mfi->fi);
- matchFile = rpmfiFN(mfi->fi);
- if (strlen(matchFile))
- break;
matchFile = NULL;
+ while (matchFile == NULL && rpmfiNext(mfi->fi) >= 0) {
+ if (RPMFILE_IS_INSTALLED(rpmfiFState(mfi->fi)))
+ matchFile = rpmfiFN(mfi->fi);
+ }
+ if (matchFile)
+ break;
/* If we are done with current mfi->fi, create mfi->fi for next package */
rpmfilesFree(mfi->files);
@@ -395,7 +405,7 @@ static int runHandleTriggersInPkg(rpmts ts, rpmte te, Header h,
case 0:
/* Create iterator over files in te that this trigger matches */
files = rpmteFiles(te);
- mfi = matchFilesIterator(rpmdsTrigger, files);
+ mfi = matchFilesIterator(rpmdsTrigger, files, te);
break;
case 1:
/* Create iterator over files in ts that this trigger matches */