Module Name:    src
Committed By:   alnsn
Date:           Wed Jun  1 21:25:02 UTC 2011

Modified Files:
        src/sys/kern: kern_exec.c kern_ktrace.c kern_stub.c subr_exec_fd.c
        src/sys/sys: filedesc.h ktrace.h

Log Message:
kern/42030 - tracking of file descriptors by ktrace/kdump


To generate a diff of this commit:
cvs rdiff -u -r1.314 -r1.315 src/sys/kern/kern_exec.c
cvs rdiff -u -r1.156 -r1.157 src/sys/kern/kern_ktrace.c
cvs rdiff -u -r1.32 -r1.33 src/sys/kern/kern_stub.c
cvs rdiff -u -r1.5 -r1.6 src/sys/kern/subr_exec_fd.c
cvs rdiff -u -r1.59 -r1.60 src/sys/sys/filedesc.h
cvs rdiff -u -r1.57 -r1.58 src/sys/sys/ktrace.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/kern_exec.c
diff -u src/sys/kern/kern_exec.c:1.314 src/sys/kern/kern_exec.c:1.315
--- src/sys/kern/kern_exec.c:1.314	Tue Apr 26 16:36:42 2011
+++ src/sys/kern/kern_exec.c	Wed Jun  1 21:24:59 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_exec.c,v 1.314 2011/04/26 16:36:42 joerg Exp $	*/
+/*	$NetBSD: kern_exec.c,v 1.315 2011/06/01 21:24:59 alnsn Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -59,7 +59,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.314 2011/04/26 16:36:42 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.315 2011/06/01 21:24:59 alnsn Exp $");
 
 #include "opt_ktrace.h"
 #include "opt_modular.h"
@@ -979,6 +979,10 @@
 
 	cwdexec(p);
 	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: src/sys/kern/kern_ktrace.c
diff -u src/sys/kern/kern_ktrace.c:1.156 src/sys/kern/kern_ktrace.c:1.157
--- src/sys/kern/kern_ktrace.c:1.156	Wed Apr 27 00:00:46 2011
+++ src/sys/kern/kern_ktrace.c	Wed Jun  1 21:25:00 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_ktrace.c,v 1.156 2011/04/27 00:00:46 joerg Exp $	*/
+/*	$NetBSD: kern_ktrace.c,v 1.157 2011/06/01 21:25:00 alnsn Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_ktrace.c,v 1.156 2011/04/27 00:00:46 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_ktrace.c,v 1.157 2011/06/01 21:25:00 alnsn Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -673,6 +673,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: src/sys/kern/kern_stub.c
diff -u src/sys/kern/kern_stub.c:1.32 src/sys/kern/kern_stub.c:1.33
--- src/sys/kern/kern_stub.c:1.32	Tue May 31 23:28:53 2011
+++ src/sys/kern/kern_stub.c	Wed Jun  1 21:25:01 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_stub.c,v 1.32 2011/05/31 23:28:53 dyoung Exp $	*/
+/*	$NetBSD: kern_stub.c,v 1.33 2011/06/01 21:25:01 alnsn Exp $	*/
 
 /*-
  * Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_stub.c,v 1.32 2011/05/31 23:28:53 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_stub.c,v 1.33 2011/06/01 21:25:01 alnsn Exp $");
 
 #include "opt_ptrace.h"
 #include "opt_ktrace.h"
@@ -111,6 +111,7 @@
 __weak_alias(ktr_mib,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: src/sys/kern/subr_exec_fd.c
diff -u src/sys/kern/subr_exec_fd.c:1.5 src/sys/kern/subr_exec_fd.c:1.6
--- src/sys/kern/subr_exec_fd.c:1.5	Tue Feb 15 15:54:28 2011
+++ src/sys/kern/subr_exec_fd.c	Wed Jun  1 21:25:01 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_exec_fd.c,v 1.5 2011/02/15 15:54:28 pooka Exp $	*/
+/*	$NetBSD: subr_exec_fd.c,v 1.6 2011/06/01 21:25:01 alnsn Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_exec_fd.c,v 1.5 2011/02/15 15:54:28 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_exec_fd.c,v 1.6 2011/06/01 21:25:01 alnsn Exp $");
 
 #include <sys/param.h>
 #include <sys/file.h>
@@ -36,6 +36,35 @@
 #include <sys/namei.h>
 #include <sys/syslog.h>
 #include <sys/vnode.h>
+#include <sys/ktrace.h>
+
+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

Index: src/sys/sys/filedesc.h
diff -u src/sys/sys/filedesc.h:1.59 src/sys/sys/filedesc.h:1.60
--- src/sys/sys/filedesc.h:1.59	Sun Apr 10 15:45:33 2011
+++ src/sys/sys/filedesc.h	Wed Jun  1 21:25:02 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: filedesc.h,v 1.59 2011/04/10 15:45:33 christos Exp $	*/
+/*	$NetBSD: filedesc.h,v 1.60 2011/06/01 21:25:02 alnsn Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -193,6 +193,7 @@
 void	fd_hold(lwp_t *);
 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: src/sys/sys/ktrace.h
diff -u src/sys/sys/ktrace.h:1.57 src/sys/sys/ktrace.h:1.58
--- src/sys/sys/ktrace.h:1.57	Wed Apr 27 00:00:46 2011
+++ src/sys/sys/ktrace.h	Wed Jun  1 21:25:02 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: ktrace.h,v 1.57 2011/04/27 00:00:46 joerg Exp $	*/
+/*	$NetBSD: ktrace.h,v 1.58 2011/06/01 21:25:02 alnsn Exp $	*/
 
 /*
  * Copyright (c) 1988, 1993
@@ -217,6 +217,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)
@@ -234,6 +242,7 @@
 #define KTRFAC_EXEC_ENV	(1<<KTR_EXEC_ENV)
 #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)
  */
@@ -286,6 +295,7 @@
 void ktr_mib(const int *a , u_int b);
 void ktr_execarg(const void *, size_t);
 void ktr_execenv(const void *, size_t);
+void ktr_execfd(int, u_int);
 void ktr_saupcall(struct lwp *, int, int, int, void *, void *, void *);
 
 static inline bool
@@ -393,6 +403,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))

Reply via email to