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>
return -1;
}
- myself->ctty = -1;
if (!myself->set_ctty (this, 0))
{
set_errno (EPERM);
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
{
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);