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>
index | next in thread | raw e-mail
>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:
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199801272347.PAA14424>
