Subject: setsid(2) bug
To: None <current-users@sun-lamp.cs.berkeley.edu>
From: Christos Zoulas <christos@deshaw.com>
List: current-users
Date: 02/24/1994 11:24:04
Setsid(2) does not void the controlling terminal association of the
current process.

% cat foo.c
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int
main(argc, argv)
	int argc;
	char *argv[];
{
	setsid();
	if (open("/dev/tty", O_RDWR) != -1)
		printf("open worked!\n");
	else
		perror("open");
}
% cc foo.c
% a.out
open worked!


Here's the SunOS description:

DESCRIPTION
       If  the calling process is not a process group leader, the
       setsid() function creates a new session.  The calling pro-
       cess  is  the session leader of this new session, the pro-
       cess group leader of a new process group, and has no  con-
       trolling  terminal.  If the process had a controlling ter-
       minal, setsid() breaks the association between the process
       and  that  controlling  terminal.  The process group ID of
       the calling process is set equal to the process ID of  the
       calling  process.  The calling process is the only process
       in the new process group and the only process in  the  new
       session.

I am not sure about the following patch, but I guess it should work
(I am compiling a kernel right now...)

*** kern_prot.c.orig	Sun Jan 23 05:38:17 1994
--- kern/kern_prot.c	Thu Feb 24 11:16:51 1994
***************
*** 190,195 ****
--- 190,196 ----
  	if (p->p_pgid == p->p_pid || pgfind(p->p_pid)) {
  		return (EPERM);
  	} else {
+ 		p->p_flag &= ~SCTTY;
  		enterpgrp(p, p->p_pid, 1);
  		*retval = p->p_pid;
  		return (0);

For 4.4BSD SCTTY should be changed to P_CONTROLT.

christos

------------------------------------------------------------------------------