From 813c8eea956b2dee1e7a4a8018a1e94880a2cfbf Mon Sep 17 00:00:00 2001 From: Arch Librarian Date: Mon, 20 Sep 2004 16:53:39 +0000 Subject: [PATCH 1/1] Fixed segfault in re-install/upgrade condition Author: jgg Date: 1999-04-28 22:48:44 GMT Fixed segfault in re-install/upgrade condition --- apt-pkg/acquire-item.cc | 9 +++++++-- apt-pkg/algorithms.cc | 29 +++++++++++++++++++++++++---- apt-pkg/depcache.cc | 8 +++++++- apt-pkg/pkgcachegen.h | 8 ++++---- 4 files changed, 43 insertions(+), 11 deletions(-) diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index 35ae7d8b7..f2fd0b8b8 100644 --- a/apt-pkg/acquire-item.cc +++ b/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(),"_:") + '_' + diff --git a/apt-pkg/algorithms.cc b/apt-pkg/algorithms.cc index 967aba180..991a61228 100644 --- a/apt-pkg/algorithms.cc +++ b/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 diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc index 7d1ff05ea..36abcddd4 100644 --- a/apt-pkg/depcache.cc +++ b/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 */ diff --git a/apt-pkg/pkgcachegen.h b/apt-pkg/pkgcachegen.h index 66a991371..af234bae2 100644 --- a/apt-pkg/pkgcachegen.h +++ b/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);}; -- 2.45.2