kpty: prevent to open pseudo ttys twice for openpty(3) platforms

Signed-off-by: OBATA Akio <obache@wizdas.com>
pull/109/head
OBATA Akio 4 years ago committed by TDE Gitea
parent 8e542575e0
commit 8f7371cddf

@ -217,49 +217,60 @@ bool KPty::setPty(int pty_master)
bool KPty::_attachPty(int pty_master) bool KPty::_attachPty(int pty_master)
{ {
TQCString ptyName; if (d->slaveFd < 0 ) {
kdDebug(175) << "KPty::_attachPty(): " << pty_master << endl; kdDebug(175) << "KPty::_attachPty(): " << pty_master << endl;
#if defined(HAVE_PTSNAME) && defined(HAVE_GRANTPT) #if defined(HAVE_PTSNAME)
char *ptsn = ptsname(d->masterFd); char *ptsn = ptsname(d->masterFd);
if (ptsn) { if (ptsn) {
grantpt(d->masterFd);
d->ttyName = ptsn; d->ttyName = ptsn;
} else { } else {
::close(d->masterFd); ::close(d->masterFd);
d->masterFd = -1; d->masterFd = -1;
return false;
} }
#endif #endif
struct stat st; #if defined(HAVE_GRANTPT)
if (stat(d->ttyName.data(), &st)) if (grantpt(d->masterFd)) {
return false; // this just cannot happen ... *cough* Yeah right, I just return false;
// had it happen when pty #349 was allocated. I guess }
// there was some sort of leak? I only had a few open. #else
if (((st.st_uid != getuid()) || struct stat st;
(st.st_mode & (S_IRGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH))) && if (stat(d->ttyName.data(), &st))
!chownpty(true)) return false; // this just cannot happen ... *cough* Yeah right, I just
{ // had it happen when pty #349 was allocated. I guess
kdWarning(175) // there was some sort of leak? I only had a few open.
<< "KPty::_attachPty(): " << "chownpty failed for device " << ptyName << "::" << d->ttyName << endl if (((st.st_uid != getuid()) ||
<< "KPty::_attachPty(): " << "This means the communication can be eavesdropped." << endl; (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 #ifdef BSD
revoke(d->ttyName.data()); revoke(d->ttyName.data());
#endif #endif
#ifdef HAVE_UNLOCKPT #ifdef HAVE_UNLOCKPT
unlockpt(d->masterFd); unlockpt(d->masterFd);
#endif #endif
d->slaveFd = ::open(d->ttyName.data(), O_RDWR | O_NOCTTY); d->slaveFd = ::open(d->ttyName.data(), O_RDWR | O_NOCTTY);
if (d->slaveFd < 0) if (d->slaveFd < 0)
{ {
kdWarning(175) << "KPty::_attachPty(): " << "Can't open slave pseudo teletype" << endl; kdWarning(175) << "KPty::_attachPty(): " << "Can't open slave pseudo teletype" << endl;
::close(d->masterFd); ::close(d->masterFd);
d->masterFd = -1; d->masterFd = -1;
return false; return false;
}
#ifdef HAVE_OPENPTY
// set screen size
ioctl(d->slaveFd, TIOCSWINSZ, (char *)&d->winSize);
#endif
} }
#if (defined(__svr4__) || defined(__sgi__)) #if (defined(__svr4__) || defined(__sgi__))
@ -294,8 +305,10 @@ bool KPty::_attachPty(int pty_master)
_tcsetattr(d->slaveFd, &ttmode); _tcsetattr(d->slaveFd, &ttmode);
#ifndef HAVE_OPENPTY
// set screen size // set screen size
ioctl(d->slaveFd, TIOCSWINSZ, (char *)&d->winSize); ioctl(d->slaveFd, TIOCSWINSZ, (char *)&d->winSize);
#endif
fcntl(d->masterFd, F_SETFD, FD_CLOEXEC); fcntl(d->masterFd, F_SETFD, FD_CLOEXEC);
fcntl(d->slaveFd, F_SETFD, FD_CLOEXEC); fcntl(d->slaveFd, F_SETFD, FD_CLOEXEC);

Loading…
Cancel
Save