summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Ogness <john.ogness@linutronix.de>2014-04-21 11:54:34 +0200
committerDavid Kalnischkies <david@kalnischkies.de>2014-04-26 09:51:05 +0200
commit7187074bfc7a6932ab21c33546e71b61abe258e3 (patch)
treefa06f51b8270057c91c77212ede5200c8d722ae3
parent12701ee3e5a637e5e45c633dc9aa2b16b81df0b8 (diff)
properly undo CD-ROM mount in all error cases
In bug #740673 various issues in the CD-ROM handling code were identified, while most the issues ended up being fixed in another way, the unmounting of the CD-ROM in error cases was not tackled so far. (The patch was modified by the commiter to apply)
-rw-r--r--apt-pkg/cdrom.cc66
-rw-r--r--apt-pkg/cdrom.h1
2 files changed, 42 insertions, 25 deletions
diff --git a/apt-pkg/cdrom.cc b/apt-pkg/cdrom.cc
index 2635ede76..a5ad6a9ff 100644
--- a/apt-pkg/cdrom.cc
+++ b/apt-pkg/cdrom.cc
@@ -563,6 +563,15 @@ bool pkgCdrom::WriteSourceList(string Name,vector<string> &List,bool Source)
return true;
}
/*}}}*/
+bool pkgCdrom::UnmountCDROM(std::string const &CDROM, pkgCdromStatus * const log)/*{{{*/
+{
+ if (_config->FindB("APT::CDROM::NoMount",false) == true)
+ return true;
+ if (log != NULL)
+ log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST);
+ return UnmountCdrom(CDROM);
+}
+ /*}}}*/
bool pkgCdrom::MountAndIdentCDROM(Configuration &Database, std::string &CDROM, std::string &ident, pkgCdromStatus * const log, bool const interactive)/*{{{*/
{
// Startup
@@ -583,9 +592,7 @@ bool pkgCdrom::MountAndIdentCDROM(Configuration &Database, std::string &CDROM, s
{
if (interactive == true)
{
- if(log != NULL)
- log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST);
- UnmountCdrom(CDROM);
+ UnmountCDROM(CDROM, log);
if(log != NULL)
{
@@ -605,6 +612,9 @@ bool pkgCdrom::MountAndIdentCDROM(Configuration &Database, std::string &CDROM, s
return _error->Error("Failed to mount the cdrom.");
}
+ if (IsMounted(CDROM) == false)
+ return _error->Error("Failed to mount the cdrom.");
+
// Hash the CD to get an ID
if (log != NULL)
log->Update(_("Identifying... "), STEP_IDENT);
@@ -614,6 +624,7 @@ bool pkgCdrom::MountAndIdentCDROM(Configuration &Database, std::string &CDROM, s
ident = "";
if (log != NULL)
log->Update("\n");
+ UnmountCDROM(CDROM, NULL);
return false;
}
@@ -629,8 +640,11 @@ bool pkgCdrom::MountAndIdentCDROM(Configuration &Database, std::string &CDROM, s
if (FileExists(DFile) == true)
{
if (ReadConfigFile(Database,DFile) == false)
+ {
+ UnmountCDROM(CDROM, NULL);
return _error->Error("Unable to read the cdrom database %s",
DFile.c_str());
+ }
}
return true;
}
@@ -651,13 +665,7 @@ bool pkgCdrom::Ident(string &ident, pkgCdromStatus *log) /*{{{*/
}
// Unmount and finish
- if (_config->FindB("APT::CDROM::NoMount",false) == false)
- {
- if (log != NULL)
- log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST);
- UnmountCdrom(CDROM);
- }
-
+ UnmountCDROM(CDROM, log);
return true;
}
/*}}}*/
@@ -682,11 +690,15 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
{
if (log != NULL)
log->Update("\n");
+ UnmountCDROM(CDROM, NULL);
return false;
}
if (chdir(StartDir.c_str()) != 0)
+ {
+ UnmountCDROM(CDROM, NULL);
return _error->Errno("chdir","Unable to change to %s", StartDir.c_str());
+ }
if (_config->FindB("Debug::aptcdrom",false) == true)
{
@@ -728,8 +740,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
if (List.empty() == true && SourceList.empty() == true)
{
- if (_config->FindB("APT::CDROM::NoMount",false) == false)
- UnmountCdrom(CDROM);
+ UnmountCDROM(CDROM, NULL);
return _error->Error(_("Unable to locate any package files, perhaps this is not a Debian Disc or the wrong architecture?"));
}
@@ -769,14 +780,14 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
{
if(log == NULL)
{
- if (_config->FindB("APT::CDROM::NoMount",false) == false)
- UnmountCdrom(CDROM);
+ UnmountCDROM(CDROM, NULL);
return _error->Error("No disc name found and no way to ask for it");
}
while(true) {
if(!log->AskCdromName(Name)) {
// user canceld
+ UnmountCDROM(CDROM, NULL);
return false;
}
cout << "Name: '" << Name << "'" << endl;
@@ -813,7 +824,10 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
string const partialListDir = listDir + "partial/";
if (CreateAPTDirectoryIfNeeded(_config->FindDir("Dir::State"), partialListDir) == false &&
CreateAPTDirectoryIfNeeded(listDir, partialListDir) == false)
+ {
+ UnmountCDROM(CDROM, NULL);
return _error->Errno("cdrom", _("List directory %spartial is missing."), listDir.c_str());
+ }
// take care of the signatures and copy them if they are ok
// (we do this before PackageCopy as it modifies "List" and "SourceList")
@@ -827,7 +841,10 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
if (Copy.CopyPackages(CDROM,Name,List, log) == false ||
SrcCopy.CopyPackages(CDROM,Name,SourceList, log) == false ||
TransCopy.CopyTranslations(CDROM,Name,TransList, log) == false)
+ {
+ UnmountCDROM(CDROM, NULL);
return false;
+ }
// reduce the List so that it takes less space in sources.list
ReduceSourcelist(CDROM,List);
@@ -837,13 +854,19 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
if (_config->FindB("APT::cdrom::NoAct",false) == false)
{
if (WriteDatabase(Database) == false)
+ {
+ UnmountCDROM(CDROM, NULL);
return false;
-
+ }
+
if(log != NULL)
log->Update(_("Writing new source list\n"), STEP_WRITE);
if (WriteSourceList(Name,List,false) == false ||
WriteSourceList(Name,SourceList,true) == false)
+ {
+ UnmountCDROM(CDROM, NULL);
return false;
+ }
}
// Print the sourcelist entries
@@ -855,8 +878,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
string::size_type Space = (*I).find(' ');
if (Space == string::npos)
{
- if (_config->FindB("APT::CDROM::NoMount",false) == false)
- UnmountCdrom(CDROM);
+ UnmountCDROM(CDROM, NULL);
return _error->Error("Internal error");
}
@@ -874,8 +896,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
string::size_type Space = (*I).find(' ');
if (Space == string::npos)
{
- if (_config->FindB("APT::CDROM::NoMount",false) == false)
- UnmountCdrom(CDROM);
+ UnmountCDROM(CDROM, NULL);
return _error->Error("Internal error");
}
@@ -888,12 +909,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
}
// Unmount and finish
- if (_config->FindB("APT::CDROM::NoMount",false) == false) {
- if (log != NULL)
- log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST);
- UnmountCdrom(CDROM);
- }
-
+ UnmountCDROM(CDROM, log);
return true;
}
/*}}}*/
diff --git a/apt-pkg/cdrom.h b/apt-pkg/cdrom.h
index 0f2c2cd02..bd0902176 100644
--- a/apt-pkg/cdrom.h
+++ b/apt-pkg/cdrom.h
@@ -77,6 +77,7 @@ class pkgCdrom /*{{{*/
private:
APT_HIDDEN bool MountAndIdentCDROM(Configuration &Database, std::string &CDROM,
std::string &ident, pkgCdromStatus * const log, bool const interactive);
+ APT_HIDDEN bool UnmountCDROM(std::string const &CDROM, pkgCdromStatus * const log);
};
/*}}}*/