summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/deb/dpkgpm.cc1
-rw-r--r--apt-pkg/depcache.cc2
-rw-r--r--apt-private/private-install.h3
-rw-r--r--debian/changelog3
-rwxr-xr-xtest/integration/test-bug-709560-set-candidate-release36
5 files changed, 44 insertions, 1 deletions
diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc
index 8ab0c74c6..918fb32e5 100644
--- a/apt-pkg/deb/dpkgpm.cc
+++ b/apt-pkg/deb/dpkgpm.cc
@@ -1529,6 +1529,7 @@ bool pkgDPkgPM::GoNoABIBreak(APT::Progress::PackageManager *progress)
if(stopOnError)
{
CloseLog();
+ StopPtyMagic();
d->progress->Stop();
return false;
}
diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc
index a06789cdf..f9c891c86 100644
--- a/apt-pkg/depcache.cc
+++ b/apt-pkg/depcache.cc
@@ -1522,7 +1522,7 @@ bool pkgDepCache::SetCandidateRelease(pkgCache::VerIterator TargetVer,
if (itsFine == false)
{
// change the candidate
- Changed.push_back(make_pair(oldCand, TargetVer));
+ Changed.push_back(make_pair(V, TargetVer));
if (SetCandidateRelease(V, TargetRel, Changed) == false)
{
if (stillOr == false)
diff --git a/apt-private/private-install.h b/apt-private/private-install.h
index 439c89712..2187146d3 100644
--- a/apt-private/private-install.h
+++ b/apt-private/private-install.h
@@ -95,6 +95,9 @@ struct TryToInstall {
Cache->GetDepCache()->SetCandidateVersion(s->first);
bool Success = true;
+ // the Changed list contains:
+ // first: "new version"
+ // second: "what-caused the change"
std::list<std::pair<pkgCache::VerIterator, pkgCache::VerIterator> > Changed;
for (std::list<std::pair<pkgCache::VerIterator, std::string> >::const_iterator s = start.begin();
s != start.end(); ++s)
diff --git a/debian/changelog b/debian/changelog
index 246102a02..45ee59a51 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -2,6 +2,9 @@ apt (0.9.13.1~ubuntu2) UNRELEASED; urgency=low
* add autopkgtest support for the integration testsuite
* merge mvo/feature/edit-sources
+ * merge mvo/feature/edit-sources
+ * fix segfault in pkgDepCache::SetCandidateRelease() (closes: #709560)
+ * reset terminal on error (closes: #730795)
-- Michael Vogt <michael.vogt@ubuntu.com> Fri, 29 Nov 2013 14:37:36 +0100
diff --git a/test/integration/test-bug-709560-set-candidate-release b/test/integration/test-bug-709560-set-candidate-release
new file mode 100755
index 000000000..48dc5c382
--- /dev/null
+++ b/test/integration/test-bug-709560-set-candidate-release
@@ -0,0 +1,36 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture 'amd64'
+
+insertpackage 'experimental' 'foo' 'all' '2.0' 'Depends: foo-dep (= 2.1)'
+insertpackage 'experimental' 'foo-dep' 'all' '2.1'
+
+
+(
+cat <<EOF
+Package: *
+Pin: release a=experimental
+Pin-Priority: -10
+EOF
+) > rootdir/etc/apt/preferences
+
+
+setupaptarchive
+
+testequal "Reading package lists...
+Building dependency tree...
+Selected version '2.0' (experimental [all]) for 'foo'
+Selected version '2.1' (experimental [all]) for 'foo-dep' because of 'foo'
+The following extra packages will be installed:
+ foo-dep
+The following NEW packages will be installed:
+ foo foo-dep
+0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
+Inst foo-dep (2.1 experimental [all])
+Inst foo (2.0 experimental [all])
+Conf foo-dep (2.1 experimental [all])
+Conf foo (2.0 experimental [all])" aptget install -q0 -s foo/experimental