]> sourceware.org Git - newlib-cygwin.git/commitdiff
Cygwin: pinfo: Additional fix for CTTY behavior.
authorTakashi Yano <takashi.yano@nifty.ne.jp>
Mon, 26 Dec 2022 11:50:15 +0000 (20:50 +0900)
committerTakashi Yano <takashi.yano@nifty.ne.jp>
Tue, 10 Jan 2023 12:35:35 +0000 (21:35 +0900)
The commit 25c4ad6ea52f 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: 25c4ad6ea52f ("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>
winsup/cygwin/fhandler/termios.cc
winsup/cygwin/pinfo.cc

index f94e20ff61e266d07a992ec55c29890721363da6..5b92cdd319afd60b22c69a6d909630e66140f4e3 100644 (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);
index ff10d9cf8c87becdfdb930bedbc1f2face9056ed..ece34603708a5d26dbe92f78f85c63c9d058f1cc 100644 (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);
This page took 0.034447 seconds and 5 git commands to generate.