summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Vogt <mvo@ubuntu.com>2016-03-15 12:13:54 (GMT)
committerJulian Andres Klode <jak@debian.org>2016-03-15 17:55:02 (GMT)
commit0390edd5452b081f8efcf412f96d535a1d959457 (patch)
tree51ac5fe01a309f4f59b3bb639bc9b2fc1176a416
parent07ea3af0fe55fdfe976ab847c5c88efd703d1282 (diff)
Fix bug where the problemresolve can put a pkg into a heisenstate
The problemresolver will set the candidate version for pkg P back to the current version if it encounters an impossible to satisfy critical dependency on P. However it did not set the State of the package back as well which lead to a situation where P is neither in Keep,Install,Upgrade,Delete state. Note that this can not be tested via the traditional sh based framework. I added a python-apt based test for this. LP: #1550741 [jak@debian.org: Make the test not fail if apt_pkg cannot be imported]
-rw-r--r--.travis.yml2
-rw-r--r--apt-pkg/depcache.cc5
-rw-r--r--debian/tests/control2
-rw-r--r--test/integration/framework1
-rwxr-xr-xtest/integration/test-bug-lp1550741-heisestate48
5 files changed, 56 insertions, 2 deletions
diff --git a/.travis.yml b/.travis.yml
index 75de617..a076d3e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -8,7 +8,7 @@ before_install:
- sudo apt-get update -qq
install:
- sudo ./prepare-release travis-ci
- - sudo apt-get -qq -y -t wily install gettext liblz4-dev
+ - sudo apt-get -qq -y -t wily install gettext liblz4-dev python3-apt
- make
script:
- make test
diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc
index 8281949..dd18305 100644
--- a/apt-pkg/depcache.cc
+++ b/apt-pkg/depcache.cc
@@ -1421,7 +1421,12 @@ bool pkgDepCache::IsInstallOkDependenciesSatisfiableByCandidates(PkgIterator con
// the dependency is critical, but can't be installed, so discard the candidate
// as the problemresolver will trip over it otherwise trying to install it (#735967)
if (Pkg->CurrentVer != 0 && (PkgState[Pkg->ID].iFlags & Protected) != Protected)
+ {
SetCandidateVersion(Pkg.CurrentVer());
+ StateCache &State = PkgState[Pkg->ID];
+ State.Mode = ModeKeep;
+ State.Update(Pkg, *this);
+ }
return false;
}
}
diff --git a/debian/tests/control b/debian/tests/control
index 503fa9d..406679d 100644
--- a/debian/tests/control
+++ b/debian/tests/control
@@ -1,4 +1,4 @@
Tests: run-tests
Restrictions: allow-stderr
Depends: @, @builddeps@, fakeroot, wget, stunnel4, lsof, db-util, gnupg, gnupg2,
- libfile-fcntllock-perl
+ libfile-fcntllock-perl, python3-apt
diff --git a/test/integration/framework b/test/integration/framework
index b65b0b8..a1db232 100644
--- a/test/integration/framework
+++ b/test/integration/framework
@@ -175,6 +175,7 @@ runapt() {
esac
MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG="$(getaptconfig)" LD_LIBRARY_PATH="${LIBRARYPATH}:${LD_LIBRARY_PATH}" "$CMD" "$@"
}
+runpython3() { runapt command python3 "$@"; }
aptconfig() { runapt apt-config "$@"; }
aptcache() { runapt apt-cache "$@"; }
aptcdrom() { runapt apt-cdrom "$@"; }
diff --git a/test/integration/test-bug-lp1550741-heisestate b/test/integration/test-bug-lp1550741-heisestate
new file mode 100755
index 0000000..76fdcb8
--- /dev/null
+++ b/test/integration/test-bug-lp1550741-heisestate
@@ -0,0 +1,48 @@
+#!/bin/sh
+set -e
+
+TESTDIR="$(readlink -f "$(dirname "$0")")"
+. "$TESTDIR/framework"
+
+setupenvironment
+configarchitecture 'amd64'
+
+insertpackage 'unstable' 'module-init-tools' 'amd64' '1.0' 'Depends: libkmod2 (= 21-1)'
+insertpackage 'unstable' 'libkmod2' 'amd64' '0.22-1'
+insertinstalledpackage 'module-init-tools' 'amd64' '0.1'
+
+setupaptarchive
+
+# this test only works if the python-apt is build against the same
+# ABI version as the apt we are testing here
+PYAPT_LIB_VER=$(runpython3 -c 'import apt_pkg;print(apt_pkg.LIB_VERSION)' 2>/dev/null || true)
+if [ ! -f $LIBRARYPATH/libapt-pkg.so.$PYAPT_LIB_VER ]; then
+ msgskip "python-apt build with the wrong library version: $PYAPT_LIB_VER"
+ exit 0
+fi
+
+# we can not test this using our normal sh tests
+cat > test.py <<EOF
+#!/usr/bin/python3
+import sys
+import apt
+def in_valid_state(pkg):
+ return (pkg.marked_keep or
+ pkg.marked_install or
+ pkg.marked_upgrade or
+ pkg.marked_delete or
+ pkg.marked_downgrade or
+ pkg.marked_reinstall)
+# main
+cache=apt.Cache()
+pkgname="module-init-tools"
+if not in_valid_state(cache[pkgname]):
+ print("the test is broken, %s should be in a valid state" % pkgname)
+ sys.exit(99)
+cache.upgrade(True)
+if not in_valid_state(cache[pkgname]):
+ print("package %s is in a heisen-state" % pkgname)
+ sys.exit(2)
+
+EOF
+testsuccess runpython3 test.py