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))