779 mode_t seen = 0; |
779 mode_t seen = 0; |
780 zfs_ace_hdr_t *acep = NULL; |
780 zfs_ace_hdr_t *acep = NULL; |
781 uint64_t who; |
781 uint64_t who; |
782 uint16_t iflags, type; |
782 uint16_t iflags, type; |
783 uint32_t access_mask; |
783 uint32_t access_mask; |
|
784 boolean_t an_exec_denied = B_FALSE; |
784 |
785 |
785 mode = (zp->z_phys->zp_mode & (S_IFMT | S_ISUID | S_ISGID | S_ISVTX)); |
786 mode = (zp->z_phys->zp_mode & (S_IFMT | S_ISUID | S_ISGID | S_ISVTX)); |
786 |
787 |
787 while (acep = zfs_acl_next_ace(aclp, acep, &who, |
788 while (acep = zfs_acl_next_ace(aclp, acep, &who, |
788 &access_mask, &iflags, &type)) { |
789 &access_mask, &iflags, &type)) { |
903 if (type == ALLOW) { |
904 if (type == ALLOW) { |
904 mode |= S_IXOTH; |
905 mode |= S_IXOTH; |
905 } |
906 } |
906 } |
907 } |
907 } |
908 } |
908 } |
909 } else { |
909 } |
910 /* |
|
911 * Only care if this IDENTIFIER_GROUP or |
|
912 * USER ACE denies execute access to someone, |
|
913 * mode is not affected |
|
914 */ |
|
915 if ((access_mask & ACE_EXECUTE) && type == DENY) |
|
916 an_exec_denied = B_TRUE; |
|
917 } |
|
918 } |
|
919 |
|
920 if (!an_exec_denied && !(seen & (S_IXUSR | S_IXGRP | S_IXOTH)) || |
|
921 !(mode & (S_IXUSR | S_IXGRP | S_IXOTH))) |
|
922 an_exec_denied = B_TRUE; |
|
923 |
|
924 if (an_exec_denied) |
|
925 zp->z_phys->zp_flags &= ~ZFS_NO_EXECS_DENIED; |
|
926 else |
|
927 zp->z_phys->zp_flags |= ZFS_NO_EXECS_DENIED; |
|
928 |
910 return (mode); |
929 return (mode); |
911 } |
930 } |
912 |
931 |
913 static zfs_acl_t * |
932 static zfs_acl_t * |
914 zfs_acl_node_read_internal(znode_t *zp, boolean_t will_modify) |
933 zfs_acl_node_read_internal(znode_t *zp, boolean_t will_modify) |
958 zfs_acl_node_t *aclnode; |
977 zfs_acl_node_t *aclnode; |
959 int error; |
978 int error; |
960 |
979 |
961 ASSERT(MUTEX_HELD(&zp->z_acl_lock)); |
980 ASSERT(MUTEX_HELD(&zp->z_acl_lock)); |
962 |
981 |
|
982 if (zp->z_acl_cached) { |
|
983 *aclpp = zp->z_acl_cached; |
|
984 return (0); |
|
985 } |
|
986 |
963 if (zp->z_phys->zp_acl.z_acl_extern_obj == 0) { |
987 if (zp->z_phys->zp_acl.z_acl_extern_obj == 0) { |
964 *aclpp = zfs_acl_node_read_internal(zp, will_modify); |
988 *aclpp = zfs_acl_node_read_internal(zp, will_modify); |
|
989 zp->z_acl_cached = *aclpp; |
965 return (0); |
990 return (0); |
966 } |
991 } |
967 |
992 |
968 aclp = zfs_acl_alloc(zp->z_phys->zp_acl.z_acl_version); |
993 aclp = zfs_acl_alloc(zp->z_phys->zp_acl.z_acl_version); |
969 if (zp->z_phys->zp_acl.z_acl_version == ZFS_ACL_VERSION_INITIAL) { |
994 if (zp->z_phys->zp_acl.z_acl_version == ZFS_ACL_VERSION_INITIAL) { |
1016 uint64_t off = 0; |
1041 uint64_t off = 0; |
1017 dmu_object_type_t otype; |
1042 dmu_object_type_t otype; |
1018 zfs_acl_node_t *aclnode; |
1043 zfs_acl_node_t *aclnode; |
1019 |
1044 |
1020 dmu_buf_will_dirty(zp->z_dbuf, tx); |
1045 dmu_buf_will_dirty(zp->z_dbuf, tx); |
|
1046 |
|
1047 if (zp->z_acl_cached != aclp && zp->z_acl_cached) { |
|
1048 zfs_acl_free(zp->z_acl_cached); |
|
1049 zp->z_acl_cached = NULL; |
|
1050 } |
1021 |
1051 |
1022 zphys->zp_mode = zfs_mode_compute(zp, aclp); |
1052 zphys->zp_mode = zfs_mode_compute(zp, aclp); |
1023 |
1053 |
1024 /* |
1054 /* |
1025 * Decide which opbject type to use. If we are forced to |
1055 * Decide which opbject type to use. If we are forced to |
1604 *aclp = NULL; |
1634 *aclp = NULL; |
1605 error = zfs_acl_node_read(zp, aclp, B_TRUE); |
1635 error = zfs_acl_node_read(zp, aclp, B_TRUE); |
1606 if (error == 0) { |
1636 if (error == 0) { |
1607 (*aclp)->z_hints = zp->z_phys->zp_flags & V4_ACL_WIDE_FLAGS; |
1637 (*aclp)->z_hints = zp->z_phys->zp_flags & V4_ACL_WIDE_FLAGS; |
1608 zfs_acl_chmod(zp->z_zfsvfs, zp->z_phys->zp_uid, mode, *aclp); |
1638 zfs_acl_chmod(zp->z_zfsvfs, zp->z_phys->zp_uid, mode, *aclp); |
|
1639 zp->z_acl_cached = *aclp; |
1609 } |
1640 } |
1610 mutex_exit(&zp->z_acl_lock); |
1641 mutex_exit(&zp->z_acl_lock); |
1611 mutex_exit(&zp->z_lock); |
1642 mutex_exit(&zp->z_lock); |
1612 return (error); |
1643 return (error); |
1613 } |
1644 } |
1867 mutex_enter(&dzp->z_acl_lock); |
1898 mutex_enter(&dzp->z_acl_lock); |
1868 VERIFY(0 == zfs_acl_node_read(dzp, &paclp, B_FALSE)); |
1899 VERIFY(0 == zfs_acl_node_read(dzp, &paclp, B_FALSE)); |
1869 mutex_exit(&dzp->z_acl_lock); |
1900 mutex_exit(&dzp->z_acl_lock); |
1870 acl_ids->z_aclp = zfs_acl_inherit(zfsvfs, |
1901 acl_ids->z_aclp = zfs_acl_inherit(zfsvfs, |
1871 vap->va_type, paclp, acl_ids->z_mode, &need_chmod); |
1902 vap->va_type, paclp, acl_ids->z_mode, &need_chmod); |
1872 zfs_acl_free(paclp); |
|
1873 } else { |
1903 } else { |
1874 acl_ids->z_aclp = |
1904 acl_ids->z_aclp = |
1875 zfs_acl_alloc(zfs_acl_version_zp(dzp)); |
1905 zfs_acl_alloc(zfs_acl_version_zp(dzp)); |
1876 } |
1906 } |
1877 mutex_exit(&dzp->z_lock); |
1907 mutex_exit(&dzp->z_lock); |
2093 */ |
2121 */ |
2094 if (!(vsecp->vsa_mask & VSA_ACE_ACLFLAGS)) { |
2122 if (!(vsecp->vsa_mask & VSA_ACE_ACLFLAGS)) { |
2095 aclp->z_hints |= (zp->z_phys->zp_flags & V4_ACL_WIDE_FLAGS); |
2123 aclp->z_hints |= (zp->z_phys->zp_flags & V4_ACL_WIDE_FLAGS); |
2096 } |
2124 } |
2097 top: |
2125 top: |
2098 if (error = zfs_zaccess(zp, ACE_WRITE_ACL, 0, skipaclchk, cr)) { |
|
2099 zfs_acl_free(aclp); |
|
2100 return (error); |
|
2101 } |
|
2102 |
|
2103 mutex_enter(&zp->z_lock); |
2126 mutex_enter(&zp->z_lock); |
2104 mutex_enter(&zp->z_acl_lock); |
2127 mutex_enter(&zp->z_acl_lock); |
2105 |
2128 |
2106 tx = dmu_tx_create(zfsvfs->z_os); |
2129 tx = dmu_tx_create(zfsvfs->z_os); |
2107 dmu_tx_hold_bonus(tx, zp->z_id); |
2130 dmu_tx_hold_bonus(tx, zp->z_id); |
2152 zfs_time_stamper_locked(zp, STATE_CHANGED, tx); |
2175 zfs_time_stamper_locked(zp, STATE_CHANGED, tx); |
2153 zfs_log_acl(zilog, tx, zp, vsecp, fuidp); |
2176 zfs_log_acl(zilog, tx, zp, vsecp, fuidp); |
2154 |
2177 |
2155 if (fuidp) |
2178 if (fuidp) |
2156 zfs_fuid_info_free(fuidp); |
2179 zfs_fuid_info_free(fuidp); |
2157 zfs_acl_free(aclp); |
2180 zp->z_acl_cached = aclp; |
2158 dmu_tx_commit(tx); |
2181 dmu_tx_commit(tx); |
2159 done: |
2182 done: |
2160 mutex_exit(&zp->z_acl_lock); |
2183 mutex_exit(&zp->z_acl_lock); |
2161 mutex_exit(&zp->z_lock); |
2184 mutex_exit(&zp->z_lock); |
2162 |
2185 |
2416 if (*working_mode != ACE_WRITE_DATA) |
2437 if (*working_mode != ACE_WRITE_DATA) |
2417 return (EACCES); |
2438 return (EACCES); |
2418 |
2439 |
2419 return (zfs_zaccess_common(zp, ACE_APPEND_DATA, working_mode, |
2440 return (zfs_zaccess_common(zp, ACE_APPEND_DATA, working_mode, |
2420 check_privs, B_FALSE, cr)); |
2441 check_privs, B_FALSE, cr)); |
|
2442 } |
|
2443 |
|
2444 int |
|
2445 zfs_fastaccesschk_execute(znode_t *zdp, cred_t *cr) |
|
2446 { |
|
2447 boolean_t owner = B_FALSE; |
|
2448 boolean_t groupmbr = B_FALSE; |
|
2449 boolean_t is_attr; |
|
2450 uid_t fowner; |
|
2451 uid_t gowner; |
|
2452 uid_t uid = crgetuid(cr); |
|
2453 int error; |
|
2454 |
|
2455 if (zdp->z_phys->zp_flags & ZFS_AV_QUARANTINED) |
|
2456 return (EACCES); |
|
2457 |
|
2458 is_attr = ((zdp->z_phys->zp_flags & ZFS_XATTR) && |
|
2459 (ZTOV(zdp)->v_type == VDIR)); |
|
2460 if (is_attr) |
|
2461 goto slow; |
|
2462 |
|
2463 mutex_enter(&zdp->z_acl_lock); |
|
2464 |
|
2465 if (zdp->z_phys->zp_flags & ZFS_NO_EXECS_DENIED) { |
|
2466 mutex_exit(&zdp->z_acl_lock); |
|
2467 return (0); |
|
2468 } |
|
2469 |
|
2470 if (FUID_INDEX(zdp->z_phys->zp_uid) != 0 || |
|
2471 FUID_INDEX(zdp->z_phys->zp_gid) != 0) { |
|
2472 mutex_exit(&zdp->z_acl_lock); |
|
2473 goto slow; |
|
2474 } |
|
2475 |
|
2476 fowner = (uid_t)zdp->z_phys->zp_uid; |
|
2477 gowner = (uid_t)zdp->z_phys->zp_gid; |
|
2478 |
|
2479 if (uid == fowner) { |
|
2480 owner = B_TRUE; |
|
2481 if (zdp->z_phys->zp_mode & S_IXUSR) { |
|
2482 mutex_exit(&zdp->z_acl_lock); |
|
2483 return (0); |
|
2484 } |
|
2485 } |
|
2486 if (groupmember(gowner, cr)) { |
|
2487 groupmbr = B_TRUE; |
|
2488 if (zdp->z_phys->zp_mode & S_IXGRP) { |
|
2489 mutex_exit(&zdp->z_acl_lock); |
|
2490 return (0); |
|
2491 } |
|
2492 } |
|
2493 if (!owner && !groupmbr) { |
|
2494 if (zdp->z_phys->zp_mode & S_IXOTH) { |
|
2495 mutex_exit(&zdp->z_acl_lock); |
|
2496 return (0); |
|
2497 } |
|
2498 } |
|
2499 |
|
2500 mutex_exit(&zdp->z_acl_lock); |
|
2501 |
|
2502 slow: |
|
2503 DTRACE_PROBE(zfs__fastpath__execute__access__miss); |
|
2504 ZFS_ENTER(zdp->z_zfsvfs); |
|
2505 error = zfs_zaccess(zdp, ACE_EXECUTE, 0, B_FALSE, cr); |
|
2506 ZFS_EXIT(zdp->z_zfsvfs); |
|
2507 return (error); |
2421 } |
2508 } |
2422 |
2509 |
2423 /* |
2510 /* |
2424 * Determine whether Access should be granted/denied, invoking least |
2511 * Determine whether Access should be granted/denied, invoking least |
2425 * priv subsytem when a deny is determined. |
2512 * priv subsytem when a deny is determined. |