retitle 629266 aptitude: {full,safe}-upgrade -d has infinite loop
running dpkg/scripts
tags 629266 = patch
thanks

Though I was not able to (quickly) reproduce this the attached patch
should fix it.

Could affected users please test and confirm the results.
From fc33717e721954088ed14913af5002f0ef9d2d1a Mon Sep 17 00:00:00 2001
From: Daniel Hartwig <[email protected]>
Date: Tue, 17 Apr 2012 00:46:23 +0800
Subject: [PATCH] Avoid dpkg and infinite loop in download-only mode

* src/generic/apt/download_install_manager.cc:
  When in download_only mode:
  - report download errors;
  - post_dpkg save/reload cycle (fix for #429388) is not needed;
  - ignore aptitude::Forget-New-On-Install;
  - avoid dpkg and a potential infinite loop;
  - do not run {Pre,Post}-Invoke scripts.

Closes: #629266
---
 src/generic/apt/download_install_manager.cc |   42 +++++++++++++++++++++++----
 1 files changed, 36 insertions(+), 6 deletions(-)

diff --git a/src/generic/apt/download_install_manager.cc b/src/generic/apt/download_install_manager.cc
index e3ab4c3..6544e39 100644
--- a/src/generic/apt/download_install_manager.cc
+++ b/src/generic/apt/download_install_manager.cc
@@ -109,8 +109,6 @@ download_manager::result download_install_manager::finish_pre_dpkg(pkgAcquire::R
 {
   if(res != pkgAcquire::Continue)
     return failure;
-  else if(download_only)
-    return success;
 
   bool failed=false;
   for(pkgAcquire::ItemIterator i = fetcher->ItemsBegin();
@@ -128,6 +126,20 @@ download_manager::result download_install_manager::finish_pre_dpkg(pkgAcquire::R
       break;
     }
 
+  if(download_only)
+    {
+      // TODO: Handle files on other CDROMs (StatIdle?).
+      if(failed)
+	{
+	  _error->Error(_("Some files failed to download"));
+	  return failure;
+	}
+      else
+	{
+	  return success;
+	}
+    }
+
   if(failed && !pm->FixMissing())
     {
       _error->Error(_("Unable to correct for unavailable packages"));
@@ -226,9 +238,11 @@ void download_install_manager::finish_post_dpkg(pkgPackageManager::OrderResult d
       // world.
       //
       // This implicitly updates the package state file on disk.
-      apt_load_cache(progress, true);
+      if(!download_only)
+	apt_load_cache(progress, true);
 
-      if(aptcfg->FindB(PACKAGE "::Forget-New-On-Install", false))
+      if(aptcfg->FindB(PACKAGE "::Forget-New-On-Install", false)
+	 && !download_only)
 	{
 	  if(apt_cache_file != NULL)
 	    {
@@ -248,7 +262,7 @@ void download_install_manager::finish(pkgAcquire::RunResult result,
 {
   const download_manager::result pre_res = finish_pre_dpkg(result);
 
-  if(pre_res == success)
+  if(pre_res == success && !download_only)
     {
       run_dpkg_in_terminal(sigc::mem_fun(*this, &download_install_manager::run_dpkg),
 			   sigc::bind(sigc::mem_fun(*this, &download_install_manager::finish_post_dpkg),
@@ -258,7 +272,23 @@ void download_install_manager::finish(pkgAcquire::RunResult result,
     }
   else
     {
-      finish_post_dpkg(pkgPackageManager::Failed,
+      pkgPackageManager::OrderResult res;
+
+      switch(pre_res)
+	{
+	case success:
+	  res = pkgPackageManager::Completed;
+	  break;
+	case do_again:
+	  res = pkgPackageManager::Incomplete;
+	  break;
+	case failure:
+	default:
+	  res = pkgPackageManager::Failed;
+	  break;
+	}
+
+      finish_post_dpkg(res,
 		       progress,
 		       k);
       return;
-- 
1.7.9

_______________________________________________
Aptitude-devel mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/aptitude-devel

Reply via email to