diff options
author | jh <jh@FreeBSD.org> | 2012-04-16 18:10:34 +0000 |
---|---|---|
committer | jh <jh@FreeBSD.org> | 2012-04-16 18:10:34 +0000 |
commit | 734fbc687a3c9399bc009d2fd6d52a0f297e25dc (patch) | |
tree | d9daf4812756f9b08bdf4f9cd6267a8ca4afdd98 /sys | |
parent | e8d1b1d0ceb24d95d85f7c891e331770603faf6e (diff) | |
download | FreeBSD-src-734fbc687a3c9399bc009d2fd6d52a0f297e25dc.zip FreeBSD-src-734fbc687a3c9399bc009d2fd6d52a0f297e25dc.tar.gz |
Sync tmpfs_chflags() with the recent changes to UFS:
- Add a check for unsupported file flags.
- Return EPERM when an user without PRIV_VFS_SYSFLAGS privilege attempts
to toggle SF_SETTABLE flags.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/fs/tmpfs/tmpfs_subr.c | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/sys/fs/tmpfs/tmpfs_subr.c b/sys/fs/tmpfs/tmpfs_subr.c index 96615d2..1a0de17 100644 --- a/sys/fs/tmpfs/tmpfs_subr.c +++ b/sys/fs/tmpfs/tmpfs_subr.c @@ -1078,6 +1078,11 @@ tmpfs_chflags(struct vnode *vp, int flags, struct ucred *cred, struct thread *p) node = VP_TO_TMPFS_NODE(vp); + if ((flags & ~(UF_NODUMP | UF_IMMUTABLE | UF_APPEND | UF_OPAQUE | + UF_NOUNLINK | SF_ARCHIVED | SF_IMMUTABLE | SF_APPEND | + SF_NOUNLINK | SF_SNAPSHOT)) != 0) + return (EOPNOTSUPP); + /* Disallow this operation if the file system is mounted read-only. */ if (vp->v_mount->mnt_flag & MNT_RDONLY) return EROFS; @@ -1093,27 +1098,22 @@ tmpfs_chflags(struct vnode *vp, int flags, struct ucred *cred, struct thread *p) * flags, or modify flags if any system flags are set. */ if (!priv_check_cred(cred, PRIV_VFS_SYSFLAGS, 0)) { - if (node->tn_flags - & (SF_NOUNLINK | SF_IMMUTABLE | SF_APPEND)) { + if (node->tn_flags & + (SF_NOUNLINK | SF_IMMUTABLE | SF_APPEND)) { error = securelevel_gt(cred, 0); if (error) return (error); } - /* Snapshot flag cannot be set or cleared */ - if (((flags & SF_SNAPSHOT) != 0 && - (node->tn_flags & SF_SNAPSHOT) == 0) || - ((flags & SF_SNAPSHOT) == 0 && - (node->tn_flags & SF_SNAPSHOT) != 0)) + /* The snapshot flag cannot be toggled. */ + if ((flags ^ node->tn_flags) & SF_SNAPSHOT) return (EPERM); - node->tn_flags = flags; } else { - if (node->tn_flags - & (SF_NOUNLINK | SF_IMMUTABLE | SF_APPEND) || - (flags & UF_SETTABLE) != flags) + if (node->tn_flags & + (SF_NOUNLINK | SF_IMMUTABLE | SF_APPEND) || + ((flags ^ node->tn_flags) & SF_SETTABLE)) return (EPERM); - node->tn_flags &= SF_SETTABLE; - node->tn_flags |= (flags & UF_SETTABLE); } + node->tn_flags = flags; node->tn_status |= TMPFS_NODE_CHANGED; MPASS(VOP_ISLOCKED(vp)); |