From be8ea9c41a14c8b1f8624f238b37f78043022b83 Mon Sep 17 00:00:00 2001 From: OBATA Akio Date: Sat, 29 Aug 2020 18:40:18 +0900 Subject: [PATCH] kpty: prevent to open pseudo ttys twice for openpty(3) platforms Signed-off-by: OBATA Akio (cherry picked from commit 8f7371cddfa402a5561f46007985832b32383728) --- kdecore/kpty.cpp | 63 +++++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/kdecore/kpty.cpp b/kdecore/kpty.cpp index 7c58f74a9..1fe99275f 100644 --- a/kdecore/kpty.cpp +++ b/kdecore/kpty.cpp @@ -217,49 +217,60 @@ bool KPty::setPty(int pty_master) bool KPty::_attachPty(int pty_master) { - TQCString ptyName; + if (d->slaveFd < 0 ) { kdDebug(175) << "KPty::_attachPty(): " << pty_master << endl; -#if defined(HAVE_PTSNAME) && defined(HAVE_GRANTPT) +#if defined(HAVE_PTSNAME) char *ptsn = ptsname(d->masterFd); if (ptsn) { - grantpt(d->masterFd); d->ttyName = ptsn; } else { ::close(d->masterFd); d->masterFd = -1; + return false; } #endif - struct stat st; - if (stat(d->ttyName.data(), &st)) - return false; // this just cannot happen ... *cough* Yeah right, I just - // had it happen when pty #349 was allocated. I guess - // there was some sort of leak? I only had a few open. - if (((st.st_uid != getuid()) || - (st.st_mode & (S_IRGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH))) && - !chownpty(true)) - { - kdWarning(175) - << "KPty::_attachPty(): " << "chownpty failed for device " << ptyName << "::" << d->ttyName << endl - << "KPty::_attachPty(): " << "This means the communication can be eavesdropped." << endl; - } +#if defined(HAVE_GRANTPT) + if (grantpt(d->masterFd)) { + return false; + } +#else + struct stat st; + if (stat(d->ttyName.data(), &st)) + return false; // this just cannot happen ... *cough* Yeah right, I just + // had it happen when pty #349 was allocated. I guess + // there was some sort of leak? I only had a few open. + if (((st.st_uid != getuid()) || + (st.st_mode & (S_IRGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH))) && + !chownpty(true)) + { + kdWarning(175) + << "KPty::_attachPty(): " << "chownpty failed for device " << d->ttyName << endl + << "KPty::_attachPty(): " << "This means the communication can be eavesdropped." << endl; + } +#endif #ifdef BSD - revoke(d->ttyName.data()); + revoke(d->ttyName.data()); #endif #ifdef HAVE_UNLOCKPT - unlockpt(d->masterFd); + unlockpt(d->masterFd); #endif - d->slaveFd = ::open(d->ttyName.data(), O_RDWR | O_NOCTTY); - if (d->slaveFd < 0) - { - kdWarning(175) << "KPty::_attachPty(): " << "Can't open slave pseudo teletype" << endl; - ::close(d->masterFd); - d->masterFd = -1; - return false; + d->slaveFd = ::open(d->ttyName.data(), O_RDWR | O_NOCTTY); + if (d->slaveFd < 0) + { + kdWarning(175) << "KPty::_attachPty(): " << "Can't open slave pseudo teletype" << endl; + ::close(d->masterFd); + d->masterFd = -1; + return false; + } +#ifdef HAVE_OPENPTY + // set screen size + ioctl(d->slaveFd, TIOCSWINSZ, (char *)&d->winSize); +#endif } #if (defined(__svr4__) || defined(__sgi__)) @@ -294,8 +305,10 @@ bool KPty::_attachPty(int pty_master) _tcsetattr(d->slaveFd, &ttmode); +#ifndef HAVE_OPENPTY // set screen size ioctl(d->slaveFd, TIOCSWINSZ, (char *)&d->winSize); +#endif fcntl(d->masterFd, F_SETFD, FD_CLOEXEC); fcntl(d->slaveFd, F_SETFD, FD_CLOEXEC);