Browse Source

check the state of the FileFd before renaming as otherwise the rename

will be tried twice e.g. in an "apt-get update" run and every other piece
of code closing the FileFd manual before the destructor will do it again.
tags/debian/0.8.0
David Kalnischkies 11 years ago
parent
commit
62d073d937
1 changed files with 8 additions and 6 deletions
  1. +8
    -6
      apt-pkg/contrib/fileutl.cc

+ 8
- 6
apt-pkg/contrib/fileutl.cc View File

@@ -843,19 +843,21 @@ bool FileFd::Close()
bool Res = true;
if ((Flags & AutoClose) == AutoClose)
if (iFd >= 0 && close(iFd) != 0)
Res &= _error->Errno("close",_("Problem closing the file"));
iFd = -1;
Res &= _error->Errno("close",_("Problem closing the file %s"), FileName.c_str());

if ((Flags & Replace) == Replace) {
if ((Flags & Replace) == Replace && iFd >= 0) {
if (rename(TemporaryFileName.c_str(), FileName.c_str()) != 0)
Res &= _error->Errno("rename",_("Problem renaming the file"));
Res &= _error->Errno("rename",_("Problem renaming the file %s to %s"), TemporaryFileName.c_str(), FileName.c_str());

FileName = TemporaryFileName; // for the unlink() below.
}

iFd = -1;

if ((Flags & Fail) == Fail && (Flags & DelOnFail) == DelOnFail &&
FileName.empty() == false)
if (unlink(FileName.c_str()) != 0)
Res &= _error->WarningE("unlnk",_("Problem unlinking the file"));
Res &= _error->WarningE("unlnk",_("Problem unlinking the file %s"), FileName.c_str());


return Res;


Loading…
Cancel
Save