diff -dur rpm-5.4.12.orig/lib/rpmal.c rpm-5.4.12/lib/rpmal.c --- rpm-5.4.12.orig/lib/rpmal.c 2012-04-15 23:20:57.000000000 +0200 +++ rpm-5.4.12/lib/rpmal.c 2013-08-13 13:46:28.000000000 +0200 @@ -7,6 +7,10 @@ #include #include /* XXX fnpyKey */ #include +#include + +#define _RPMFI_INTERNAL +#include #include #include @@ -38,6 +42,7 @@ rpmds provides; /*!< Provides: dependencies. */ /*@refcounted@*/ /*@null@*/ rpmbf bf; /*!< File name Bloom filter. */ + rpmfi fi; /*!< File name Bloom filter. */ rpmuint32_t tscolor; /*!< Transaction color bits. */ @@ -149,6 +154,8 @@ alp->provides = NULL; (void)rpmbfFree(alp->bf); alp->bf = NULL; + (void)rpmfiFree(alp->fi); + alp->fi = NULL; } al->list = _free(al->list); @@ -205,6 +212,8 @@ alp->provides = NULL; (void)rpmbfFree(alp->bf); alp->bf = NULL; + (void)rpmfiFree(alp->fi); + alp->fi = NULL; memset(alp, 0, sizeof(*alp)); /* XXX trash and burn */ return; @@ -244,6 +253,7 @@ /*@-assignexpose -castexpose @*/ alp->provides = rpmdsLink(provides, "Provides (rpmalAdd)"); alp->bf = rpmbfLink(rpmfiFNBF(fi)); + alp->fi = rpmfiLink(fi, "file list (rpmalAdd)"); /*@=assignexpose =castexpose @*/ rpmalFreeIndex(al); @@ -350,17 +360,17 @@ rpmalAllFileSatisfiesDepend(const rpmal al, const rpmds ds, alKey * keyp) { fnpyKey * ret = NULL; - int found = 0; + int found = 0, verified = 0; const char * fn; size_t nfn; - int i; + int i, j; if (keyp) *keyp = RPMAL_NOMATCH; if (al == NULL || (fn = rpmdsN(ds)) == NULL || *fn != '/') goto exit; nfn = strlen(fn); - + if (al->list != NULL) /* XXX always true */ for (i = 0; i < al->size; i++) { availablePackage alp = al->list + i; @@ -368,6 +378,24 @@ if (!rpmbfChk(alp->bf, fn, nfn)) continue; + verified = 0; + char * fifn = (char *) malloc(alp->fi->fnlen + 1); + for(j=0; j<(int)alp->fi->fc; j++) { + const char * dn = NULL; + (void) urlPath(alp->fi->dnl[alp->fi->dil[j]], &dn); + strcpy(stpcpy(fifn, dn), alp->fi->bnl[j]); + if (!strcmp(fn, fifn)) { + verified = 1; + break; + } + } + free(fifn); + + if (!verified) { + rpmlog(RPMLOG_DEBUG, " False positive: '%s'\n", fn); + continue; + } + rpmdsNotify(ds, _("(added files)"), 0); ret = (fnpyKey *) xrealloc(ret, (found + 2) * sizeof(*ret));