From 7c5a3da0b4f52f40025788efec3689c107768ea3 Mon Sep 17 00:00:00 2001 From: Panu Matilainen Date: Fri, 15 Dec 2017 16:24:50 +0200 Subject: 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) --- lib/rpmfiles.h | 7 +++++-- 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 */ -- cgit v1.2.1