From owner-p4-projects@FreeBSD.ORG Sun Jun 26 09:54:29 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id D1300106566C; Sun, 26 Jun 2011 09:54:28 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 93599106564A for ; Sun, 26 Jun 2011 09:54:28 +0000 (UTC) (envelope-from ilya@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 812158FC22 for ; Sun, 26 Jun 2011 09:54:28 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5Q9sShU012632 for ; Sun, 26 Jun 2011 09:54:28 GMT (envelope-from ilya@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5Q9sS3M012629 for perforce@freebsd.org; Sun, 26 Jun 2011 09:54:28 GMT (envelope-from ilya@FreeBSD.org) Date: Sun, 26 Jun 2011 09:54:28 GMT Message-Id: <201106260954.p5Q9sS3M012629@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to ilya@FreeBSD.org using -f From: Ilya Putsikau To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195355 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Jun 2011 09:54:29 -0000 http://p4web.freebsd.org/@@195355?ac=10 Change 195355 by ilya@ilya_triton2011 on 2011/06/26 09:53:37 Add fuse_isdeadfs checks, check LINK_MAX in vnop_link, IO_NDELAY in vnop_close Handle not initialized session in vnop_access Affected files ... .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.c#8 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.h#14 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_param.h#3 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#28 edit Differences ... ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.c#8 (text+ko) ==== @@ -129,6 +129,10 @@ /* NOTREACHED */ } + if (fuse_isdeadfs(vp)) { + goto out; + } + if (vnode_isdir(vp)) { op = FUSE_RELEASEDIR; isdir = 1; ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.h#14 (text+ko) ==== @@ -109,9 +109,8 @@ static __inline__ int -fuse_isdeadfs(struct vnode *vp) +fuse_isdeadfs_mp(struct mount *mp) { - struct mount *mp = vnode_mount(vp); struct fuse_data *data = fuse_get_mpdata(mp); return (data->dataflags & FSESS_DEAD); @@ -119,11 +118,16 @@ static __inline__ int -fuse_isdeadfs_mp(struct mount *mp) +fuse_isdeadfs(struct vnode *vp) { - struct fuse_data *data = fuse_get_mpdata(mp); + return fuse_isdeadfs_mp(vnode_mount(vp)); +} - return (data->dataflags & FSESS_DEAD); +static __inline__ +int +fuse_isdeadfs_fs(struct vnode *vp) +{ + return fuse_isdeadfs_mp(vnode_mount(vp)); } /* access */ ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_param.h#3 (text+ko) ==== @@ -47,4 +47,6 @@ #endif +#define FUSE_LINK_MAX LINK_MAX + #endif /* _FUSE_PARAM_H_ */ ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#28 (text+ko) ==== @@ -47,6 +47,7 @@ #include "fuse_internal.h" #include "fuse_ipc.h" #include "fuse_node.h" +#include "fuse_param.h" #include "fuse_io.h" #include @@ -140,9 +141,11 @@ { struct vnode *vp = ap->a_vp; int accmode = ap->a_accmode; + struct ucred *cred = ap->a_cred; struct fuse_access_param facp; struct fuse_vnode_data *fvdat = VTOFUD(vp); + struct fuse_data *data = fuse_get_mpdata(vnode_mount(vp)); fuse_trace_printf_vnop(); @@ -153,6 +156,16 @@ return EBADF; } + if (!(data->dataflags & FSESS_INITED)) { + if (vnode_isvroot(vp)) { + if (priv_check_cred(cred, PRIV_VFS_ADMIN, 0) || + (fuse_match_cred(data->daemoncred, cred) == 0)) { + return 0; + } + } + return EBADF; + } + if (vnode_islnk(vp)) { return 0; } @@ -186,7 +199,11 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(vp)) { + if (fuse_isdeadfs(vp)) { + return 0; + } + + if (fflag & IO_NDELAY) { return 0; } @@ -242,7 +259,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(dvp)) { + if (fuse_isdeadfs_fs(dvp)) { panic("FUSE: fuse_vnop_create(): called on a dead file system"); } @@ -386,7 +403,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(vp)) { + if (fuse_isdeadfs(vp)) { return 0; } @@ -557,6 +574,8 @@ struct vnode *tdvp = ap->a_tdvp; struct componentname *cnp = ap->a_cnp; + struct vattr *vap = VTOVA(vp); + struct fuse_dispatcher fdi; struct fuse_entry_out *feo; struct fuse_link_in fli; @@ -565,14 +584,18 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(vp)) { - panic("fuse_vnop_link(): called on a dead file system"); + if (fuse_isdeadfs_fs(vp)) { + panic("FUSE: fuse_vnop_link(): called on a dead file system"); } if (vnode_mount(tdvp) != vnode_mount(vp)) { return EXDEV; } + if (vap->va_nlink >= FUSE_LINK_MAX) { + return EMLINK; + } + fli.oldnodeid = VTOI(vp); fdisp_init(&fdi, 0); @@ -1039,7 +1062,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(dvp)) { + if (fuse_isdeadfs_fs(dvp)) { panic("FUSE: fuse_vnop_mkdir(): called on a dead file system"); } @@ -1077,7 +1100,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(dvp)) { + if (fuse_isdeadfs_fs(dvp)) { panic("fuse_vnop_mknod(): called on a dead file system"); } @@ -1193,7 +1216,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(vp)) { + if (fuse_isdeadfs(vp)) { return EIO; } @@ -1226,7 +1249,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(vp)) { + if (fuse_isdeadfs(vp)) { return EBADF; } @@ -1283,7 +1306,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(vp)) { + if (fuse_isdeadfs(vp)) { return EBADF; } @@ -1376,7 +1399,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(vp)) { + if (fuse_isdeadfs_fs(vp)) { panic("FUSE: fuse_vnop_remove(): called on a dead file system"); } @@ -1420,8 +1443,8 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(fdvp)) { - panic("fuse_vnop_rename(): called on a dead file system"); + if (fuse_isdeadfs_fs(fdvp)) { + panic("FUSE: fuse_vnop_rename(): called on a dead file system"); } if (fvp->v_mount != tdvp->v_mount || @@ -1491,8 +1514,8 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(ap->a_vp)) { - panic("fuse_vnop_rmdir(): called on a dead file system"); + if (fuse_isdeadfs_fs(vp)) { + panic("FUSE: fuse_vnop_rmdir(): called on a dead file system"); } if (VTOFUD(vp) == VTOFUD(dvp)) { @@ -1555,7 +1578,7 @@ * ... */ - if (fuse_isdeadfs_nop(vp)) { + if (fuse_isdeadfs(vp)) { return EBADF; } @@ -1740,6 +1763,10 @@ int err; size_t len; + if (fuse_isdeadfs_fs(dvp)) { + panic("FUSE: fuse_vnop_symlink(): called on a dead file system"); + } + /* * Unlike the other creator type calls, here we have to create a message * where the name of the new entry comes first, and the data describing @@ -1783,7 +1810,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(vp)) { + if (fuse_isdeadfs(vp)) { return EIO; }