[Aptitude-svn-commit] r4011 - in branches/aptitude-0.3/aptitude: . src/generic

Daniel Burrows dburrows at costa.debian.org
Wed Aug 31 16:49:54 UTC 2005


Author: dburrows
Date: Wed Aug 31 16:49:52 2005
New Revision: 4011

Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/src/generic/apt.cc
   branches/aptitude-0.3/aptitude/src/generic/apt.h
   branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver_universe.h
Log:
Don't crash if dependency problems exist on startup.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Wed Aug 31 16:49:52 2005
@@ -1,5 +1,10 @@
 2005-08-31  Daniel Burrows  <dburrows at debian.org>
 
+	* src/generic/aptitude_resolver_universe.h, src/generic/apt.cc, src/generic/apt.h:
+
+	  Pass the package cache into surrounding_or when calling it
+	  before apt_cache_file is initialized, to avoid crashes.
+
 	* src/generic/apt.h:
 
 	  Add a const qualifier that might not matter but that certainly

Modified: branches/aptitude-0.3/aptitude/src/generic/apt.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/apt.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/generic/apt.cc	Wed Aug 31 16:49:52 2005
@@ -407,12 +407,16 @@
 
 void surrounding_or(pkgCache::DepIterator dep,
 		    pkgCache::DepIterator &start,
-		    pkgCache::DepIterator &end)
+		    pkgCache::DepIterator &end,
+		    pkgCache *cache)
 {
+  if(cache == NULL)
+    cache = *apt_cache_file;
+
   if(cached_surrounding_or == NULL)
     {
-      cached_surrounding_or = new pkgCache::Dependency *[(*apt_cache_file)->Head().DependsCount];
-      for(unsigned long i = 0; i<(*apt_cache_file)->Head().DependsCount; ++i)
+      cached_surrounding_or = new pkgCache::Dependency *[cache->Head().DependsCount];
+      for(unsigned long i = 0; i<cache->Head().DependsCount; ++i)
 	cached_surrounding_or[i] = 0;
     }
 
@@ -425,7 +429,7 @@
       pkgCache::Dependency *unmunged
 	= (pkgCache::Dependency *) (((unsigned long) s) & ~0x1UL);
 
-      start = pkgCache::DepIterator(*apt_cache_file, unmunged);
+      start = pkgCache::DepIterator(*cache, unmunged);
       end = start;
 
       while(end->CompareOp & pkgCache::Dep::Or)
@@ -651,12 +655,13 @@
  *  subsuming element in the OR group containing d1.
  */
 static bool or_group_subsumes(const pkgCache::DepIterator &d1,
-			      const pkgCache::DepIterator &d2)
+			      const pkgCache::DepIterator &d2,
+			      pkgCache *cache)
 {
   pkgCache::DepIterator start1, end1, start2, end2;
 
-  surrounding_or(d1, start1, end1);
-  surrounding_or(d2, start2, end2);
+  surrounding_or(d1, start1, end1, cache);
+  surrounding_or(d2, start2, end2, cache);
 
   for(pkgCache::DepIterator i = start1; i != end1; ++i)
     {
@@ -728,7 +733,8 @@
 	  while(!d2.end())
 	    {
 	      if(d2->Type == pkgCache::Dep::Recommends &&
-		 or_group_subsumes(d2, d) || or_group_subsumes(d, d2))
+		 or_group_subsumes(d2, d, &cache->GetCache()) ||
+		 or_group_subsumes(d, d2, &cache->GetCache()))
 		{
 		  pkgCache::DepIterator dtmp = d;
 		  while(!dtmp.end() && dtmp->CompareOp & pkgCache::Dep::Or)
@@ -766,7 +772,7 @@
     case uncached:
       {
 	pkgCache::DepIterator start, end;
-	surrounding_or(d, start, end);
+	surrounding_or(d, start, end, &cache->GetCache());
 
 	bool rval = internal_is_interesting_dep(start, cache);
 

Modified: branches/aptitude-0.3/aptitude/src/generic/apt.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/apt.h	(original)
+++ branches/aptitude-0.3/aptitude/src/generic/apt.h	Wed Aug 31 16:49:52 2005
@@ -135,10 +135,13 @@
 /** Finds the OR group enclosing the given (forward or reverse) dependency.
  *
  *  The range [start,end) is the OR group when this terminates.
+ *  \param cache the cache file in which to operate, or \b NULL to use
+ *               apt_cache_file.
  */
 void surrounding_or(pkgCache::DepIterator dep,
 		    pkgCache::DepIterator &start,
-		    pkgCache::DepIterator &end);
+		    pkgCache::DepIterator &end,
+		    pkgCache *cache = NULL);
 
 
 /** \return true if pkg is suggested by another package which will be

Modified: branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver_universe.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver_universe.h	(original)
+++ branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver_universe.h	Wed Aug 31 16:49:52 2005
@@ -210,7 +210,7 @@
       {
 	// Throw away the end, since it's not necessary.
 	pkgCache::DepIterator end;
-	surrounding_or(dep, start, end);
+	surrounding_or(dep, start, end, &cache->GetCache());
       }
     else
       // Ignore ORs and just use the selected conflict.



More information about the Aptitude-svn-commit mailing list