Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 27 Jan 1998 15:47:18 -0800 (PST)
From:      proett@nas.nasa.gov
To:        freebsd-gnats-submit@FreeBSD.ORG
Subject:   kern/5587: session id gets dropped
Message-ID:  <199801272347.PAA14424@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         5587
>Category:       kern
>Synopsis:       session id gets dropped
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:
>Keywords:
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Jan 27 15:50:03 PST 1998
>Last-Modified:
>Originator:     Tom Proett
>Organization:
Ames Research Center / MRJ Inc.
>Release:        2.2.5-STABLE
>Environment:
FreeBSD sensei.nas.nasa.gov 2.2.5-STABLE FreeBSD 2.2.5-STABLE #0: Tue Jan 27 10:46:01 PST 1998     proett@sensei.nas.nasa.gov:/usr/src/sys/compile/SENSEI  i386

>Description:
I am working with a batch system that uses the POSIX session to keep track
of which processes comprise a "job".  Under FreeBSD, I use kvm_getprocs()
to get information for all the proceses then use kvm_read() to read
the session structure for each process (pointed to by kp_eproc.e_sess).
It turns out that the s_leader field in the session structure becomes
NULL if the session leader exits.

>How-To-Repeat:
Email me if you want to see a program that shows the problem.
The fix to this bug makes Problem Report bin/5262 obsolete.
>Fix:
sys/miscfs/procfs/procfs_status.c
*** /usr/src/sys/miscfs/procfs/procfs_status.c	Thu Feb  1 21:19:20 1996
--- /ide/usr/src/sys/miscfs/procfs/procfs_status.c	Fri Jan 16 14:40:53 1998
***************
*** 76,82 ****
  	ppid = p->p_pptr ? p->p_pptr->p_pid : 0,
  	pgid = p->p_pgrp->pg_id;
  	sess = p->p_pgrp->pg_session;
! 	sid = sess->s_leader ? sess->s_leader->p_pid : 0;
  
  /* comm pid ppid pgid sid maj,min ctty,sldr start ut st wmsg 
                                  euid ruid rgid,egid,groups[1 .. NGROUPS]
--- 76,82 ----
  	ppid = p->p_pptr ? p->p_pptr->p_pid : 0,
  	pgid = p->p_pgrp->pg_id;
  	sess = p->p_pgrp->pg_session;
! 	sid = sess->s_sid;
  
  /* comm pid ppid pgid sid maj,min ctty,sldr start ut st wmsg 
                                  euid ruid rgid,egid,groups[1 .. NGROUPS]
sys/sys/user.h
*** /usr/src/sys/sys/user.h	Tue Sep 10 01:21:29 1996
--- /ide/usr/src/sys/sys/user.h	Thu Jan 15 18:41:01 1998
***************
*** 70,75 ****
--- 70,76 ----
  		struct	vmspace e_vm;		/* address space */
  		pid_t	e_ppid;			/* parent process id */
  		pid_t	e_pgid;			/* process group id */
+ 		pid_t	e_sid;			/* session id */
  		short	e_jobc;			/* job control counter */
  		dev_t	e_tdev;			/* controlling tty dev */
  		pid_t	e_tpgid;		/* tty process group id */
sys/sys/proc.h
*** /usr/src/sys/sys/proc.h	Wed Oct 16 19:58:05 1996
--- /ide/usr/src/sys/sys/proc.h	Thu Jan 15 18:27:43 1998
***************
*** 54,59 ****
--- 54,60 ----
   */
  struct	session {
  	int	s_count;		/* Ref cnt; pgrps in session. */
+ 	pid_t	s_sid;			/* pid of session leader */
  	struct	proc *s_leader;		/* Session leader. */
  	struct	vnode *s_ttyvp;		/* Vnode of controlling terminal. */
  	struct	tty *s_ttyp;		/* Controlling terminal. */
sys/kern/kern_proc.c
*** /usr/src/sys/kern/kern_proc.c	Wed Dec 31 10:19:03 1997
--- /ide/usr/src/sys/kern/kern_proc.c	Thu Jan 15 18:42:52 1998
***************
*** 224,229 ****
--- 224,230 ----
  			 */
  			MALLOC(sess, struct session *, sizeof(struct session),
  			    M_SESSION, M_WAITOK);
+ 			sess->s_sid = p->p_pid;
  			sess->s_leader = p;
  			sess->s_count = 1;
  			sess->s_ttyvp = NULL;
***************
*** 437,443 ****
  		ep->e_sess = p->p_pgrp->pg_session;
  
  		if (ep->e_sess) {
! 			bcopy(ep->e_sess->s_login, ep->e_login, sizeof(ep->e_login));
  			if (ep->e_sess->s_ttyvp)
  				ep->e_flag = EPROC_CTTY;
  			if (p->p_session && SESS_LEADER(p))
--- 438,446 ----
  		ep->e_sess = p->p_pgrp->pg_session;
  
  		if (ep->e_sess) {
! 			bcopy(ep->e_sess->s_login, ep->e_login,
! 					sizeof(ep->e_login));
! 			ep->e_sid = ep->e_sess->s_sid;
  			if (ep->e_sess->s_ttyvp)
  				ep->e_flag = EPROC_CTTY;
  			if (p->p_session && SESS_LEADER(p))
sys/kern/init_main.c
*** /usr/src/sys/kern/init_main.c	Thu Jan  8 12:56:06 1998
--- /ide/usr/src/sys/kern/init_main.c	Thu Jan 15 18:29:56 1998
***************
*** 343,348 ****
--- 343,349 ----
  
  	pgrp0.pg_session = &session0;
  	session0.s_count = 1;
+ 	session0.s_sid = p->p_pid;
  	session0.s_leader = p;
  
  	p->p_sysent = &aout_sysvec;
sys/kern/kern_fork.c
*** /usr/src/sys/kern/kern_fork.c	Mon Feb 17 02:59:40 1997
--- /ide/usr/src/sys/kern/kern_fork.c	Fri Jan 16 14:57:35 1998
***************
*** 197,212 ****
  again:
  		for (; p2 != 0; p2 = p2->p_list.le_next) {
  			while (p2->p_pid == nextpid ||
! 			    p2->p_pgrp->pg_id == nextpid) {
  				nextpid++;
  				if (nextpid >= pidchecked)
  					goto retry;
  			}
  			if (p2->p_pid > nextpid && pidchecked > p2->p_pid)
  				pidchecked = p2->p_pid;
  			if (p2->p_pgrp->pg_id > nextpid &&
  			    pidchecked > p2->p_pgrp->pg_id)
  				pidchecked = p2->p_pgrp->pg_id;
  		}
  		if (!doingzomb) {
  			doingzomb = 1;
--- 197,219 ----
  again:
  		for (; p2 != 0; p2 = p2->p_list.le_next) {
  			while (p2->p_pid == nextpid ||
! 				    p2->p_pgrp->pg_id == nextpid ||
! 				    p2->p_pgrp->pg_session->s_sid == nextpid) {
! 
  				nextpid++;
  				if (nextpid >= pidchecked)
  					goto retry;
  			}
  			if (p2->p_pid > nextpid && pidchecked > p2->p_pid)
  				pidchecked = p2->p_pid;
+ 
  			if (p2->p_pgrp->pg_id > nextpid &&
  			    pidchecked > p2->p_pgrp->pg_id)
  				pidchecked = p2->p_pgrp->pg_id;
+ 
+ 			if (p2->p_pgrp->pg_session->s_sid > nextpid &&
+ 			    pidchecked > p2->p_pgrp->pg_session->s_sid)
+ 				pidchecked = p2->p_pgrp->pg_session->s_sid;
  		}
  		if (!doingzomb) {
  			doingzomb = 1;
bin/ps/keyword.c
*** /usr/src/bin/ps/keyword.c	Wed Jul 31 02:27:23 1996
--- /ide/usr/src/bin/ps/keyword.c	Fri Jan 16 14:03:25 1998
***************
*** 143,149 ****
  	{"ruid", "RUID", NULL, 0, evar, UIDLEN, EOFF(e_pcred.p_ruid),
  		ULONG, UIDFMT},
  	{"ruser", "RUSER", NULL, LJUST, runame, USERLEN},
! 	{"sess", "SESS", NULL, 0, evar, 6, EOFF(e_sess), KPTR, "x"},
  	{"sig", "PENDING", NULL, 0, pvar, 8, POFF(p_siglist), LONG, "x"},
  	{"sigcatch", "CAUGHT", NULL, 0, pvar, 8, POFF(p_sigcatch), LONG, "x"},
  	{"sigignore", "IGNORED",
--- 143,149 ----
  	{"ruid", "RUID", NULL, 0, evar, UIDLEN, EOFF(e_pcred.p_ruid),
  		ULONG, UIDFMT},
  	{"ruser", "RUSER", NULL, LJUST, runame, USERLEN},
! 	{"sess", "SESS", NULL, 0, evar, 6, EOFF(e_sid), ULONG, PIDFMT},
  	{"sig", "PENDING", NULL, 0, pvar, 8, POFF(p_siglist), LONG, "x"},
  	{"sigcatch", "CAUGHT", NULL, 0, pvar, 8, POFF(p_sigcatch), LONG, "x"},
  	{"sigignore", "IGNORED",

>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199801272347.PAA14424>