Date: Sun, 26 Jun 2011 09:54:28 GMT From: Ilya Putsikau <ilya@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 195355 for review Message-ID: <201106260954.p5Q9sS3M012629@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
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 <sys/priv.h> @@ -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; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201106260954.p5Q9sS3M012629>