diff options
| author | Paul Eggert | 2015-06-11 16:41:36 -0700 |
|---|---|---|
| committer | Paul Eggert | 2015-06-11 16:42:10 -0700 |
| commit | 32e53667a91ed479743175d5698a89b163c8be94 (patch) | |
| tree | 6f608ebc4a2e184208714fbe93bb03e6580a254e /src | |
| parent | 8d0efee90c0ad3b44c14b77403599cba1b168044 (diff) | |
| download | emacs-32e53667a91ed479743175d5698a89b163c8be94.tar.gz emacs-32e53667a91ed479743175d5698a89b163c8be94.zip | |
Fix "not a tty" bug on Solaris 10
* configure.ac (PTY_OPEN): Define to plain 'open'
on SVR4-derived hosts, so that the O_CLOEXEC flag isn't set.
* src/process.c (allocate_pty): Set the O_CLOEXEC flag after
calling PTY_TTY_NAME_SPRINTF, for the benefit of SVR4-derived
hosts that call grantpt which does its work via a setuid subcommand
(Bug#19191, Bug#19927, Bug#20555, Bug#20686).
Also, set O_CLOEXEC even if PTY_OPEN is not defined, since it
seems relevant in that case too.
Diffstat (limited to 'src')
| -rw-r--r-- | src/process.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/process.c b/src/process.c index 17fe708a954..b4f979fd484 100644 --- a/src/process.c +++ b/src/process.c | |||
| @@ -658,22 +658,24 @@ allocate_pty (char pty_name[PTY_NAME_SIZE]) | |||
| 658 | 658 | ||
| 659 | if (fd >= 0) | 659 | if (fd >= 0) |
| 660 | { | 660 | { |
| 661 | #ifdef PTY_OPEN | 661 | #ifdef PTY_TTY_NAME_SPRINTF |
| 662 | PTY_TTY_NAME_SPRINTF | ||
| 663 | #else | ||
| 664 | sprintf (pty_name, "/dev/tty%c%x", c, i); | ||
| 665 | #endif /* no PTY_TTY_NAME_SPRINTF */ | ||
| 666 | |||
| 662 | /* Set FD's close-on-exec flag. This is needed even if | 667 | /* Set FD's close-on-exec flag. This is needed even if |
| 663 | PT_OPEN calls posix_openpt with O_CLOEXEC, since POSIX | 668 | PT_OPEN calls posix_openpt with O_CLOEXEC, since POSIX |
| 664 | doesn't require support for that combination. | 669 | doesn't require support for that combination. |
| 670 | Do this after PTY_TTY_NAME_SPRINTF, which on some platforms | ||
| 671 | doesn't work if the close-on-exec flag is set (Bug#20555). | ||
| 665 | Multithreaded platforms where posix_openpt ignores | 672 | Multithreaded platforms where posix_openpt ignores |
| 666 | O_CLOEXEC (or where PTY_OPEN doesn't call posix_openpt) | 673 | O_CLOEXEC (or where PTY_OPEN doesn't call posix_openpt) |
| 667 | have a race condition between the PTY_OPEN and here. */ | 674 | have a race condition between the PTY_OPEN and here. */ |
| 668 | fcntl (fd, F_SETFD, FD_CLOEXEC); | 675 | fcntl (fd, F_SETFD, FD_CLOEXEC); |
| 669 | #endif | 676 | |
| 670 | /* Check to make certain that both sides are available | 677 | /* Check to make certain that both sides are available. |
| 671 | this avoids a nasty yet stupid bug in rlogins. */ | 678 | This avoids a nasty yet stupid bug in rlogins. */ |
| 672 | #ifdef PTY_TTY_NAME_SPRINTF | ||
| 673 | PTY_TTY_NAME_SPRINTF | ||
| 674 | #else | ||
| 675 | sprintf (pty_name, "/dev/tty%c%x", c, i); | ||
| 676 | #endif /* no PTY_TTY_NAME_SPRINTF */ | ||
| 677 | if (faccessat (AT_FDCWD, pty_name, R_OK | W_OK, AT_EACCESS) != 0) | 679 | if (faccessat (AT_FDCWD, pty_name, R_OK | W_OK, AT_EACCESS) != 0) |
| 678 | { | 680 | { |
| 679 | emacs_close (fd); | 681 | emacs_close (fd); |