Просмотр исходного кода

* apt-pkg/deb/dpkgpm.cc:
- when tcgetattr() returns non-zero skip all pty magic
(thanks to Simon Richter, closes: #509866)

Michael Vogt лет назад: 17
Родитель
Сommit
4e5500361a
2 измененных файлов с 35 добавлено и 24 удалено
  1. 27 24
      apt-pkg/deb/dpkgpm.cc
  2. 8 0
      debian/changelog

+ 27 - 24
apt-pkg/deb/dpkgpm.cc

@@ -809,32 +809,35 @@ bool pkgDPkgPM::Go(int OutStatusFd)
 
       struct	termios tt;
       struct	winsize win;
-      int	master;
-      int	slave;
+      int	master = -1;
+      int	slave = -1;
 
-      // FIXME: setup sensible signal handling (*ick*)
-      tcgetattr(0, &tt);
-      ioctl(0, TIOCGWINSZ, (char *)&win);
-      if (openpty(&master, &slave, NULL, &tt, &win) < 0) 
+      // if tcgetattr does not return zero there was a error
+      // and we do not do any pty magic
+      if (tcgetattr(0, &tt) == 0)
       {
-	 const char *s = _("Can not write log, openpty() "
-			   "failed (/dev/pts not mounted?)\n");
-	 fprintf(stderr, "%s",s);
-	 fprintf(term_out, "%s",s);
-	 master = slave = -1;
-      }  else {
-	 struct termios rtt;
-	 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);
+	 ioctl(0, TIOCGWINSZ, (char *)&win);
+	 if (openpty(&master, &slave, NULL, &tt, &win) < 0) 
+	 {
+	    const char *s = _("Can not write log, openpty() "
+	                      "failed (/dev/pts not mounted?)\n");
+	    fprintf(stderr, "%s",s);
+	    fprintf(term_out, "%s",s);
+	    master = slave = -1;
+	 }  else {
+	    struct termios rtt;
+	    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

+ 8 - 0
debian/changelog

@@ -1,3 +1,11 @@
+apt (0.7.22.4) unstable; urgency=low
+
+  * apt-pkg/deb/dpkgpm.cc:
+    - when tcgetattr() returns non-zero skip all pty magic 
+      (thanks to Simon Richter, closes: #509866)
+
+ -- Michael Vogt <michael.vogt@ubuntu.com>  Mon, 31 Aug 2009 11:08:03 +0200
+
 apt (0.7.22.3) UNRELEASED; urgency=low
 
   [ Eugene V. Lyubimkin ]