]> git.saurik.com Git - apt.git/commitdiff
get dpkg lock in build-dep if cache was invalid again
authorDavid Kalnischkies <david@kalnischkies.de>
Wed, 10 Feb 2016 11:26:49 +0000 (12:26 +0100)
committerDavid Kalnischkies <david@kalnischkies.de>
Wed, 10 Feb 2016 12:03:00 +0000 (13:03 +0100)
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
apt-pkg/cachefile.cc
apt-private/private-source.cc
test/integration/test-bug-814139-pickup-of-different-cache-states [new file with mode: 0755]

index 6db0749d4d217cb5f550035a1f48479799c7da41..909da5cb4d6fe25a69aa6707e0317cd8a8e65666 100644 (file)
@@ -238,6 +238,7 @@ bool pkgCacheFile::AddIndexFile(pkgIndexFile * const File)          /*{{{*/
       ExternOwner = false;
       Map = NULL;
    }
       ExternOwner = false;
       Map = NULL;
    }
+   _system->UnLock(true);
    return true;
 }
                                                                        /*}}}*/
    return true;
 }
                                                                        /*}}}*/
index 7126feb7825f91096924706cc27f91ceed1dc8fa..5aaf6f48b4b8eaa3c4cbd20e9e852bc13dbbd6f9 100644 (file)
@@ -73,8 +73,6 @@ static pkgSrcRecords::Parser *FindSrc(const char *Name,
                               pkgSrcRecords &SrcRecs,std::string &Src,
                               CacheFile &Cache)
 {
                               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");
    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;
       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;
       return false;
-   pkgSourceList *List = Cache.GetSourceList();
 
    // Create the text record parsers
 
    // Create the text record parsers
+   pkgSourceList * const List = Cache.GetSourceList();
    pkgSrcRecords SrcRecs(*List);
    if (_error->PendingError() == true)
       return false;
    pkgSrcRecords SrcRecs(*List);
    if (_error->PendingError() == true)
       return false;
@@ -725,8 +722,11 @@ bool DoBuildDep(CommandLine &CmdL)
               VolatileCmdL.size());
    }
 
               VolatileCmdL.size());
    }
 
+   bool const WantLock = _config->FindB("APT::Get::Print-URIs", false) == false;
    if (CmdL.FileList[1] != 0)
    {
    if (CmdL.FileList[1] != 0)
    {
+      if (Cache.BuildCaches(WantLock) == false)
+        return false;
       // Create the text record parsers
       pkgSrcRecords SrcRecs(*List);
       if (_error->PendingError() == true)
       // 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()));
 
 
    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());
    if (Cache.Open(WantLock) == false)
       return false;
    pkgProblemResolver Fix(Cache.GetDepCache());
diff --git a/test/integration/test-bug-814139-pickup-of-different-cache-states b/test/integration/test-bug-814139-pickup-of-different-cache-states
new file mode 100755 (executable)
index 0000000..a6c84d6
--- /dev/null
@@ -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