Browse Source

get dpkg lock in build-dep if cache was invalid again

Regression introduced in a249b3e6fd798935a02b769149c9791a6fa6ef16, which
in the case of an invalid cache would build the first part unlocked and
later pick up the (still unlocked) cache for further processing, so the
system got never locked and apt would end up complaining about being
unable to release the lock at shutdown.

The far more common case of having a valid cache worked as expected and
hence covered up the problem – especially as tests who would have
noticed it are simulations only, which do not lock.

Closes: 814139
Reported-By: Balint Reczey <balint@balintreczey.hu>
Reported-By: Helmut Grohne <helmut@subdivi.de> on IRC
tags/debian/1.2.3
David Kalnischkies 5 years ago
parent
commit
b6f1b48016
3 changed files with 64 additions and 6 deletions
  1. +1
    -0
      apt-pkg/cachefile.cc
  2. +5
    -6
      apt-private/private-source.cc
  3. +58
    -0
      test/integration/test-bug-814139-pickup-of-different-cache-states

+ 1
- 0
apt-pkg/cachefile.cc View File

@@ -238,6 +238,7 @@ bool pkgCacheFile::AddIndexFile(pkgIndexFile * const File) /*{{{*/
ExternOwner = false;
Map = NULL;
}
_system->UnLock(true);
return true;
}
/*}}}*/


+ 5
- 6
apt-private/private-source.cc View File

@@ -73,8 +73,6 @@ static pkgSrcRecords::Parser *FindSrc(const char *Name,
pkgSrcRecords &SrcRecs,std::string &Src,
CacheFile &Cache)
{
if (Cache.BuildCaches(false) == false)
return nullptr;
std::string VerTag, UserRequestedVerTag;
std::string ArchTag = "";
std::string RelTag = _config->Find("APT::Default-Release");
@@ -321,12 +319,11 @@ bool DoSource(CommandLine &CmdL)
return _error->Error(_("Must specify at least one package to fetch source for"));

CacheFile Cache;
// Read the source list
if (Cache.BuildSourceList() == false)
if (Cache.BuildCaches(false) == false)
return false;
pkgSourceList *List = Cache.GetSourceList();

// Create the text record parsers
pkgSourceList * const List = Cache.GetSourceList();
pkgSrcRecords SrcRecs(*List);
if (_error->PendingError() == true)
return false;
@@ -725,8 +722,11 @@ bool DoBuildDep(CommandLine &CmdL)
VolatileCmdL.size());
}

bool const WantLock = _config->FindB("APT::Get::Print-URIs", false) == false;
if (CmdL.FileList[1] != 0)
{
if (Cache.BuildCaches(WantLock) == false)
return false;
// Create the text record parsers
pkgSrcRecords SrcRecs(*List);
if (_error->PendingError() == true)
@@ -747,7 +747,6 @@ bool DoBuildDep(CommandLine &CmdL)

Cache.AddIndexFile(new debStringPackageIndex(buildDepsPkgFile.str()));

bool WantLock = _config->FindB("APT::Get::Print-URIs", false) == false;
if (Cache.Open(WantLock) == false)
return false;
pkgProblemResolver Fix(Cache.GetDepCache());


+ 58
- 0
test/integration/test-bug-814139-pickup-of-different-cache-states View File

@@ -0,0 +1,58 @@
#!/bin/sh
set -e

TESTDIR="$(readlink -f "$(dirname "$0")")"
. "$TESTDIR/framework"

setupenvironment
configarchitecture 'amd64'

insertinstalledpackage 'build-essential' 'amd64' '1'

buildsimplenativepackage 'foo' 'all' '1' 'stable' 'Build-Depends: bar'
buildsimplenativepackage 'bar' 'all' '1' 'stable'

setupaptarchive

cp rootdir/var/lib/dpkg/status status.backup

testrun() {
cp status.backup rootdir/var/lib/dpkg/status
cleanup
testdpkgnotinstalled 'bar'
testsuccess aptget build-dep foo -y
testdpkginstalled 'bar'
cleanup
testsuccess aptget source foo
testsuccess test -s foo_1.tar.xz -a -s foo_1.dsc
rm foo_1.tar.xz foo_1.dsc
testsuccess test -d foo-1
rm -rf foo-1
cleanup
testsuccess aptget install foo -y
}

msgmsg 'Caches fully up-to-date'
cleanup() {
rm -f rootdir/var/cache/apt/*.bin
testsuccess aptcache gencaches
}
testrun

msgmsg 'pkgcache.bin is missing'
cleanup() {
rm -f rootdir/var/cache/apt/*.bin
testsuccess aptcache gencaches
rm rootdir/var/cache/apt/pkgcache.bin
}
testrun

msgmsg 'Caches are not writeable'
rm rootdir/var/cache/apt/*.bin
addtrap 'prefix' 'chmod 755 rootdir/var/cache/apt;'
chmod 555 rootdir/var/cache/apt
testsuccess aptcache gencaches
cleanup() {
testfilestats "${TMPWORKINGDIRECTORY}/rootdir/var/cache/apt" '%a' '=' '555'
}
testrun

Loading…
Cancel
Save