]> git.saurik.com Git - apt.git/commitdiff
collect zombie (de)compressor processes on reopen
authorDavid Kalnischkies <kalnischkies@gmail.com>
Wed, 9 May 2012 22:14:50 +0000 (00:14 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Wed, 9 May 2012 22:14:50 +0000 (00:14 +0200)
apt-pkg/contrib/fileutl.cc
debian/changelog

index 14c0b561fb9b948dcfcfaa21186c37be8be2f81a..4dc0879839c5c39c75743a51bf7a2b0548756aba 100644 (file)
@@ -1022,6 +1022,11 @@ bool FileFd::OpenInternDescriptor(unsigned int const Mode, APT::Configuration::C
 #ifdef HAVE_ZLIB
    else if (compressor.Name == "gzip")
    {
+      if (d->gz != NULL)
+      {
+        gzclose(d->gz);
+        d->gz = NULL;
+      }
       if ((Mode & ReadWrite) == ReadWrite)
         d->gz = gzdopen(iFd, "r+");
       else if ((Mode & WriteOnly) == WriteOnly)
@@ -1037,6 +1042,11 @@ bool FileFd::OpenInternDescriptor(unsigned int const Mode, APT::Configuration::C
 #ifdef HAVE_BZ2
    else if (compressor.Name == "bzip2")
    {
+      if (d->bz2 != NULL)
+      {
+        BZ2_bzclose(d->bz2);
+        d->bz2 = NULL;
+      }
       if ((Mode & ReadWrite) == ReadWrite)
         d->bz2 = BZ2_bzdopen(iFd, "r+");
       else if ((Mode & WriteOnly) == WriteOnly)
@@ -1050,14 +1060,17 @@ bool FileFd::OpenInternDescriptor(unsigned int const Mode, APT::Configuration::C
    }
 #endif
 
+   // collect zombies here in case we reopen
+   if (d->compressor_pid > 0)
+      ExecWait(d->compressor_pid, "FileFdCompressor", true);
 
    if ((Mode & ReadWrite) == ReadWrite)
       return _error->Error("ReadWrite mode is not supported for file %s", FileName.c_str());
 
    bool const Comp = (Mode & WriteOnly) == WriteOnly;
-   // Handle 'decompression' of empty files
    if (Comp == false)
    {
+      // Handle 'decompression' of empty files
       struct stat Buf;
       fstat(iFd, &Buf);
       if (Buf.st_size == 0 && S_ISFIFO(Buf.st_mode) == false)
index 6b9ba6769363fbd59e98f2f7f386975c4805162e..8b052e23445ebe6edeacc4deceddb2e5cfaf26f6 100644 (file)
@@ -43,6 +43,7 @@ apt (0.9.3) UNRELEASED; urgency=low
     - ensure that we do init d only once and especially not with its own
       content as this causes some "interesting" hickups resulting in segfaults
       as it seems (Closes: #554387, #670979)
+    - collect zombie (de)compressor processes on reopen
   * apt-pkg/aptconfiguration.cc:
     - use NULL instead of "" for no (un)compress parameters