- verify some properties of replaced and wrong-colored files (#528383)
- only list packages that would be generated on spec query (#693338) - preferred color packages should be erased last (#680261) - fix leaks when freeing a populated transaction set - take file state into account for file dependencies
This commit is contained in:
parent
629d3eaa76
commit
5a40a02fce
51
rpm-4.9.0-fstate-deps.patch
Normal file
51
rpm-4.9.0-fstate-deps.patch
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
commit 566a15c9c08aa593d05e2f55f1c171a48bc1b1bc
|
||||||
|
Author: Panu Matilainen <pmatilai@redhat.com>
|
||||||
|
Date: Wed Mar 9 09:39:32 2011 +0200
|
||||||
|
|
||||||
|
Take file state into account for file dependencies
|
||||||
|
- Files which are not installed, have been replaced or are of wrong
|
||||||
|
color can not actually satisfy a dependency despite what the package's
|
||||||
|
file list says.
|
||||||
|
- This prevents breaking the system despite seemingly correct dependencies
|
||||||
|
in some situations, such as on multilib systems where a colored
|
||||||
|
files can appear to be shared between primary and secondary architecture
|
||||||
|
packages, but only the file from primary arch package is physically
|
||||||
|
present, and removing the primary arch package would remove the
|
||||||
|
file and silently break any dependencies on such files in practise.
|
||||||
|
Similarly replaced files become owned by the replacing package in
|
||||||
|
practise, so the original package whose files were replaced can no
|
||||||
|
longer satisfy dependency on those files.
|
||||||
|
|
||||||
|
diff --git a/lib/depends.c b/lib/depends.c
|
||||||
|
index 4daa512..69aecbb 100644
|
||||||
|
--- a/lib/depends.c
|
||||||
|
+++ b/lib/depends.c
|
||||||
|
@@ -345,12 +345,25 @@ static int rpmdbProvides(rpmts ts, depCache dcache, rpmds dep)
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* See if a filename dependency is a real file in some package */
|
||||||
|
+ /*
|
||||||
|
+ * See if a filename dependency is a real file in some package,
|
||||||
|
+ * taking file state into account: replaced, wrong colored and
|
||||||
|
+ * not installed files can not satisfy a dependency.
|
||||||
|
+ */
|
||||||
|
if (Name[0] == '/') {
|
||||||
|
mi = rpmtsPrunedIterator(ts, RPMDBI_BASENAMES, Name);
|
||||||
|
while ((h = rpmdbNextIterator(mi)) != NULL) {
|
||||||
|
- rpmdsNotify(dep, "(db files)", rc);
|
||||||
|
- break;
|
||||||
|
+ int fs = RPMFILE_STATE_MISSING;
|
||||||
|
+ struct rpmtd_s states;
|
||||||
|
+ if (headerGet(h, RPMTAG_FILESTATES, &states, HEADERGET_MINMEM)) {
|
||||||
|
+ rpmtdSetIndex(&states, rpmdbGetIteratorFileNum(mi));
|
||||||
|
+ fs = rpmtdGetNumber(&states);
|
||||||
|
+ rpmtdFreeData(&states);
|
||||||
|
+ }
|
||||||
|
+ if (fs == RPMFILE_STATE_NORMAL || fs == RPMFILE_STATE_NETSHARED) {
|
||||||
|
+ rpmdsNotify(dep, "(db files)", rc);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
rpmdbFreeIterator(mi);
|
||||||
|
}
|
41
rpm-4.9.0-fstate-verify.patch
Normal file
41
rpm-4.9.0-fstate-verify.patch
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
commit ee0ae58b442c5f79967a0d0580144b5c84e0c888
|
||||||
|
Author: Panu Matilainen <pmatilai@redhat.com>
|
||||||
|
Date: Wed Mar 9 10:25:29 2011 +0200
|
||||||
|
|
||||||
|
Verify some properties of replaced and wrong-colored files (RhBug:528383)
|
||||||
|
- We can't verify any properties of replaced files, but we can and
|
||||||
|
should still see if it exists at all.
|
||||||
|
- Files skipped due to wrong color are supposed to share some of
|
||||||
|
the attributes with the file that got actually installed, such
|
||||||
|
as permissions and whether it exists at all. Verify what we can
|
||||||
|
instead of silently ignoring.
|
||||||
|
|
||||||
|
diff --git a/lib/verify.c b/lib/verify.c
|
||||||
|
index 3be357d..46210bc 100644
|
||||||
|
--- a/lib/verify.c
|
||||||
|
+++ b/lib/verify.c
|
||||||
|
@@ -70,12 +70,22 @@ int rpmVerifyFile(const rpmts ts, const rpmfi fi,
|
||||||
|
*/
|
||||||
|
switch (rpmfiFState(fi)) {
|
||||||
|
case RPMFILE_STATE_NETSHARED:
|
||||||
|
- case RPMFILE_STATE_REPLACED:
|
||||||
|
case RPMFILE_STATE_NOTINSTALLED:
|
||||||
|
- case RPMFILE_STATE_WRONGCOLOR:
|
||||||
|
case RPMFILE_STATE_MISSING:
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
+ case RPMFILE_STATE_REPLACED:
|
||||||
|
+ /* For replaced files we can only verify if it exists at all */
|
||||||
|
+ flags = RPMVERIFY_LSTATFAIL;
|
||||||
|
+ break;
|
||||||
|
+ case RPMFILE_STATE_WRONGCOLOR:
|
||||||
|
+ /*
|
||||||
|
+ * Files with wrong color are supposed to share some attributes
|
||||||
|
+ * with the actually installed file - verify what we can.
|
||||||
|
+ */
|
||||||
|
+ flags &= ~(RPMVERIFY_FILEDIGEST | RPMVERIFY_FILESIZE |
|
||||||
|
+ RPMVERIFY_MTIME | RPMVERIFY_RDEV);
|
||||||
|
+ break;
|
||||||
|
case RPMFILE_STATE_NORMAL:
|
||||||
|
break;
|
||||||
|
}
|
46
rpm-4.9.0-prefcolor-erase.patch
Normal file
46
rpm-4.9.0-prefcolor-erase.patch
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
commit 4a16d55f1f689ab06e8dd45c50b86e478a732367
|
||||||
|
Author: Panu Matilainen <pmatilai@redhat.com>
|
||||||
|
Date: Tue Mar 8 13:28:32 2011 +0200
|
||||||
|
|
||||||
|
Preferred color pkgs should be erased last
|
||||||
|
- On install we need to queue preferred colored pkgs before others
|
||||||
|
to account for the way colored files get laid on disk. On erase,
|
||||||
|
we need to revert this for the same reason. Most of the time
|
||||||
|
dependencies take care of this, but the queue placement matters in
|
||||||
|
cases such as RhBug:680261 where the order is not dependency-driven.
|
||||||
|
|
||||||
|
diff --git a/lib/order.c b/lib/order.c
|
||||||
|
index 3b0849d..18fe05c 100644
|
||||||
|
--- a/lib/order.c
|
||||||
|
+++ b/lib/order.c
|
||||||
|
@@ -208,6 +208,8 @@ static void addQ(tsortInfo p, tsortInfo * qp, tsortInfo * rp,
|
||||||
|
rpm_color_t prefcolor)
|
||||||
|
{
|
||||||
|
tsortInfo q, qprev;
|
||||||
|
+ rpm_color_t pcolor = rpmteColor(p->te);
|
||||||
|
+ int tailcond;
|
||||||
|
|
||||||
|
/* Mark the package as queued. */
|
||||||
|
p->tsi_reqx = 1;
|
||||||
|
@@ -218,13 +220,18 @@ static void addQ(tsortInfo p, tsortInfo * qp, tsortInfo * rp,
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Find location in queue using metric tsi_qcnt. */
|
||||||
|
+ if (rpmteType(p->te) == TR_ADDED)
|
||||||
|
+ tailcond = (pcolor && pcolor != prefcolor);
|
||||||
|
+ else
|
||||||
|
+ tailcond = (pcolor && pcolor == prefcolor);
|
||||||
|
+
|
||||||
|
+ /* Find location in queue using metric tsi_qcnt and color. */
|
||||||
|
for (qprev = NULL, q = (*qp);
|
||||||
|
q != NULL;
|
||||||
|
qprev = q, q = q->tsi_suc)
|
||||||
|
{
|
||||||
|
- /* XXX Insure preferred color first. */
|
||||||
|
- if (rpmteColor(p->te) != prefcolor && rpmteColor(p->te) != rpmteColor(q->te))
|
||||||
|
+ /* Place preferred color towards queue head on install, tail on erase */
|
||||||
|
+ if (tailcond && (pcolor != rpmteColor(q->te)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (q->tsi_qcnt <= p->tsi_qcnt)
|
30
rpm-4.9.0-rpmts-noref.patch
Normal file
30
rpm-4.9.0-rpmts-noref.patch
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
commit 077d2c850cf0a719d7abacc3256168d60a4ec7bb
|
||||||
|
Author: Panu Matilainen <pmatilai@redhat.com>
|
||||||
|
Date: Tue Apr 5 17:33:12 2011 +0300
|
||||||
|
|
||||||
|
Dont reference transaction set from transaction elements
|
||||||
|
- Elements referencing ts prevents rpmtsFree() from freeing anything
|
||||||
|
unless the caller does rpmtsEmpty() first. Oops. Undo the braindamage
|
||||||
|
from commit 8f7c2d7063df6d1057425d014ce4168d46c5e7d9.
|
||||||
|
|
||||||
|
diff --git a/lib/rpmte.c b/lib/rpmte.c
|
||||||
|
index 860b3f4..dfd7b6f 100644
|
||||||
|
--- a/lib/rpmte.c
|
||||||
|
+++ b/lib/rpmte.c
|
||||||
|
@@ -291,7 +291,6 @@ rpmte rpmteFree(rpmte te)
|
||||||
|
rpmfsFree(te->fs);
|
||||||
|
rpmpsFree(te->probs);
|
||||||
|
rpmteCleanDS(te);
|
||||||
|
- rpmtsFree(te->ts);
|
||||||
|
|
||||||
|
argvFree(te->collections);
|
||||||
|
argvFree(te->lastInCollectionsAny);
|
||||||
|
@@ -308,7 +307,7 @@ rpmte rpmteNew(rpmts ts, Header h, rpmElementType type, fnpyKey key,
|
||||||
|
rpmRelocation * relocs)
|
||||||
|
{
|
||||||
|
rpmte p = xcalloc(1, sizeof(*p));
|
||||||
|
- p->ts = rpmtsLink(ts);
|
||||||
|
+ p->ts = ts;
|
||||||
|
p->type = type;
|
||||||
|
addTE(p, h, key, relocs);
|
||||||
|
switch (type) {
|
23
rpm-4.9.0-specquery-pkgs.patch
Normal file
23
rpm-4.9.0-specquery-pkgs.patch
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
commit 94fb6eed6a7a8957152035c3156974fc00bc4b42
|
||||||
|
Author: Jindrich Novy <jnovy@redhat.com>
|
||||||
|
Date: Mon Apr 4 16:03:11 2011 +0200
|
||||||
|
|
||||||
|
Don't list packages which will not be created in spec query (RhBug:693338)
|
||||||
|
- particularly, while doing "rpm -q --specfile <a spec file>"
|
||||||
|
|
||||||
|
diff --git a/build/spec.c b/build/spec.c
|
||||||
|
index 6861753..353ae47 100644
|
||||||
|
--- a/build/spec.c
|
||||||
|
+++ b/build/spec.c
|
||||||
|
@@ -412,8 +412,10 @@ int rpmspecQuery(rpmts ts, QVA_t qva, const char * arg)
|
||||||
|
|
||||||
|
res = 0;
|
||||||
|
if (qva->qva_source == RPMQV_SPECRPMS) {
|
||||||
|
- for (Package pkg = spec->packages; pkg != NULL; pkg = pkg->next)
|
||||||
|
+ for (Package pkg = spec->packages; pkg != NULL; pkg = pkg->next) {
|
||||||
|
+ if (pkg->fileList == NULL) continue;
|
||||||
|
xx = qva->qva_showPackage(qva, ts, pkg->header);
|
||||||
|
+ }
|
||||||
|
} else {
|
||||||
|
xx = qva->qva_showPackage(qva, ts, spec->sourceHeader);
|
||||||
|
}
|
24
rpm.spec
24
rpm.spec
@ -21,7 +21,7 @@
|
|||||||
Summary: The RPM package management system
|
Summary: The RPM package management system
|
||||||
Name: rpm
|
Name: rpm
|
||||||
Version: %{rpmver}
|
Version: %{rpmver}
|
||||||
Release: %{?snapver:0.%{snapver}.}4%{?dist}
|
Release: %{?snapver:0.%{snapver}.}5%{?dist}
|
||||||
Group: System Environment/Base
|
Group: System Environment/Base
|
||||||
Url: http://www.rpm.org/
|
Url: http://www.rpm.org/
|
||||||
Source0: http://rpm.org/releases/rpm-4.8.x/%{name}-%{srcver}.tar.bz2
|
Source0: http://rpm.org/releases/rpm-4.8.x/%{name}-%{srcver}.tar.bz2
|
||||||
@ -44,6 +44,16 @@ Patch4: rpm-4.8.1-use-gpg2.patch
|
|||||||
Patch100: rpm-4.9.0-manifest-fix.patch
|
Patch100: rpm-4.9.0-manifest-fix.patch
|
||||||
# Recognize elf executables with sticky bit as elf
|
# Recognize elf executables with sticky bit as elf
|
||||||
Patch101: rpm-4.9.0-sticky-elf.patch
|
Patch101: rpm-4.9.0-sticky-elf.patch
|
||||||
|
# Fix leaks on freeing a populated transaction set
|
||||||
|
Patch102: rpm-4.9.0-rpmts-noref.patch
|
||||||
|
# Only list packages that will be built on spec query (#693338)
|
||||||
|
Patch103: rpm-4.9.0-specquery-pkgs.patch
|
||||||
|
# Verify some properties of replaced and wrong-colored files (#528383)
|
||||||
|
Patch104: rpm-4.9.0-fstate-verify.patch
|
||||||
|
# Take file state into account for file dependencies
|
||||||
|
Patch105: rpm-4.9.0-fstate-deps.patch
|
||||||
|
# Preferred color pkgs should be erased last
|
||||||
|
Patch106: rpm-4.9.0-prefcolor-erase.patch
|
||||||
|
|
||||||
# These are not yet upstream
|
# These are not yet upstream
|
||||||
Patch301: rpm-4.6.0-niagara.patch
|
Patch301: rpm-4.6.0-niagara.patch
|
||||||
@ -211,6 +221,11 @@ packages on a system.
|
|||||||
|
|
||||||
%patch100 -p1 -b .manifest-fix
|
%patch100 -p1 -b .manifest-fix
|
||||||
%patch101 -p1 -b .sticky-elf
|
%patch101 -p1 -b .sticky-elf
|
||||||
|
%patch102 -p1 -b .rpmts-noref
|
||||||
|
%patch103 -p1 -b .specquery-pkgs
|
||||||
|
%patch104 -p1 -b .fstate-verify
|
||||||
|
%patch105 -p1 -b .fstate-deps
|
||||||
|
%patch106 -p1 -b .prefcolor-erase
|
||||||
|
|
||||||
%patch301 -p1 -b .niagara
|
%patch301 -p1 -b .niagara
|
||||||
%patch302 -p1 -b .geode
|
%patch302 -p1 -b .geode
|
||||||
@ -424,6 +439,13 @@ exit 0
|
|||||||
%doc COPYING doc/librpm/html/*
|
%doc COPYING doc/librpm/html/*
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Apr 05 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-5
|
||||||
|
- verify some properties of replaced and wrong-colored files (#528383)
|
||||||
|
- only list packages that would be generated on spec query (#693338)
|
||||||
|
- preferred color packages should be erased last (#680261)
|
||||||
|
- fix leaks when freeing a populated transaction set
|
||||||
|
- take file state into account for file dependencies
|
||||||
|
|
||||||
* Tue Mar 22 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-4
|
* Tue Mar 22 2011 Panu Matilainen <pmatilai@redhat.com> - 4.9.0-4
|
||||||
- fix classification of elf executables with sticky bit set (#689182)
|
- fix classification of elf executables with sticky bit set (#689182)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user