]> git.saurik.com Git - apt.git/commitdiff
OpenDescriptor should autoclose fd always on error
authorDavid Kalnischkies <kalnischkies@gmail.com>
Sat, 25 May 2013 18:33:15 +0000 (20:33 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Sun, 9 Jun 2013 13:12:32 +0000 (15:12 +0200)
OpenInternDescriptor failures would cause additional errors to be
generated by double-closing an fd. Other errors (although these
 are generated if the method is used incorrectly, so unlikely)
didn't close the fd aswell.

Closes: 704608
apt-pkg/contrib/fileutl.cc
debian/changelog

index 4a7299e99beb9c1c48e06795797fc0df3af5ee0b..7c3a302e266f5354aa5a20d5cd957523b47fdd97 100644 (file)
@@ -1010,14 +1010,19 @@ bool FileFd::OpenDescriptor(int Fd, unsigned int const Mode, CompressMode Compre
    case Xz: name = "xz"; break;
    case Auto:
    case Extension:
+      if (AutoClose == true && Fd != -1)
+        close(Fd);
       return FileFdError("Opening Fd %d in Auto or Extension compression mode is not supported", Fd);
    }
    for (; compressor != compressors.end(); ++compressor)
       if (compressor->Name == name)
         break;
    if (compressor == compressors.end())
+   {
+      if (AutoClose == true && Fd != -1)
+        close(Fd);
       return FileFdError("Can't find a configured compressor %s for file %s", name.c_str(), FileName.c_str());
-
+   }
    return OpenDescriptor(Fd, Mode, *compressor, AutoClose);
 }
 bool FileFd::OpenDescriptor(int Fd, unsigned int const Mode, APT::Configuration::Compressor const &compressor, bool AutoClose)
@@ -1039,11 +1044,21 @@ bool FileFd::OpenDescriptor(int Fd, unsigned int const Mode, APT::Configuration:
    else
       iFd = Fd;
    this->FileName = "";
-   if (OpenInternDescriptor(Mode, compressor) == false)
+   if (Fd == -1 || OpenInternDescriptor(Mode, compressor) == false)
    {
-      if (AutoClose)
+      if (iFd != -1 && (
+#ifdef HAVE_ZLIB
+       compressor.Name == "gzip" ||
+#endif
+#ifdef HAVE_BZ2
+       compressor.Name == "bzip2" ||
+#endif
+       AutoClose == true))
+      {
         close (iFd);
-      return FileFdErrno("gzdopen",_("Could not open file descriptor %d"), Fd);
+        iFd = -1;
+      }
+      return FileFdError(_("Could not open file descriptor %d"), Fd);
    }
    return true;
 }
index a80bac3d714ad43a0bf92387f70b2d0f41556dac..42a8e540e5e2ab53544097858217817ca69f25e9 100644 (file)
@@ -12,6 +12,7 @@ apt (0.9.8.3) UNRELEASED; urgency=low
   * fix support for multiple patterns in apt-cache search (Closes: #691453)
   * set Fail flag in FileFd on all errors consistently
   * don't explicitly init ExtractTar InFd with invalid fd
+  * OpenDescriptor should autoclose fd always on error (Closes: #704608)
 
  -- David Kalnischkies <kalnischkies@gmail.com>  Sun, 09 Jun 2013 15:06:24 +0200