浏览代码

Correct broken dselect logic for self-conflicting packages

The previous code seems to have had some confusion over the precedence
of '&&' vs ':'. The new rule is that a Conflicts is violated if the
target package is installed or to be error-preserved ie
would_like_to_install() != 0 - except that we disregard packages which
directly Conflict with themselves.
Ian Jackson 18 年之前
父节点
当前提交
1863d64609
共有 3 个文件被更改,包括 14 次插入2 次删除
  1. 7 0
      ChangeLog
  2. 2 0
      debian/changelog
  3. 5 2
      dselect/pkgdepcon.cc

+ 7 - 0
ChangeLog

@@ -1,3 +1,10 @@
+2008-03-09  Ian Jackson  <ian@davenant.greenend.org.uk>
+
+	* dselect/pkgdepcon.cc (packagelist::deppossatisfied): The new rule
+	is that a Conflicts is violated if the target package is installed
+	or to be error-preserved ie would_like_to_install() != 0 - except
+	that we disregard packages which directly Conflict with themselves.
+
 2008-03-07  Raphael Hertzog  <hertzog@debian.org>
 
 	* scripts/Dpkg/Fields.pm: Import Dpkg::Gettext since we use _g().

+ 2 - 0
debian/changelog

@@ -19,6 +19,8 @@ dpkg (1.14.17) UNRELEASED; urgency=low
     package when debsig-verify is installed. Closes: #311843
   * Fix some small memory leaks. Closes: #469520
     Thanks to Sean Finney.
+  * Correct broken dselect logic for self-conflicting packages.
+    Thanks to Ian Jackson.
 
   [ Raphael Hertzog ]
   * Add a warning displayed by dpkg-genchanges if the current version is

+ 5 - 2
dselect/pkgdepcon.cc

@@ -353,6 +353,8 @@ int packagelist::resolvedepcon(dependency *depends) {
 }
 
 int packagelist::deppossatisfied(deppossi *possi, perpackagestate **fixbyupgrade) {
+  // `satisfied' here for Conflicts and Breaks means that the
+  //  restriction is violated ie that the target package is wanted
   int would;
   pkginfo::pkgwant want= pkginfo::want_purge;
   
@@ -363,8 +365,9 @@ int packagelist::deppossatisfied(deppossi *possi, perpackagestate **fixbyupgrade
     would= 0;
   }
   
-  if (!(possi->up->type == dep_conflicts && possi->up->up == possi->ed) &&
-      possi->up->type == dep_conflicts ? (would != 0) : (would > 0)) {
+  if (possi->up->type == dep_conflicts
+      ? possi->up->up != possi->ed && would != 0
+      : would > 0) {
     // If it's to be installed or left installed, then either it's of
     // the right version, and therefore OK, or a version must have
     // been specified, in which case we don't need to look at the rest