From owner-freebsd-bugs Tue Jan 27 15:50:08 1998 Return-Path: Received: (from majordom@localhost) by hub.freebsd.org (8.8.8/8.8.8) id PAA14825 for freebsd-bugs-outgoing; Tue, 27 Jan 1998 15:50:08 -0800 (PST) (envelope-from owner-freebsd-bugs@FreeBSD.ORG) Received: (from gnats@localhost) by hub.freebsd.org (8.8.8/8.8.8) id PAA14808; Tue, 27 Jan 1998 15:50:05 -0800 (PST) (envelope-from gnats) Received: (from nobody@localhost) by hub.freebsd.org (8.8.8/8.8.8) id PAA14424; Tue, 27 Jan 1998 15:47:18 -0800 (PST) (envelope-from nobody) Message-Id: <199801272347.PAA14424@hub.freebsd.org> Date: Tue, 27 Jan 1998 15:47:18 -0800 (PST) From: proett@nas.nasa.gov To: freebsd-gnats-submit@FreeBSD.ORG X-Send-Pr-Version: www-1.0 Subject: kern/5587: session id gets dropped Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org >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: