NetBSD Problem Report #42030

From www@NetBSD.org  Wed Sep  9 14:37:03 2009
Return-Path: <www@NetBSD.org>
Received: from mail.netbsd.org (mail.netbsd.org [204.152.190.11])
	by www.NetBSD.org (Postfix) with ESMTP id 99DCF63BCFB
	for <gnats-bugs@gnats.netbsd.org>; Wed,  9 Sep 2009 14:37:03 +0000 (UTC)
Message-Id: <20090909143703.4A9AC63BC1D@www.NetBSD.org>
Date: Wed,  9 Sep 2009 14:37:03 +0000 (UTC)
From: alnsn@yandex.ru
Reply-To: alnsn@yandex.ru
To: gnats-bugs@NetBSD.org
Subject: tracking of file descriptors by ktrace/kdump
X-Send-Pr-Version: www-1.0

>Number:         42030
>Category:       kern
>Synopsis:       tracking of file descriptors by ktrace/kdump
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    kern-bug-people
>State:          closed
>Class:          change-request
>Submitter-Id:   net
>Arrival-Date:   Wed Sep 09 14:40:00 +0000 2009
>Closed-Date:    Wed Jun 01 21:29:30 +0000 2011
>Last-Modified:  Wed Jun 01 21:29:30 +0000 2011
>Originator:     Alexander Nasonov
>Release:        NetBSD 5.99.15
>Organization:
>Environment:
NetBSD aa1nb.lan 5.99.15 NetBSD 5.99.15 (GENERIC) #2: Sat Aug 29 23:11:34 BST 2009 alnsn@aa1nb.lan:/home/alnsn/src/netbsd-current/src/sys/arch/i386/compile/GENERIC i386
>Description:
(reposting from sendpr.cgi because send-pr(1) didn't work)

Sometimes it's useful to know a list of opened file descriptors on
program start. For instance, the output below shows that mailwrapper
inherits 4 extra descriptors from its parent:

$ env -i ./ktrace -id -tafv mail xxx@yyy.zzz
$ kdump
   686      1 ktrace   ARG   "mail"
   686      1 ktrace   ARG   "xxx@yyy.zzz"
   686      1 mail     FD    file 0
   686      1 mail     FD    file 1
   686      1 mail     FD    file 2
   687      1 mail     ARG   "sendmail"
   687      1 mail     ARG   "-i"
   687      1 mail     ARG   "xxx@yyy.zzz"
   687      1 mailwrapper FD    file 0
   687      1 mailwrapper FD    file 1
   687      1 mailwrapper FD    file 2
   687      1 mailwrapper FD    file 3
   687      1 mailwrapper FD    file 4
   687      1 mailwrapper FD    file 5
   687      1 mailwrapper FD    file 6
   687      1 mailwrapper ARG   "sendmail"
   687      1 mailwrapper ARG   "-i"
   687      1 mailwrapper ARG   "xxx@yyy.zzz"
   687      1 sendmail FD    file 0
   687      1 sendmail FD    file 1
   687      1 sendmail FD    file 2
   687      1 sendmail FD    file 3
   687      1 sendmail FD    file 4
   687      1 sendmail FD    file 5
   687      1 sendmail FD    file 6
   434      1 sendmail ARG   "/usr/sbin/postdrop"
   434      1 sendmail ARG   "-r"
   434      1 sendmail ENV   "PATH=/usr/bin:/bin:/usr/pkg/bin:/usr/local/bin"
   434      1 postdrop FD    socket 0
   434      1 postdrop FD    socket 1
   434      1 postdrop FD    file 2


>How-To-Repeat:

>Fix:
Index: sys/sys/ktrace.h
===================================================================
RCS file: /cvsroot/src/sys/sys/ktrace.h,v
retrieving revision 1.56
diff -u -r1.56 ktrace.h
--- sys/sys/ktrace.h	11 Jan 2009 02:45:55 -0000	1.56
+++ sys/sys/ktrace.h	29 Aug 2009 22:24:02 -0000
@@ -246,6 +246,14 @@
 #define KTR_MIB		14
 	/* Record contains MIB name */

+/*
+ * KTR_EXEC_FD - Opened file descriptor from exec
+ */
+#define KTR_EXEC_FD		15
+struct ktr_execfd {
+	int   ktr_fd;
+	u_int ktr_dtype; /* one of DTYPE_* constants */
+};

 /*
  * kernel trace points (in p_traceflag)
@@ -265,6 +273,7 @@
 #define KTRFAC_MOOL	(1<<KTR_MOOL)
 #define	KTRFAC_SAUPCALL	(1<<KTR_SAUPCALL)
 #define	KTRFAC_MIB	(1<<KTR_MIB)
+#define	KTRFAC_EXEC_FD	(1<<KTR_EXEC_FD)
 /*
  * trace flags (also in p_traceflags)
  */
@@ -319,6 +328,7 @@
 void ktr_mool(const void *, size_t, const void *);
 void ktr_execarg(const void *, size_t);
 void ktr_execenv(const void *, size_t);
+void ktr_execfd(int fd, u_int dtype);
 void ktr_saupcall(struct lwp *, int, int, int, void *, void *, void *);

 static inline bool
@@ -440,6 +450,13 @@
 }

 static inline void
+ktrexecfd(int fd, u_int dtype)
+{
+	if (__predict_false(ktrace_on))
+		ktr_execfd(fd, dtype);
+}
+
+static inline void
 ktrsaupcall(struct lwp *a, int b, int c, int d, void *e, void *f, void *g)
 {
 	if (__predict_false(ktrace_on))
Index: sys/sys/filedesc.h
===================================================================
RCS file: /cvsroot/src/sys/sys/filedesc.h,v
retrieving revision 1.56
diff -u -r1.56 filedesc.h
--- sys/sys/filedesc.h	25 May 2009 03:59:45 -0000	1.56
+++ sys/sys/filedesc.h	29 Aug 2009 22:24:02 -0000
@@ -193,6 +193,7 @@
 void	fd_hold(void);
 void	fd_free(void);
 void	fd_closeexec(void);
+void	fd_ktrexecfd(void);
 int	fd_checkstd(void);
 file_t	*fd_getfile(unsigned);
 file_t	*fd_getfile2(proc_t *, unsigned);
Index: sys/kern/kern_ktrace.c
===================================================================
RCS file: /cvsroot/src/sys/kern/kern_ktrace.c,v
retrieving revision 1.149
diff -u -r1.149 kern_ktrace.c
--- sys/kern/kern_ktrace.c	5 Aug 2009 19:53:42 -0000	1.149
+++ sys/kern/kern_ktrace.c	29 Aug 2009 22:24:03 -0000
@@ -655,6 +655,25 @@
 	ktr_kmem(l, KTR_EXEC_ENV, bf, len);
 }

+void
+ktr_execfd(int fd, u_int dtype)
+{
+	struct ktrace_entry *kte;
+	struct ktr_execfd* ktp;
+
+	lwp_t *l = curlwp;
+
+	if (!KTRPOINT(l->l_proc, KTR_EXEC_FD))
+		return;
+
+	if (ktealloc(&kte, (void *)&ktp, l, KTR_EXEC_FD, sizeof(*ktp)))
+		return;
+
+	ktp->ktr_fd = fd;
+	ktp->ktr_dtype = dtype;
+	ktraddentry(l, kte, KTA_WAITOK);
+}
+
 static void
 ktr_kmem(lwp_t *l, int type, const void *bf, size_t len)
 {
Index: sys/kern/kern_exec.c
===================================================================
RCS file: /cvsroot/src/sys/kern/kern_exec.c,v
retrieving revision 1.290
diff -u -r1.290 kern_exec.c
--- sys/kern/kern_exec.c	6 Aug 2009 21:33:54 -0000	1.290
+++ sys/kern/kern_exec.c	29 Aug 2009 22:24:03 -0000
@@ -928,6 +928,8 @@
 	}

 	fd_closeexec();		/* handle close on exec */
+	if(__predict_false(ktrace_on))
+		fd_ktrexecfd();
 	execsigs(p);		/* reset catched signals */

 	l->l_ctxlink = NULL;	/* reset ucontext link */
Index: sys/kern/subr_exec_fd.c
===================================================================
RCS file: /cvsroot/src/sys/kern/subr_exec_fd.c,v
retrieving revision 1.2
diff -u -r1.2 subr_exec_fd.c
--- sys/kern/subr_exec_fd.c	24 May 2009 21:41:26 -0000	1.2
+++ sys/kern/subr_exec_fd.c	29 Aug 2009 22:24:03 -0000
@@ -40,6 +40,7 @@
 #include <sys/namei.h>
 #include <sys/syslog.h>
 #include <sys/vnode.h>
+#include <sys/ktrace.h>

 /*
  * Close open files on exec.
@@ -98,6 +99,34 @@
 	}
 }

+void
+fd_ktrexecfd(void)
+{
+	proc_t *p;
+	filedesc_t *fdp;
+	fdfile_t *ff;
+	lwp_t *l;
+	fdtab_t *dt;
+	int fd;
+
+	l = curlwp;
+	p = l->l_proc;
+	fdp = p->p_fd;
+	dt = fdp->fd_dt;
+
+	for (fd = 0; fd <= fdp->fd_lastfile; fd++) {
+		if ((ff = dt->dt_ff[fd]) == NULL) {
+			KASSERT(fd >= NDFDFILE);
+			continue;
+		}
+		KASSERT(fd >= NDFDFILE ||
+		    ff == (fdfile_t *)fdp->fd_dfdfile[fd]);
+		if (ff->ff_file == NULL)
+			continue;
+		ktr_execfd(fd, ff->ff_file->f_type);
+	}
+}
+
 /*
  * It is unsafe for set[ug]id processes to be started with file
  * descriptors 0..2 closed, as these descriptors are given implicit
Index: usr.bin/ktrace/ktrace.1
===================================================================
RCS file: /cvsroot/src/usr.bin/ktrace/ktrace.1,v
retrieving revision 1.39
diff -u -r1.39 ktrace.1
--- usr.bin/ktrace/ktrace.1	27 Aug 2007 16:35:47 -0000	1.39
+++ usr.bin/ktrace/ktrace.1	29 Aug 2009 22:24:03 -0000
@@ -181,6 +181,8 @@
 trace system calls
 .It Cm e
 trace emulation changes
+.It Cm f
+trace open file descriptors after exec
 .It Cm i
 trace
 .Tn I/O
Index: usr.bin/ktrace/subr.c
===================================================================
RCS file: /cvsroot/src/usr.bin/ktrace/subr.c,v
retrieving revision 1.16
diff -u -r1.16 subr.c
--- usr.bin/ktrace/subr.c	9 Feb 2007 22:08:49 -0000	1.16
+++ usr.bin/ktrace/subr.c	29 Aug 2009 22:24:04 -0000
@@ -73,6 +73,9 @@
 		case 'e':
 			fac = KTRFAC_EMUL;
 			break;
+		case 'f':
+			fac = KTRFAC_EXEC_FD;
+			break;
 		case 'i':
 			fac = KTRFAC_GENIO;
 			break;
Index: usr.bin/kdump/kdump.c
===================================================================
RCS file: /cvsroot/src/usr.bin/kdump/kdump.c,v
retrieving revision 1.104
diff -u -r1.104 kdump.c
--- usr.bin/kdump/kdump.c	13 Apr 2009 14:39:23 -0000	1.104
+++ usr.bin/kdump/kdump.c	29 Aug 2009 22:24:04 -0000
@@ -44,7 +44,9 @@
 #endif /* not lint */

 #include <sys/param.h>
+#include <sys/proc.h> /* XXX #include <sys/file.h> fails without this header */
 #define _KERNEL
+#include <sys/file.h>
 #include <sys/errno.h>
 #undef _KERNEL
 #include <sys/time.h>
@@ -117,6 +119,7 @@
 static void	ktrmmsg(struct ktr_mmsg *, int);
 static void	ktrmool(struct ktr_mool *, int);
 static void	ktrmib(int *, int);
+static void	ktrexecfd(struct ktr_execfd *);
 static void	usage(void) __dead;
 static void	eprint(int);
 static void	rprint(register_t);
@@ -303,6 +306,9 @@
 		case KTR_EXEC_ENV:
 			visdump_buf(m, ktrlen, col);
 			break;
+		case KTR_EXEC_FD:
+			ktrexecfd(m);
+			break;
 		case KTR_MIB:
 			ktrmib(m, ktrlen);
 			break;
@@ -378,6 +384,9 @@
 	case KTR_EXEC_ARG:
 		type = "ARG";
 		break;
+	case KTR_EXEC_FD:
+		type = "FD";
+		break;
 	case KTR_SAUPCALL:
 		type = "SAU";
 		break;
@@ -646,6 +655,17 @@
 }

 static void
+ktrexecfd(struct ktr_execfd* ktr)
+{
+	static const char *dnames[] = { DTYPE_NAMES };
+	const size_t dnames_sz = sizeof(dnames) / sizeof(dnames[0]);
+	if(ktr->ktr_dtype > 0 && ktr->ktr_dtype < dnames_sz)
+		printf("%s %d\n", dnames[ktr->ktr_dtype], ktr->ktr_fd);
+	else
+		printf("%d\n", ktr->ktr_fd);
+}
+
+static void
 rprint(register_t ret)
 {


>Release-Note:

>Audit-Trail:

Responsible-Changed-From-To: misc-bug-people->kern-bug-people
Responsible-Changed-By: dholland@NetBSD.org
Responsible-Changed-When: Sun, 18 Oct 2009 23:55:54 +0000
Responsible-Changed-Why:
Mostly a kernel patch.


From: Alexander Nasonov <alnsn@yandex.ru>
To: gnats-bugs@NetBSD.org
Cc: misc-bug-people@netbsd.org, gnats-admin@netbsd.org,
	netbsd-bugs@netbsd.org
Subject: Re: kern/42030: tracking of file descriptors by ktrace/kdump
Date: Fri, 5 Feb 2010 00:51:46 +0000

 The previous patch breaks INSTALL_FLOPPY. One more file should be
 modified to fix this:

 Index: sys/kern/kern_stub.c
 ===================================================================
 RCS file: /cvsroot/src/sys/kern/kern_stub.c,v
 retrieving revision 1.21
 diff -u -r1.21 kern_stub.c
 --- sys/kern/kern_stub.c	3 Nov 2009 05:23:28 -0000	1.21
 +++ sys/kern/kern_stub.c	5 Feb 2010 00:46:30 -0000
 @@ -120,6 +120,7 @@
  __weak_alias(ktr_mool,nullop);
  __weak_alias(ktr_execarg,nullop);
  __weak_alias(ktr_execenv,nullop);
 +__weak_alias(ktr_execfd,nullop);

  __weak_alias(sys_fktrace,sys_nosys);	/* Syscalls */
  __weak_alias(sys_ktrace,sys_nosys);
 Index: sys/kern/kern_stub.c
 ===================================================================
 RCS file: /cvsroot/src/sys/kern/kern_stub.c,v
 retrieving revision 1.21
 diff -u -r1.21 kern_stub.c
 --- sys/kern/kern_stub.c	3 Nov 2009 05:23:28 -0000	1.21
 +++ sys/kern/kern_stub.c	5 Feb 2010 00:46:30 -0000
 @@ -120,6 +120,7 @@
  __weak_alias(ktr_mool,nullop);
  __weak_alias(ktr_execarg,nullop);
  __weak_alias(ktr_execenv,nullop);
 +__weak_alias(ktr_execfd,nullop);

  __weak_alias(sys_fktrace,sys_nosys);	/* Syscalls */
  __weak_alias(sys_ktrace,sys_nosys);

State-Changed-From-To: open->closed
State-Changed-By: alnsn@NetBSD.org
State-Changed-When: Wed, 01 Jun 2011 21:29:30 +0000
State-Changed-Why:
Implemented in -current.


>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2007 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.