Browse Source

Fixed segfault in re-install/upgrade condition
Author: jgg
Date: 1999-04-28 22:48:44 GMT
Fixed segfault in re-install/upgrade condition

Arch Librarian 22 years ago
parent
commit
813c8eea95
4 changed files with 43 additions and 11 deletions
  1. 7 2
      apt-pkg/acquire-item.cc
  2. 25 4
      apt-pkg/algorithms.cc
  3. 7 1
      apt-pkg/depcache.cc
  4. 4 4
      apt-pkg/pkgcachegen.h

+ 7 - 2
apt-pkg/acquire-item.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
-// $Id: acquire-item.cc,v 1.28 1999/04/20 05:59:29 jgg Exp $
+// $Id: acquire-item.cc,v 1.29 1999/04/28 22:48:44 jgg Exp $
 /* ######################################################################
 
    Acquire Item - Item to acquire
@@ -346,7 +346,12 @@ pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
                StoreFilename(StoreFilename), Vf(Version.FileList())
 {
    Retries = _config->FindI("Acquire::Retries",0);
-      
+
+   if (Version.Arch() == 0)
+      _error->Error("I wasn't able to locate file for the %s package. "
+		    "This might mean you need to manually fix this package. (due to missing arch)",
+		    Version.ParentPkg().Name());
+   
    // Generate the final file name as: package_version_arch.deb
    StoreFilename = QuoteString(Version.ParentPkg().Name(),"_:") + '_' +
                    QuoteString(Version.VerStr(),"_:") + '_' +

+ 25 - 4
apt-pkg/algorithms.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
-// $Id: algorithms.cc,v 1.16 1999/02/05 02:26:00 jgg Exp $
+// $Id: algorithms.cc,v 1.17 1999/04/28 22:48:45 jgg Exp $
 /* ######################################################################
 
    Algorithms - A set of misc algorithms
@@ -169,16 +169,37 @@ bool pkgApplyStatus(pkgDepCache &Cache)
       if (I->InstState == pkgCache::State::ReInstReq ||
 	  I->InstState == pkgCache::State::HoldReInstReq)
       {
-	 Cache.MarkKeep(I);
+	 if (I.CurrentVer().Downloadable() == true)
+	    Cache.MarkKeep(I);
+	 else
+	 {
+	    // Is this right? Will dpkg choke on an upgrade?
+	    if (Cache[I].CandidateVerIter(Cache).Downloadable() == true)
+	       Cache.MarkInstall(I);
+	    else
+	       return _error->Error("The package %s needs to be reinstalled, "
+				    "but I can't find an archive for it.",I.Name());
+	 }
+	 
 	 continue;
       }
       
       switch (I->CurrentState)
       {
-	 // This means installation failed somehow
+	 /* This means installation failed somehow - it does not need to be
+	    re-unpacked (probably) */
 	 case pkgCache::State::UnPacked:
 	 case pkgCache::State::HalfConfigured:
-	 Cache.MarkKeep(I);
+	 if (I.CurrentVer().Downloadable() == true || 
+	     I.State() != pkgCache::PkgIterator::NeedsUnpack)
+	    Cache.MarkKeep(I);
+	 else
+	 {
+	    if (Cache[I].CandidateVerIter(Cache).Downloadable() == true)
+	       Cache.MarkInstall(I);
+	    else
+	       Cache.MarkDelete(I);
+	 }
 	 break;
 
 	 // This means removal failed

+ 7 - 1
apt-pkg/depcache.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
-// $Id: depcache.cc,v 1.17 1999/04/16 21:46:13 jgg Exp $
+// $Id: depcache.cc,v 1.18 1999/04/28 22:48:45 jgg Exp $
 /* ######################################################################
 
    Dependency Cache - Caches Dependency information.
@@ -519,6 +519,12 @@ void pkgDepCache::MarkKeep(PkgIterator const &Pkg,bool Soft)
    // Simplifies other routines.
    if (Pkg.end() == true)
       return;
+
+   /* Reject an attempt to keep a non-source broken installed package, those
+      must be upgraded */
+   if (Pkg.State() == PkgIterator::NeedsUnpack && 
+       Pkg.CurrentVer().Downloadable() == false)
+      return;
    
    /* We changed the soft state all the time so the UI is a bit nicer
       to use */

+ 4 - 4
apt-pkg/pkgcachegen.h

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
-// $Id: pkgcachegen.h,v 1.13 1999/04/18 06:36:36 jgg Exp $
+// $Id: pkgcachegen.h,v 1.14 1999/04/28 22:48:45 jgg Exp $
 /* ######################################################################
    
    Package Cache Generator - Generator for the cache structure.
@@ -55,8 +55,8 @@ class pkgCacheGenerator
    unsigned long NewVersion(pkgCache::VerIterator &Ver,string VerStr,unsigned long Next);
 
    unsigned long WriteUniqString(const char *S,unsigned int Size);
-   inline unsigned long WriteUniqString(string S) {return WriteUniqString(S);};
-   
+   inline unsigned long WriteUniqString(string S) {return WriteUniqString(S.c_str(),S.length());};
+
    public:   
 
    bool SelectFile(string File,unsigned long Flags = 0);
@@ -85,7 +85,7 @@ class pkgCacheGenerator::ListParser
    __apt_ptrloc *OldDepLast;
       
    protected:
-   
+
    inline unsigned long WriteUniqString(string S) {return Owner->WriteUniqString(S);};
    inline unsigned long WriteUniqString(const char *S,unsigned int Size) {return Owner->WriteUniqString(S,Size);};
    inline unsigned long WriteString(string S) {return Owner->Map.WriteString(S);};