diff options
author | Panu Matilainen <pmatilai@redhat.com> | 2017-12-15 16:24:50 +0200 |
---|---|---|
committer | Panu Matilainen <pmatilai@redhat.com> | 2018-03-28 14:09:16 +0300 |
commit | 7c5a3da0b4f52f40025788efec3689c107768ea3 (patch) | |
tree | b7dc40a54ec984408d8a08eb0219935d3c1e5199 | |
parent | aedc90edd22ecf63ae675ae9e78a776eb8fa686e (diff) | |
download | rpm-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.h | 7 | ||||
-rw-r--r-- | lib/rpmtriggers.c | 40 |
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 */ |