Cygwin: pinfo: Additional fix for CTTY behavior.

The commit 25c4ad6ea5 did not fix the CTTY behavior enough. For
example, in the following test case, TTY will be associated as
a CTTY on the second open() call even though the TTY is already
CTTY of another session. This patch fixes the issue.

  #include <unistd.h>
  #include <sys/fcntl.h>

  int main()
  {
    if (fork () == 0) {
      char *tty = ttyname(0);
      int fd;
      setsid();
      fd = open(tty, O_RDWR);
      close(fd);
      fd = open(tty, O_RDWR);
      usleep (60000000L);
    }
    return 0;
  }

Fixes: 25c4ad6ea5 ("Cygwin: pinfo: Align CTTY behavior to the
statement of POSIX.")
Reviewed-by: Corinna Vinschen <corinna@vinschen.de>
Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
This commit is contained in:
Takashi Yano 2022-12-26 20:50:15 +09:00
parent a81fef51cf
commit 8e77725f31
2 changed files with 3 additions and 3 deletions

View File

@ -736,7 +736,6 @@ fhandler_termios::ioctl (int cmd, void *varg)
return -1;
}
myself->ctty = -1;
if (!myself->set_ctty (this, 0))
{
set_errno (EPERM);

View File

@ -530,7 +530,7 @@ _pinfo::set_ctty (fhandler_termios *fh, int flags)
debug_printf ("old %s, ctty device number %y, tc.ntty device number %y flags & O_NOCTTY %y", __ctty (), ctty, tc.ntty, flags & O_NOCTTY);
if (fh && (ctty <= 0 || ctty == tc.ntty) && !(flags & O_NOCTTY))
{
if (tc.getsid () && tc.getsid () != sid)
if (tc.getsid () && tc.getsid () != sid && ctty == -2)
; /* Do nothing if another session is associated with the TTY. */
else
{
@ -576,7 +576,8 @@ _pinfo::set_ctty (fhandler_termios *fh, int flags)
an obvious bug surfaces. */
if (sid == pid && !tc.getsid ())
tc.setsid (sid);
sid = tc.getsid ();
if (ctty > 0)
sid = tc.getsid ();
/* See above */
if ((!tc.getpgid () || being_debugged ()) && pgid == pid)
tc.setpgid (pgid);