]> git.saurik.com Git - apt.git/commitdiff
* apt-pkg/deb/dpkgpm.cc:
authorMichael Vogt <michael.vogt@ubuntu.com>
Tue, 28 Oct 2008 19:57:31 +0000 (20:57 +0100)
committerMichael Vogt <michael.vogt@ubuntu.com>
Tue, 28 Oct 2008 19:57:31 +0000 (20:57 +0100)
  - fix potential hang when in a backgroud process group

apt-pkg/deb/dpkgpm.cc
debian/changelog

index 85cf4e11933ab6ce653ff82f8e63e71e3dac5460..36c20ad85b0ce56da33501121c24359d438a0619 100644 (file)
@@ -587,6 +587,11 @@ static int racy_pselect(int nfds, fd_set *readfds, fd_set *writefds,
 */
 bool pkgDPkgPM::Go(int OutStatusFd)
 {
+   fd_set rfds;
+   struct timespec tv;
+   sigset_t sigmask;
+   sigset_t original_sigmask;
+
    unsigned int MaxArgs = _config->FindI("Dpkg::MaxArgs",8*1024);   
    unsigned int MaxArgBytes = _config->FindI("Dpkg::MaxArgBytes",32*1024);
    bool NoTriggers = _config->FindB("DPkg::NoTriggers",false);
@@ -795,7 +800,14 @@ bool pkgDPkgPM::Go(int OutStatusFd)
         rtt = tt;
         cfmakeraw(&rtt);
         rtt.c_lflag &= ~ECHO;
+        // block SIGTTOU during tcsetattr to prevent a hang if
+        // the process is a member of the background process group
+        // http://www.opengroup.org/onlinepubs/000095399/functions/tcsetattr.html
+        sigemptyset(&sigmask);
+        sigaddset(&sigmask, SIGTTOU);
+        sigprocmask(SIG_BLOCK,&sigmask, &original_sigmask);
         tcsetattr(0, TCSAFLUSH, &rtt);
+        sigprocmask(SIG_SETMASK, &original_sigmask, 0);
       }
 
        // Fork dpkg
@@ -862,10 +874,6 @@ bool pkgDPkgPM::Go(int OutStatusFd)
         close(slave);
 
       // setups fds
-      fd_set rfds;
-      struct timespec tv;
-      sigset_t sigmask;
-      sigset_t original_sigmask;
       sigemptyset(&sigmask);
       sigprocmask(SIG_BLOCK,&sigmask,&original_sigmask);
 
index 283c49fd5ca11aea219959090fe9c87125a14222..fdf2db409845c188fc4b462514fa1c04b3ab0372 100644 (file)
@@ -28,6 +28,8 @@ apt (0.7.17) UNRELEASED; urgency=low
       of variables (LP: #56792)
   * apt-pkg/cacheiterators.h:
     - add missing checks for Owner == 0 in end()
+  * apt-pkg/deb/dpkgpm.cc:
+    - fix potential hang when in a backgroud process group
   
   [ Dereck Wonnacott ]
   * apt-ftparchive might write corrupt Release files (LP: #46439)