diff --git a/sys/fs/msdosfs/msdosfs_lookup.c b/sys/fs/msdosfs/msdosfs_lookup.c index 269184269737..5e9cbca13422 100644 --- a/sys/fs/msdosfs/msdosfs_lookup.c +++ b/sys/fs/msdosfs/msdosfs_lookup.c @@ -1,4 +1,4 @@ -/* $Id: msdosfs_lookup.c,v 1.1 1994/09/19 15:41:44 dfr Exp $ */ +/* $Id: msdosfs_lookup.c,v 1.2 1994/09/27 20:42:51 phk Exp $ */ /* $NetBSD: msdosfs_lookup.c,v 1.14 1994/08/21 18:44:07 ws Exp $ */ /*- @@ -109,6 +109,7 @@ msdosfs_lookup(ap) struct msdosfsmount *pmp; struct buf *bp = 0; struct direntry *dep = NULL; + struct ucred *cred = cnp->cn_cred; u_char dosfilename[12]; int flags = cnp->cn_flags; int nameiop = cnp->cn_nameiop; @@ -318,6 +319,9 @@ notfound:; #endif if ((nameiop == CREATE || nameiop == RENAME) && (flags & ISLASTCN) && dp->de_refcnt != 0) { + error = VOP_ACCESS(vdp, VWRITE, cred, cnp->cn_proc); + if (error) + return error; if (slotstatus == NONE) { dp->de_fndoffset = (u_long)-1; dp->de_fndclust = (u_long)-1; @@ -363,6 +367,12 @@ foundroot:; * deget() the directory entry. */ if (nameiop == DELETE && (flags & ISLASTCN)) { + error = VOP_ACCESS(vdp, VWRITE, cred, cnp->cn_proc); + if (error) { + if (bp) + brelse(bp); + return error; + } if (dp->de_StartCluster == scn && isadir) { /* "." */ VREF(vdp); *vpp = vdp; @@ -388,6 +398,12 @@ foundroot:; * If renaming. */ if (nameiop == RENAME && wantparent && (flags & ISLASTCN)) { + error = VOP_ACCESS(vdp, VWRITE, cred, cnp->cn_proc); + if (error) { + if (bp) + brelse(bp); + return error; + } if (dp->de_StartCluster == scn && isadir) { if (bp) brelse(bp); diff --git a/sys/fs/msdosfs/msdosfs_vnops.c b/sys/fs/msdosfs/msdosfs_vnops.c index a1e239578603..0993c9d6379c 100644 --- a/sys/fs/msdosfs/msdosfs_vnops.c +++ b/sys/fs/msdosfs/msdosfs_vnops.c @@ -1,4 +1,4 @@ -/* $Id: msdosfs_vnops.c,v 1.13 1995/03/19 14:28:57 davidg Exp $ */ +/* $Id: msdosfs_vnops.c,v 1.14 1995/04/11 18:32:17 ache Exp $ */ /* $NetBSD: msdosfs_vnops.c,v 1.20 1994/08/21 18:44:13 ws Exp $ */ /*- @@ -394,6 +394,11 @@ msdosfs_setattr(ap) return error; } if (vap->va_mtime.ts_sec != VNOVAL) { + if (cred->cr_uid != dep->de_pmp->pm_uid && + (error = suser(cred, &ap->a_p->p_acflag)) && + ((vap->va_vaflags & VA_UTIMES_NULL) == 0 || + (error = VOP_ACCESS(ap->a_vp, VWRITE, cred, &ap->a_p)))) + return error; dep->de_flag |= DE_UPDATE; error = deupdat(dep, &vap->va_mtime, 1); if (error) @@ -406,6 +411,10 @@ msdosfs_setattr(ap) * attribute. */ if (vap->va_mode != (u_short) VNOVAL) { + if (cred->cr_uid != dep->de_pmp->pm_uid && + (error = suser(cred, &ap->a_p->p_acflag))) + return error; + /* We ignore the read and execute bits */ if (vap->va_mode & VWRITE) dep->de_Attributes &= ~ATTR_READONLY; diff --git a/sys/msdosfs/msdosfs_lookup.c b/sys/msdosfs/msdosfs_lookup.c index 269184269737..5e9cbca13422 100644 --- a/sys/msdosfs/msdosfs_lookup.c +++ b/sys/msdosfs/msdosfs_lookup.c @@ -1,4 +1,4 @@ -/* $Id: msdosfs_lookup.c,v 1.1 1994/09/19 15:41:44 dfr Exp $ */ +/* $Id: msdosfs_lookup.c,v 1.2 1994/09/27 20:42:51 phk Exp $ */ /* $NetBSD: msdosfs_lookup.c,v 1.14 1994/08/21 18:44:07 ws Exp $ */ /*- @@ -109,6 +109,7 @@ msdosfs_lookup(ap) struct msdosfsmount *pmp; struct buf *bp = 0; struct direntry *dep = NULL; + struct ucred *cred = cnp->cn_cred; u_char dosfilename[12]; int flags = cnp->cn_flags; int nameiop = cnp->cn_nameiop; @@ -318,6 +319,9 @@ notfound:; #endif if ((nameiop == CREATE || nameiop == RENAME) && (flags & ISLASTCN) && dp->de_refcnt != 0) { + error = VOP_ACCESS(vdp, VWRITE, cred, cnp->cn_proc); + if (error) + return error; if (slotstatus == NONE) { dp->de_fndoffset = (u_long)-1; dp->de_fndclust = (u_long)-1; @@ -363,6 +367,12 @@ foundroot:; * deget() the directory entry. */ if (nameiop == DELETE && (flags & ISLASTCN)) { + error = VOP_ACCESS(vdp, VWRITE, cred, cnp->cn_proc); + if (error) { + if (bp) + brelse(bp); + return error; + } if (dp->de_StartCluster == scn && isadir) { /* "." */ VREF(vdp); *vpp = vdp; @@ -388,6 +398,12 @@ foundroot:; * If renaming. */ if (nameiop == RENAME && wantparent && (flags & ISLASTCN)) { + error = VOP_ACCESS(vdp, VWRITE, cred, cnp->cn_proc); + if (error) { + if (bp) + brelse(bp); + return error; + } if (dp->de_StartCluster == scn && isadir) { if (bp) brelse(bp); diff --git a/sys/msdosfs/msdosfs_vnops.c b/sys/msdosfs/msdosfs_vnops.c index a1e239578603..0993c9d6379c 100644 --- a/sys/msdosfs/msdosfs_vnops.c +++ b/sys/msdosfs/msdosfs_vnops.c @@ -1,4 +1,4 @@ -/* $Id: msdosfs_vnops.c,v 1.13 1995/03/19 14:28:57 davidg Exp $ */ +/* $Id: msdosfs_vnops.c,v 1.14 1995/04/11 18:32:17 ache Exp $ */ /* $NetBSD: msdosfs_vnops.c,v 1.20 1994/08/21 18:44:13 ws Exp $ */ /*- @@ -394,6 +394,11 @@ msdosfs_setattr(ap) return error; } if (vap->va_mtime.ts_sec != VNOVAL) { + if (cred->cr_uid != dep->de_pmp->pm_uid && + (error = suser(cred, &ap->a_p->p_acflag)) && + ((vap->va_vaflags & VA_UTIMES_NULL) == 0 || + (error = VOP_ACCESS(ap->a_vp, VWRITE, cred, &ap->a_p)))) + return error; dep->de_flag |= DE_UPDATE; error = deupdat(dep, &vap->va_mtime, 1); if (error) @@ -406,6 +411,10 @@ msdosfs_setattr(ap) * attribute. */ if (vap->va_mode != (u_short) VNOVAL) { + if (cred->cr_uid != dep->de_pmp->pm_uid && + (error = suser(cred, &ap->a_p->p_acflag))) + return error; + /* We ignore the read and execute bits */ if (vap->va_mode & VWRITE) dep->de_Attributes &= ~ATTR_READONLY;