Przeglądaj źródła

OpenDescriptor should autoclose fd always on error

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
David Kalnischkies 13 lat temu
rodzic
commit
f97bb52374
2 zmienionych plików z 20 dodań i 4 usunięć
  1. 19 4
      apt-pkg/contrib/fileutl.cc
  2. 1 0
      debian/changelog

+ 19 - 4
apt-pkg/contrib/fileutl.cc

@@ -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;
 }

+ 1 - 0
debian/changelog

@@ -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