From owner-p4-projects Tue Aug 13 17: 6:55 2002 Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id EB6D937B405; Tue, 13 Aug 2002 17:06:37 -0700 (PDT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.FreeBSD.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 48CE537B400 for ; Tue, 13 Aug 2002 17:06:37 -0700 (PDT) Received: from freefall.freebsd.org (freefall.FreeBSD.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id D7AF543E4A for ; Tue, 13 Aug 2002 17:06:36 -0700 (PDT) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from freefall.freebsd.org (perforce@localhost [127.0.0.1]) by freefall.freebsd.org (8.12.4/8.12.4) with ESMTP id g7E06aJU015683 for ; Tue, 13 Aug 2002 17:06:36 -0700 (PDT) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by freefall.freebsd.org (8.12.4/8.12.4/Submit) id g7E06ak4015680 for perforce@freebsd.org; Tue, 13 Aug 2002 17:06:36 -0700 (PDT) Date: Tue, 13 Aug 2002 17:06:36 -0700 (PDT) Message-Id: <200208140006.g7E06ak4015680@freefall.freebsd.org> X-Authentication-Warning: freefall.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 15946 for review To: Perforce Change Reviews Sender: owner-p4-projects@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG http://people.freebsd.org/~peter/p4db/chv.cgi?CH=15946 Change 15946 by rwatson@rwatson_paprika on 2002/08/13 17:05:37 When I added active_cred arguments to the file op function prototypes, I figured I'd add one to fo_close() also for consistency. As it turns out, this wasn't such a good idea: there isn't always an active credential available due to the way the current code is constructed (td==NULL may get passed into higher level file descriptor code, resulting in a NULL pointer dereference in a couple of odd-ball cases, such as the NFS server code). Since the MAC implementation doesn't currently have a close-related event, back out the addition of active_cred to fo_close() its implementations. Keep the use of active_cred in vn_close() while removing it from vn_closefile() as similar credential code already existed there and keeping the new naming scheme increases consistency. This should fix the panic on shutdown when the NFS server is running. Affected files ... .. //depot/projects/trustedbsd/mac/sys/dev/streams/streams.c#7 edit .. //depot/projects/trustedbsd/mac/sys/kern/kern_descrip.c#24 edit .. //depot/projects/trustedbsd/mac/sys/kern/kern_event.c#9 edit .. //depot/projects/trustedbsd/mac/sys/kern/sys_pipe.c#19 edit .. //depot/projects/trustedbsd/mac/sys/kern/sys_socket.c#10 edit .. //depot/projects/trustedbsd/mac/sys/kern/vfs_vnops.c#48 edit .. //depot/projects/trustedbsd/mac/sys/sys/file.h#10 edit .. //depot/projects/trustedbsd/mac/sys/sys/socketvar.h#21 edit Differences ... ==== //depot/projects/trustedbsd/mac/sys/dev/streams/streams.c#7 (text+ko) ==== @@ -61,7 +61,7 @@ #include #include -static int svr4_soo_close(struct file *, struct ucred *, struct thread *); +static int svr4_soo_close(struct file *, struct thread *); static int svr4_ptm_alloc(struct thread *); static d_open_t streamsopen; @@ -416,7 +416,7 @@ } static int -svr4_soo_close(struct file *fp, struct ucred *active_cred, struct thread *td) +svr4_soo_close(struct file *fp, struct thread *td) { struct socket *so = (struct socket *)fp->f_data; @@ -424,5 +424,5 @@ svr4_delete_socket(td->td_proc, fp); free(so->so_emuldata, M_TEMP); - return soo_close(fp, active_cred, td); + return soo_close(fp, td); } ==== //depot/projects/trustedbsd/mac/sys/kern/kern_descrip.c#24 (text+ko) ==== @@ -109,8 +109,7 @@ static int badfo_kqfilter(struct file *fp, struct knote *kn); static int badfo_stat(struct file *fp, struct stat *sb, struct ucred *active_cred, struct thread *td); -static int badfo_close(struct file *fp, struct ucred *active_cred, - struct thread *td); +static int badfo_close(struct file *fp, struct thread *td); /* * Descriptor management. @@ -1848,7 +1847,7 @@ } else FILE_UNLOCK(fp); if (fp->f_ops != &badfileops) - error = fo_close(fp, td->td_ucred, td); + error = fo_close(fp, td); else error = 0; ffree(fp); @@ -2234,9 +2233,8 @@ } static int -badfo_close(fp, active_cred, td) +badfo_close(fp, td) struct file *fp; - struct ucred *active_cred; struct thread *td; { ==== //depot/projects/trustedbsd/mac/sys/kern/kern_event.c#9 (text+ko) ==== @@ -67,8 +67,7 @@ static int kqueue_kqfilter(struct file *fp, struct knote *kn); static int kqueue_stat(struct file *fp, struct stat *st, struct ucred *active_cred, struct thread *td); -static int kqueue_close(struct file *fp, struct ucred *active_cred, - struct thread *td); +static int kqueue_close(struct file *fp, struct thread *td); static void kqueue_wakeup(struct kqueue *kq); static struct fileops kqueueops = { @@ -840,7 +839,7 @@ /*ARGSUSED*/ static int -kqueue_close(struct file *fp, struct ucred *active_cred, struct thread *td) +kqueue_close(struct file *fp, struct thread *td) { struct kqueue *kq = (struct kqueue *)fp->f_data; struct filedesc *fdp = td->td_proc->p_fd; ==== //depot/projects/trustedbsd/mac/sys/kern/sys_pipe.c#19 (text+ko) ==== @@ -98,8 +98,7 @@ struct ucred *active_cred, int flags, struct thread *td); static int pipe_write(struct file *fp, struct uio *uio, struct ucred *active_cred, int flags, struct thread *td); -static int pipe_close(struct file *fp, struct ucred *active_cred, - struct thread *td); +static int pipe_close(struct file *fp, struct thread *td); static int pipe_poll(struct file *fp, int events, struct ucred *active_cred, struct thread *td); static int pipe_kqfilter(struct file *fp, struct knote *kn); @@ -1305,9 +1304,8 @@ /* ARGSUSED */ static int -pipe_close(fp, active_cred, td) +pipe_close(fp, td) struct file *fp; - struct ucred *active_cred; struct thread *td; { struct pipe *cpipe = (struct pipe *)fp->f_data; ==== //depot/projects/trustedbsd/mac/sys/kern/sys_socket.c#10 (text+ko) ==== @@ -203,9 +203,8 @@ */ /* ARGSUSED */ int -soo_close(fp, active_cred, td) +soo_close(fp, td) struct file *fp; - struct ucred *active_cred; struct thread *td; { int error = 0; ==== //depot/projects/trustedbsd/mac/sys/kern/vfs_vnops.c#48 (text+ko) ==== @@ -63,8 +63,7 @@ #include -static int vn_closefile(struct file *fp, struct ucred *active_cred, - struct thread *td); +static int vn_closefile(struct file *fp, struct thread *td); static int vn_ioctl(struct file *fp, u_long com, void *data, struct ucred *active_cred, struct thread *td); static int vn_read(struct file *fp, struct uio *uio, @@ -883,9 +882,8 @@ * File table vnode close routine. */ static int -vn_closefile(fp, active_cred, td) +vn_closefile(fp, td) struct file *fp; - struct ucred *active_cred; struct thread *td; { ==== //depot/projects/trustedbsd/mac/sys/sys/file.h#10 (text+ko) ==== @@ -94,8 +94,7 @@ int (*fo_kqfilter)(struct file *fp, struct knote *kn); int (*fo_stat)(struct file *fp, struct stat *sb, struct ucred *active_cred, struct thread *td); - int (*fo_close)(struct file *fp, - struct ucred *active_cred, struct thread *td); + int (*fo_close)(struct file *fp, struct thread *td); } *f_ops; int f_seqcount; /* * count of sequential accesses -- cleared @@ -186,8 +185,7 @@ struct ucred *active_cred, struct thread *td); static __inline int fo_stat(struct file *fp, struct stat *sb, struct ucred *active_cred, struct thread *td); -static __inline int fo_close(struct file *fp, struct ucred *active_cred, - struct thread *td); +static __inline int fo_close(struct file *fp, struct thread *td); static __inline int fo_kqfilter(struct file *fp, struct knote *kn); struct proc; @@ -196,12 +194,11 @@ struct file *fp; struct uio *uio; struct ucred *active_cred; + int flags; struct thread *td; - int flags; { - return ((*fp->f_ops->fo_read)(fp, uio, active_cred, flags, - td)); + return ((*fp->f_ops->fo_read)(fp, uio, active_cred, flags, td)); } static __inline int @@ -251,13 +248,12 @@ } static __inline int -fo_close(fp, active_cred, td) +fo_close(fp, td) struct file *fp; - struct ucred *active_cred; struct thread *td; { - return ((*fp->f_ops->fo_close)(fp, active_cred, td)); + return ((*fp->f_ops->fo_close)(fp, td)); } static __inline int ==== //depot/projects/trustedbsd/mac/sys/sys/socketvar.h#21 (text+ko) ==== @@ -349,8 +349,7 @@ int flags, struct thread *td); int soo_write(struct file *fp, struct uio *uio, struct ucred *active_cred, int flags, struct thread *td); -int soo_close(struct file *fp, struct ucred *active_cred, - struct thread *td); +int soo_close(struct file *fp, struct thread *td); int soo_ioctl(struct file *fp, u_long cmd, void *data, struct ucred *active_cred, struct thread *td); int soo_poll(struct file *fp, int events, struct ucred *active_cred, To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message