Path: blob/main/website/static/security/patches/EN-10:01/zfsvaccess.patch
18096 views
Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c1===================================================================2--- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c (revision 200583)3+++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c (working copy)4@@ -3981,21 +3981,33 @@ zfs_freebsd_access(ap)5struct thread *a_td;6} */ *ap;7{8+ accmode_t accmode;9+ int error = 0;1011/*12- * ZFS itself only knowns about VREAD, VWRITE and VEXEC, the rest13- * we have to handle by calling vaccess().14+ * ZFS itself only knowns about VREAD, VWRITE, VEXEC and VAPPEND,15*/16- if ((ap->a_accmode & ~(VREAD|VWRITE|VEXEC)) != 0) {17- vnode_t *vp = ap->a_vp;18- znode_t *zp = VTOZ(vp);19- znode_phys_t *zphys = zp->z_phys;20+ accmode = ap->a_accmode & (VREAD|VWRITE|VEXEC|VAPPEND);21+ if (accmode != 0)22+ error = zfs_access(ap->a_vp, accmode, 0, ap->a_cred, NULL);2324- return (vaccess(vp->v_type, zphys->zp_mode, zphys->zp_uid,25- zphys->zp_gid, ap->a_accmode, ap->a_cred, NULL));26+ /*27+ * VADMIN has to be handled by vaccess().28+ */29+ if (error == 0) {30+ accmode = ap->a_accmode & ~(VREAD|VWRITE|VEXEC|VAPPEND);31+ if (accmode != 0) {32+ vnode_t *vp = ap->a_vp;33+ znode_t *zp = VTOZ(vp);34+ znode_phys_t *zphys = zp->z_phys;35+36+ error = vaccess(vp->v_type, zphys->zp_mode,37+ zphys->zp_uid, zphys->zp_gid, accmode, ap->a_cred,38+ NULL);39+ }40}4142- return (zfs_access(ap->a_vp, ap->a_accmode, 0, ap->a_cred, NULL));43+ return (error);44}4546static int47Index: sys/cddl/contrib/opensolaris/uts/common/sys/vnode.h48===================================================================49--- sys/cddl/contrib/opensolaris/uts/common/sys/vnode.h (revision 200583)50+++ sys/cddl/contrib/opensolaris/uts/common/sys/vnode.h (working copy)51@@ -304,7 +304,6 @@ typedef struct xvattr {52* VOP_ACCESS flags53*/54#define V_ACE_MASK 0x1 /* mask represents NFSv4 ACE permissions */55-#define V_APPEND 0x2 /* want to do append only check */5657/*58* Flags for vnode operations.59Index: sys/cddl/compat/opensolaris/sys/vnode.h60===================================================================61--- sys/cddl/compat/opensolaris/sys/vnode.h (revision 200583)62+++ sys/cddl/compat/opensolaris/sys/vnode.h (working copy)63@@ -57,6 +57,8 @@ typedef struct vop_vector vnodeops_t;6465#define v_count v_usecount6667+#define V_APPEND VAPPEND68+69static __inline int70vn_is_readonly(vnode_t *vp)71{727374