]> git.saurik.com Git - apt.git/commitdiff
merged from lp:~donkult/apt/sid
authorMichael Vogt <michael.vogt@ubuntu.com>
Thu, 13 Dec 2012 08:25:15 +0000 (09:25 +0100)
committerMichael Vogt <michael.vogt@ubuntu.com>
Thu, 13 Dec 2012 08:25:15 +0000 (09:25 +0100)
apt-pkg/algorithms.cc
apt-pkg/depcache.cc
cmdline/apt-get.cc
debian/changelog
test/integration/test-bug-604222-new-and-autoremove
test/integration/test-bug-618848-always-respect-user-requests

index 1b0161ffd9e58b7c637227b0ea68dee24a6395f8..8cd9d4c6eacc83f49e444911b395baa21bc4662d 100644 (file)
@@ -287,13 +287,13 @@ bool pkgApplyStatus(pkgDepCache &Cache)
                 Cache[I].CandidateVerIter(Cache).Downloadable() == true)
               Cache.MarkInstall(I, true, 0, false);
            else
-              Cache.MarkDelete(I);
+              Cache.MarkDelete(I, false, 0, false);
         }
         break;
 
         // This means removal failed
         case pkgCache::State::HalfInstalled:
-        Cache.MarkDelete(I);
+        Cache.MarkDelete(I, false, 0, false);
         break;
         
         default:
@@ -774,7 +774,7 @@ bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg)
       if (WasKept == true)
         Cache.MarkKeep(Pkg, false, false);
       else
-        Cache.MarkDelete(Pkg);
+        Cache.MarkDelete(Pkg, false, 0, false);
       return false;
    }    
    
@@ -903,7 +903,7 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix)
                OldBreaks < Cache.BrokenCount())
            {
               if (OldVer == 0)
-                 Cache.MarkDelete(I);
+                 Cache.MarkDelete(I, false, 0, false);
               else
                  Cache.MarkKeep(I, false, false);
            }       
@@ -942,7 +942,7 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix)
                     {
                        if (Debug == true)
                           clog << "  Or group remove for " << I.FullName(false) << endl;
-                       Cache.MarkDelete(I);
+                       Cache.MarkDelete(I, false, 0, false);
                        Change = true;
                     }
                  }
@@ -1077,7 +1077,7 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix)
                        {
                           if (Debug == true)
                              clog << "  Removing " << I.FullName(false) << " rather than change " << Start.TargetPkg().FullName(false) << endl;
-                          Cache.MarkDelete(I);
+                          Cache.MarkDelete(I, false, 0, false);
                           if (Counter > 1 && Scores[Pkg->ID] > Scores[I->ID])
                              Scores[I->ID] = Scores[Pkg->ID];
                        }
@@ -1166,7 +1166,7 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix)
                  if (Debug == true)
                     clog << "  Removing " << I.FullName(false) << " because I can't find " << Start.TargetPkg().FullName(false) << endl;
                  if (InOr == false)
-                    Cache.MarkDelete(I);
+                    Cache.MarkDelete(I, false, 0, false);
               }
 
               Change = true;
@@ -1193,7 +1193,7 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix)
                  {
                     if (Debug == true)
                        clog << "  Fixing " << I.FullName(false) << " via remove of " << J->Pkg.FullName(false) << endl;
-                    Cache.MarkDelete(J->Pkg);
+                    Cache.MarkDelete(J->Pkg, false, 0, false);
                  }
               }
               else
@@ -1419,12 +1419,18 @@ bool pkgProblemResolver::ResolveByKeepInternal()
         continue;
       
       // Restart again.
-      if (K == LastStop)
-        return _error->Error("Internal Error, pkgProblemResolver::ResolveByKeep is looping on package %s.",I.FullName(false).c_str());
+      if (K == LastStop) {
+          // I is an iterator based off our temporary package list,
+          // so copy the name we need before deleting the temporary list
+          std::string const LoopingPackage = I.FullName(false);
+          delete[] PList;
+          return _error->Error("Internal Error, pkgProblemResolver::ResolveByKeep is looping on package %s.", LoopingPackage.c_str());
+      }
       LastStop = K;
       K = PList - 1;
-   }   
+   }
 
+   delete[] PList;
    return true;
 }
                                                                        /*}}}*/
index deb8ec21f1af0977ac028e866e2e37fbb7629a4b..2ec346f0b2c04c06562e4d68e7b4e3ea077e7a2a 100644 (file)
@@ -913,11 +913,15 @@ bool pkgDepCache::IsModeChangeOk(ModeList const mode, PkgIterator const &Pkg,
       return true;
 
    StateCache &P = PkgState[Pkg->ID];
+   // not changing the mode is obviously also fine as we might want to call
+   // e.g. MarkInstall multiple times with different arguments for the same package
+   if (P.Mode == mode)
+      return true;
 
    // if previous state was set by user only user can reset it
    if ((P.iFlags & Protected) == Protected)
    {
-      if (unlikely(DebugMarker == true) && P.Mode != mode)
+      if (unlikely(DebugMarker == true))
         std::clog << OutputInDepth(Depth) << "Ignore Mark" << PrintMode(mode)
                   << " of " << Pkg << " as its mode (" << PrintMode(P.Mode)
                   << ") is protected" << std::endl;
@@ -927,7 +931,7 @@ bool pkgDepCache::IsModeChangeOk(ModeList const mode, PkgIterator const &Pkg,
    else if (mode != ModeKeep && Pkg->SelectedState == pkgCache::State::Hold &&
            _config->FindB("APT::Ignore-Hold",false) == false)
    {
-      if (unlikely(DebugMarker == true) && P.Mode != mode)
+      if (unlikely(DebugMarker == true))
         std::clog << OutputInDepth(Depth) << "Hold prevents Mark" << PrintMode(mode)
                   << " of " << Pkg << std::endl;
       return false;
@@ -1178,22 +1182,15 @@ bool pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
               std::clog << OutputInDepth(Depth) << "Installing " << InstPkg.Name()
                         << " as " << Start.DepType() << " of " << Pkg.Name()
                         << std::endl;
-           // now check if we should consider it a automatic dependency or not
-           if(Pkg.Section() && ConfigValueInSubTree("APT::Never-MarkAuto-Sections", Pkg.Section()))
-           {
+           MarkInstall(InstPkg, true, Depth + 1, false, ForceImportantDeps);
+           // now check if we should consider it a automatic dependency or not
+           if(InstPkg->CurrentVer == 0 && Pkg->Section != 0 && ConfigValueInSubTree("APT::Never-MarkAuto-Sections", Pkg.Section()))
+           {
               if(DebugAutoInstall == true)
                  std::clog << OutputInDepth(Depth) << "Setting NOT as auto-installed (direct "
                             << Start.DepType() << " of pkg in APT::Never-MarkAuto-Sections)" << std::endl;
-              MarkInstall(InstPkg,true,Depth + 1, true);
-           }
-           else 
-           {
-              // mark automatic dependency
-              MarkInstall(InstPkg,true,Depth + 1, false, ForceImportantDeps);
-              // Set the autoflag, after MarkInstall because MarkInstall unsets it
-              if (InstPkg->CurrentVer == 0)
-                 PkgState[InstPkg->ID].Flags |= Flag::Auto;
-           }
+              MarkAuto(InstPkg, false);
+           }
         }
         continue;
       }
index 6890b71209a4f55f0f413bbd7f986310cb09cb23..1bb981b20566624355eebc21d6e95158ee1f37e4 100644 (file)
@@ -1736,7 +1736,7 @@ bool DoAutomaticRemove(CacheFile &Cache)
         {
            if(Pkg.CurrentVer() != 0 && 
               Pkg->CurrentState != pkgCache::State::ConfigFiles)
-              Cache->MarkDelete(Pkg, purgePkgs);
+              Cache->MarkDelete(Pkg, purgePkgs, 0, false);
            else
               Cache->MarkKeep(Pkg, false, false);
         }
@@ -1750,7 +1750,7 @@ bool DoAutomaticRemove(CacheFile &Cache)
            {
               if (Pkg.CandVersion() != 0)
                  tooMuch.insert(Pkg);
-              Cache->MarkDelete(Pkg, false);
+              Cache->MarkDelete(Pkg, false, 0, false);
            }
            // only show stuff in the list that is not yet marked for removal
            else if(hideAutoRemove == false && Cache[Pkg].Delete() == false)
@@ -1787,7 +1787,7 @@ bool DoAutomaticRemove(CacheFile &Cache)
                    continue;
                 if (Debug == true)
                    std::clog << "Save " << Pkg << " as another installed garbage package depends on it" << std::endl;
-                Cache->MarkInstall(Pkg, false);
+                Cache->MarkInstall(Pkg, false, 0, false);
                 if (hideAutoRemove == false)
                    ++autoRemoveCount;
                 tooMuch.erase(Pkg);
index 42d601d3b2255df473fd7bd154f5443a210394a7..915c25f42b6899950471d1e58364c3976c9db3c5 100644 (file)
@@ -13,10 +13,24 @@ apt (0.9.7.7) UNRELEASED; urgency=low
     - do not do lock-step configuration for a M-A:same package if it isn't
       unpacked yet in SmartConfigure and do not unpack a M-A:same package
       again in SmartUnPack if we have already configured it (LP: #1062503)
+  * apt-pkg/depcache.cc:
+    - don't call MarkInstall with the FromUser flag set for packages
+      which are dependencies of APT::Never-MarkAuto-Sections matchers
+    - no mode changes should obviously be ok for pkgDepCache::IsModeChangeOk
+  * cmdline/apt-get.cc:
+    - do not call Mark{Install,Delete} from the autoremove code with
+      the FromUser bit set to avoid modifying the auto-installed bit
+  * apt-pkg/algorithms.cc:
+    - ensure pkgProblemResolver calls MarkDelete without FromUser set
+      so that it can't overrule holds and the protection flag
   
   [ Michael Vogt ]
   * change permissions of /var/log/apt/term.log to 0640 (LP: #975199)
 
+  [ Jonathan Thomas ]
+  * apt-pkg/algorithms.cc:
+    - fix package-pointer array memory leak in ResolveByKeepInternal()
+
  -- Michael Vogt <mvo@debian.org>  Tue, 04 Dec 2012 15:57:01 +0100
 
 apt (0.9.7.6) unstable; urgency=low
index 5820fb0dc1809472c673a325e7bcbf1cddcd0a50..ea73c57759031679601ba40d30be8bdbbe91d13b 100755 (executable)
@@ -51,7 +51,7 @@ Building dependency tree...
       MarkInstall libvtk5.4 [ i386 ] < none -> 5.4.2-8 > ( libs ) FU=0
   MarkKeep libvtk5-dev [ i386 ] < none -> 5.4.2-8 > ( libdevel ) FU=0
   MarkKeep libvtk5-dev [ i386 ] < none -> 5.4.2-8 > ( libdevel ) FU=0
-  MarkDelete libvtk5.4 [ i386 ] < none -> 5.4.2-8 > ( libs ) FU=1
+  MarkDelete libvtk5.4 [ i386 ] < none -> 5.4.2-8 > ( libs ) FU=0
 The following extra packages will be installed:
   libavcodec52 libopenal-dev
 The following NEW packages will be installed:
index 5148be6405320bb45b4cbcbe1437244d6a0237e7..1ebadf2800cc22c2bbc39833667e15b7c94cb5d5 100755 (executable)
@@ -16,11 +16,11 @@ setupaptarchive
 testequal 'Reading package lists...
 Building dependency tree...
   MarkDelete libdb4.8 [ i386 ] < 1.0 > ( other ) FU=1
-  MarkDelete exim4-daemon-light [ i386 ] < 1.0 > ( other ) FU=1
+  MarkDelete exim4-daemon-light [ i386 ] < 1.0 > ( other ) FU=0
     MarkInstall exim4-daemon-heavy [ i386 ] < none -> 1.0 > ( other ) FU=0
       Ignore MarkInstall of libdb4.8 [ i386 ] < 1.0 > ( other ) as its mode (Delete) is protected
     MarkDelete exim4-daemon-heavy [ i386 ] < none -> 1.0 > ( other ) FU=0
-  MarkDelete exim4 [ i386 ] < 1.0 > ( other ) FU=1
+  MarkDelete exim4 [ i386 ] < 1.0 > ( other ) FU=0
 The following packages will be REMOVED:
   exim4 exim4-daemon-light libdb4.8
   MarkDelete exim4 [ i386 ] < 1.0 > ( other ) FU=1