usr/src/uts/common/fs/zfs/zfs_acl.c
changeset 9981 b4907297e740
parent 9866 ddc5f1d8eb4e
child 10143 d2d432dfe597
equal deleted inserted replaced
9980:13d7f3eec672 9981:b4907297e740
   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) {
   992 		if (error == ECKSUM)
  1017 		if (error == ECKSUM)
   993 			error = EIO;
  1018 			error = EIO;
   994 		return (error);
  1019 		return (error);
   995 	}
  1020 	}
   996 
  1021 
   997 	*aclpp = aclp;
  1022 	zp->z_acl_cached = *aclpp = aclp;
   998 	return (0);
  1023 	return (0);
   999 }
  1024 }
  1000 
  1025 
  1001 /*
  1026 /*
  1002  * common code for setting ACLs.
  1027  * common code for setting ACLs.
  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);
  1996 			vsecp->vsa_aclflags |= ACL_AUTO_INHERIT;
  2026 			vsecp->vsa_aclflags |= ACL_AUTO_INHERIT;
  1997 	}
  2027 	}
  1998 
  2028 
  1999 	mutex_exit(&zp->z_acl_lock);
  2029 	mutex_exit(&zp->z_acl_lock);
  2000 
  2030 
  2001 	zfs_acl_free(aclp);
       
  2002 
       
  2003 	return (0);
  2031 	return (0);
  2004 }
  2032 }
  2005 
  2033 
  2006 int
  2034 int
  2007 zfs_vsec_2_aclp(zfsvfs_t *zfsvfs, vtype_t obj_type,
  2035 zfs_vsec_2_aclp(zfsvfs_t *zfsvfs, vtype_t obj_type,
  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 
  2299 				if (newid != IDMAP_WK_CREATOR_OWNER_UID &&
  2322 				if (newid != IDMAP_WK_CREATOR_OWNER_UID &&
  2300 				    uid == newid)
  2323 				    uid == newid)
  2301 					checkit = B_TRUE;
  2324 					checkit = B_TRUE;
  2302 				break;
  2325 				break;
  2303 			} else {
  2326 			} else {
  2304 				zfs_acl_free(aclp);
       
  2305 				mutex_exit(&zp->z_acl_lock);
  2327 				mutex_exit(&zp->z_acl_lock);
  2306 				return (EIO);
  2328 				return (EIO);
  2307 			}
  2329 			}
  2308 		}
  2330 		}
  2309 
  2331 
  2332 		if (*working_mode == 0)
  2354 		if (*working_mode == 0)
  2333 			break;
  2355 			break;
  2334 	}
  2356 	}
  2335 
  2357 
  2336 	mutex_exit(&zp->z_acl_lock);
  2358 	mutex_exit(&zp->z_acl_lock);
  2337 	zfs_acl_free(aclp);
       
  2338 
  2359 
  2339 	/* Put the found 'denies' back on the working mode */
  2360 	/* Put the found 'denies' back on the working mode */
  2340 	if (deny_mask) {
  2361 	if (deny_mask) {
  2341 		*working_mode |= deny_mask;
  2362 		*working_mode |= deny_mask;
  2342 		return (EACCES);
  2363 		return (EACCES);
  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.