]> CyberLeo.Net >> Repos - FreeBSD/releng/9.0.git/blob - sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c
Copy stable/9 to releng/9.0 as part of the FreeBSD 9.0-RELEASE release
[FreeBSD/releng/9.0.git] / sys / cddl / contrib / opensolaris / uts / common / fs / zfs / zfs_acl.c
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
24  */
25
26 #include <sys/types.h>
27 #include <sys/param.h>
28 #include <sys/time.h>
29 #include <sys/systm.h>
30 #include <sys/sysmacros.h>
31 #include <sys/resource.h>
32 #include <sys/vfs.h>
33 #include <sys/vnode.h>
34 #include <sys/file.h>
35 #include <sys/stat.h>
36 #include <sys/kmem.h>
37 #include <sys/cmn_err.h>
38 #include <sys/errno.h>
39 #include <sys/unistd.h>
40 #include <sys/sdt.h>
41 #include <sys/fs/zfs.h>
42 #include <sys/policy.h>
43 #include <sys/zfs_znode.h>
44 #include <sys/zfs_fuid.h>
45 #include <sys/zfs_acl.h>
46 #include <sys/zfs_dir.h>
47 #include <sys/zfs_vfsops.h>
48 #include <sys/dmu.h>
49 #include <sys/dnode.h>
50 #include <sys/zap.h>
51 #include <sys/sa.h>
52 #include <acl/acl_common.h>
53
54 #define ALLOW   ACE_ACCESS_ALLOWED_ACE_TYPE
55 #define DENY    ACE_ACCESS_DENIED_ACE_TYPE
56 #define MAX_ACE_TYPE    ACE_SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE
57 #define MIN_ACE_TYPE    ALLOW
58
59 #define OWNING_GROUP            (ACE_GROUP|ACE_IDENTIFIER_GROUP)
60 #define EVERYONE_ALLOW_MASK (ACE_READ_ACL|ACE_READ_ATTRIBUTES | \
61     ACE_READ_NAMED_ATTRS|ACE_SYNCHRONIZE)
62 #define EVERYONE_DENY_MASK (ACE_WRITE_ACL|ACE_WRITE_OWNER | \
63     ACE_WRITE_ATTRIBUTES|ACE_WRITE_NAMED_ATTRS)
64 #define OWNER_ALLOW_MASK (ACE_WRITE_ACL | ACE_WRITE_OWNER | \
65     ACE_WRITE_ATTRIBUTES|ACE_WRITE_NAMED_ATTRS)
66
67 #define ZFS_CHECKED_MASKS (ACE_READ_ACL|ACE_READ_ATTRIBUTES|ACE_READ_DATA| \
68     ACE_READ_NAMED_ATTRS|ACE_WRITE_DATA|ACE_WRITE_ATTRIBUTES| \
69     ACE_WRITE_NAMED_ATTRS|ACE_APPEND_DATA|ACE_EXECUTE|ACE_WRITE_OWNER| \
70     ACE_WRITE_ACL|ACE_DELETE|ACE_DELETE_CHILD|ACE_SYNCHRONIZE)
71
72 #define WRITE_MASK_DATA (ACE_WRITE_DATA|ACE_APPEND_DATA|ACE_WRITE_NAMED_ATTRS)
73 #define WRITE_MASK_ATTRS (ACE_WRITE_ACL|ACE_WRITE_OWNER|ACE_WRITE_ATTRIBUTES| \
74     ACE_DELETE|ACE_DELETE_CHILD)
75 #define WRITE_MASK (WRITE_MASK_DATA|WRITE_MASK_ATTRS)
76
77 #define OGE_CLEAR       (ACE_READ_DATA|ACE_LIST_DIRECTORY|ACE_WRITE_DATA| \
78     ACE_ADD_FILE|ACE_APPEND_DATA|ACE_ADD_SUBDIRECTORY|ACE_EXECUTE)
79
80 #define OKAY_MASK_BITS (ACE_READ_DATA|ACE_LIST_DIRECTORY|ACE_WRITE_DATA| \
81     ACE_ADD_FILE|ACE_APPEND_DATA|ACE_ADD_SUBDIRECTORY|ACE_EXECUTE)
82
83 #define ALL_INHERIT     (ACE_FILE_INHERIT_ACE|ACE_DIRECTORY_INHERIT_ACE | \
84     ACE_NO_PROPAGATE_INHERIT_ACE|ACE_INHERIT_ONLY_ACE|ACE_INHERITED_ACE)
85
86 #define RESTRICTED_CLEAR        (ACE_WRITE_ACL|ACE_WRITE_OWNER)
87
88 #define V4_ACL_WIDE_FLAGS (ZFS_ACL_AUTO_INHERIT|ZFS_ACL_DEFAULTED|\
89     ZFS_ACL_PROTECTED)
90
91 #define ZFS_ACL_WIDE_FLAGS (V4_ACL_WIDE_FLAGS|ZFS_ACL_TRIVIAL|ZFS_INHERIT_ACE|\
92     ZFS_ACL_OBJ_ACE)
93
94 #define ALL_MODE_EXECS (S_IXUSR | S_IXGRP | S_IXOTH)
95
96 static uint16_t
97 zfs_ace_v0_get_type(void *acep)
98 {
99         return (((zfs_oldace_t *)acep)->z_type);
100 }
101
102 static uint16_t
103 zfs_ace_v0_get_flags(void *acep)
104 {
105         return (((zfs_oldace_t *)acep)->z_flags);
106 }
107
108 static uint32_t
109 zfs_ace_v0_get_mask(void *acep)
110 {
111         return (((zfs_oldace_t *)acep)->z_access_mask);
112 }
113
114 static uint64_t
115 zfs_ace_v0_get_who(void *acep)
116 {
117         return (((zfs_oldace_t *)acep)->z_fuid);
118 }
119
120 static void
121 zfs_ace_v0_set_type(void *acep, uint16_t type)
122 {
123         ((zfs_oldace_t *)acep)->z_type = type;
124 }
125
126 static void
127 zfs_ace_v0_set_flags(void *acep, uint16_t flags)
128 {
129         ((zfs_oldace_t *)acep)->z_flags = flags;
130 }
131
132 static void
133 zfs_ace_v0_set_mask(void *acep, uint32_t mask)
134 {
135         ((zfs_oldace_t *)acep)->z_access_mask = mask;
136 }
137
138 static void
139 zfs_ace_v0_set_who(void *acep, uint64_t who)
140 {
141         ((zfs_oldace_t *)acep)->z_fuid = who;
142 }
143
144 /*ARGSUSED*/
145 static size_t
146 zfs_ace_v0_size(void *acep)
147 {
148         return (sizeof (zfs_oldace_t));
149 }
150
151 static size_t
152 zfs_ace_v0_abstract_size(void)
153 {
154         return (sizeof (zfs_oldace_t));
155 }
156
157 static int
158 zfs_ace_v0_mask_off(void)
159 {
160         return (offsetof(zfs_oldace_t, z_access_mask));
161 }
162
163 /*ARGSUSED*/
164 static int
165 zfs_ace_v0_data(void *acep, void **datap)
166 {
167         *datap = NULL;
168         return (0);
169 }
170
171 static acl_ops_t zfs_acl_v0_ops = {
172         zfs_ace_v0_get_mask,
173         zfs_ace_v0_set_mask,
174         zfs_ace_v0_get_flags,
175         zfs_ace_v0_set_flags,
176         zfs_ace_v0_get_type,
177         zfs_ace_v0_set_type,
178         zfs_ace_v0_get_who,
179         zfs_ace_v0_set_who,
180         zfs_ace_v0_size,
181         zfs_ace_v0_abstract_size,
182         zfs_ace_v0_mask_off,
183         zfs_ace_v0_data
184 };
185
186 static uint16_t
187 zfs_ace_fuid_get_type(void *acep)
188 {
189         return (((zfs_ace_hdr_t *)acep)->z_type);
190 }
191
192 static uint16_t
193 zfs_ace_fuid_get_flags(void *acep)
194 {
195         return (((zfs_ace_hdr_t *)acep)->z_flags);
196 }
197
198 static uint32_t
199 zfs_ace_fuid_get_mask(void *acep)
200 {
201         return (((zfs_ace_hdr_t *)acep)->z_access_mask);
202 }
203
204 static uint64_t
205 zfs_ace_fuid_get_who(void *args)
206 {
207         uint16_t entry_type;
208         zfs_ace_t *acep = args;
209
210         entry_type = acep->z_hdr.z_flags & ACE_TYPE_FLAGS;
211
212         if (entry_type == ACE_OWNER || entry_type == OWNING_GROUP ||
213             entry_type == ACE_EVERYONE)
214                 return (-1);
215         return (((zfs_ace_t *)acep)->z_fuid);
216 }
217
218 static void
219 zfs_ace_fuid_set_type(void *acep, uint16_t type)
220 {
221         ((zfs_ace_hdr_t *)acep)->z_type = type;
222 }
223
224 static void
225 zfs_ace_fuid_set_flags(void *acep, uint16_t flags)
226 {
227         ((zfs_ace_hdr_t *)acep)->z_flags = flags;
228 }
229
230 static void
231 zfs_ace_fuid_set_mask(void *acep, uint32_t mask)
232 {
233         ((zfs_ace_hdr_t *)acep)->z_access_mask = mask;
234 }
235
236 static void
237 zfs_ace_fuid_set_who(void *arg, uint64_t who)
238 {
239         zfs_ace_t *acep = arg;
240
241         uint16_t entry_type = acep->z_hdr.z_flags & ACE_TYPE_FLAGS;
242
243         if (entry_type == ACE_OWNER || entry_type == OWNING_GROUP ||
244             entry_type == ACE_EVERYONE)
245                 return;
246         acep->z_fuid = who;
247 }
248
249 static size_t
250 zfs_ace_fuid_size(void *acep)
251 {
252         zfs_ace_hdr_t *zacep = acep;
253         uint16_t entry_type;
254
255         switch (zacep->z_type) {
256         case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE:
257         case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE:
258         case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE:
259         case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE:
260                 return (sizeof (zfs_object_ace_t));
261         case ALLOW:
262         case DENY:
263                 entry_type =
264                     (((zfs_ace_hdr_t *)acep)->z_flags & ACE_TYPE_FLAGS);
265                 if (entry_type == ACE_OWNER ||
266                     entry_type == OWNING_GROUP ||
267                     entry_type == ACE_EVERYONE)
268                         return (sizeof (zfs_ace_hdr_t));
269                 /*FALLTHROUGH*/
270         default:
271                 return (sizeof (zfs_ace_t));
272         }
273 }
274
275 static size_t
276 zfs_ace_fuid_abstract_size(void)
277 {
278         return (sizeof (zfs_ace_hdr_t));
279 }
280
281 static int
282 zfs_ace_fuid_mask_off(void)
283 {
284         return (offsetof(zfs_ace_hdr_t, z_access_mask));
285 }
286
287 static int
288 zfs_ace_fuid_data(void *acep, void **datap)
289 {
290         zfs_ace_t *zacep = acep;
291         zfs_object_ace_t *zobjp;
292
293         switch (zacep->z_hdr.z_type) {
294         case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE:
295         case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE:
296         case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE:
297         case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE:
298                 zobjp = acep;
299                 *datap = (caddr_t)zobjp + sizeof (zfs_ace_t);
300                 return (sizeof (zfs_object_ace_t) - sizeof (zfs_ace_t));
301         default:
302                 *datap = NULL;
303                 return (0);
304         }
305 }
306
307 static acl_ops_t zfs_acl_fuid_ops = {
308         zfs_ace_fuid_get_mask,
309         zfs_ace_fuid_set_mask,
310         zfs_ace_fuid_get_flags,
311         zfs_ace_fuid_set_flags,
312         zfs_ace_fuid_get_type,
313         zfs_ace_fuid_set_type,
314         zfs_ace_fuid_get_who,
315         zfs_ace_fuid_set_who,
316         zfs_ace_fuid_size,
317         zfs_ace_fuid_abstract_size,
318         zfs_ace_fuid_mask_off,
319         zfs_ace_fuid_data
320 };
321
322 /*
323  * The following three functions are provided for compatibility with
324  * older ZPL version in order to determine if the file use to have
325  * an external ACL and what version of ACL previously existed on the
326  * file.  Would really be nice to not need this, sigh.
327  */
328 uint64_t
329 zfs_external_acl(znode_t *zp)
330 {
331         zfs_acl_phys_t acl_phys;
332         int error;
333
334         if (zp->z_is_sa)
335                 return (0);
336
337         /*
338          * Need to deal with a potential
339          * race where zfs_sa_upgrade could cause
340          * z_isa_sa to change.
341          *
342          * If the lookup fails then the state of z_is_sa should have
343          * changed.
344          */
345
346         if ((error = sa_lookup(zp->z_sa_hdl, SA_ZPL_ZNODE_ACL(zp->z_zfsvfs),
347             &acl_phys, sizeof (acl_phys))) == 0)
348                 return (acl_phys.z_acl_extern_obj);
349         else {
350                 /*
351                  * after upgrade the SA_ZPL_ZNODE_ACL should have been
352                  * removed
353                  */
354                 VERIFY(zp->z_is_sa && error == ENOENT);
355                 return (0);
356         }
357 }
358
359 /*
360  * Determine size of ACL in bytes
361  *
362  * This is more complicated than it should be since we have to deal
363  * with old external ACLs.
364  */
365 static int
366 zfs_acl_znode_info(znode_t *zp, int *aclsize, int *aclcount,
367     zfs_acl_phys_t *aclphys)
368 {
369         zfsvfs_t *zfsvfs = zp->z_zfsvfs;
370         uint64_t acl_count;
371         int size;
372         int error;
373
374         ASSERT(MUTEX_HELD(&zp->z_acl_lock));
375         if (zp->z_is_sa) {
376                 if ((error = sa_size(zp->z_sa_hdl, SA_ZPL_DACL_ACES(zfsvfs),
377                     &size)) != 0)
378                         return (error);
379                 *aclsize = size;
380                 if ((error = sa_lookup(zp->z_sa_hdl, SA_ZPL_DACL_COUNT(zfsvfs),
381                     &acl_count, sizeof (acl_count))) != 0)
382                         return (error);
383                 *aclcount = acl_count;
384         } else {
385                 if ((error = sa_lookup(zp->z_sa_hdl, SA_ZPL_ZNODE_ACL(zfsvfs),
386                     aclphys, sizeof (*aclphys))) != 0)
387                         return (error);
388
389                 if (aclphys->z_acl_version == ZFS_ACL_VERSION_INITIAL) {
390                         *aclsize = ZFS_ACL_SIZE(aclphys->z_acl_size);
391                         *aclcount = aclphys->z_acl_size;
392                 } else {
393                         *aclsize = aclphys->z_acl_size;
394                         *aclcount = aclphys->z_acl_count;
395                 }
396         }
397         return (0);
398 }
399
400 int
401 zfs_znode_acl_version(znode_t *zp)
402 {
403         zfs_acl_phys_t acl_phys;
404
405         if (zp->z_is_sa)
406                 return (ZFS_ACL_VERSION_FUID);
407         else {
408                 int error;
409
410                 /*
411                  * Need to deal with a potential
412                  * race where zfs_sa_upgrade could cause
413                  * z_isa_sa to change.
414                  *
415                  * If the lookup fails then the state of z_is_sa should have
416                  * changed.
417                  */
418                 if ((error = sa_lookup(zp->z_sa_hdl,
419                     SA_ZPL_ZNODE_ACL(zp->z_zfsvfs),
420                     &acl_phys, sizeof (acl_phys))) == 0)
421                         return (acl_phys.z_acl_version);
422                 else {
423                         /*
424                          * After upgrade SA_ZPL_ZNODE_ACL should have
425                          * been removed.
426                          */
427                         VERIFY(zp->z_is_sa && error == ENOENT);
428                         return (ZFS_ACL_VERSION_FUID);
429                 }
430         }
431 }
432
433 static int
434 zfs_acl_version(int version)
435 {
436         if (version < ZPL_VERSION_FUID)
437                 return (ZFS_ACL_VERSION_INITIAL);
438         else
439                 return (ZFS_ACL_VERSION_FUID);
440 }
441
442 static int
443 zfs_acl_version_zp(znode_t *zp)
444 {
445         return (zfs_acl_version(zp->z_zfsvfs->z_version));
446 }
447
448 zfs_acl_t *
449 zfs_acl_alloc(int vers)
450 {
451         zfs_acl_t *aclp;
452
453         aclp = kmem_zalloc(sizeof (zfs_acl_t), KM_SLEEP);
454         list_create(&aclp->z_acl, sizeof (zfs_acl_node_t),
455             offsetof(zfs_acl_node_t, z_next));
456         aclp->z_version = vers;
457         if (vers == ZFS_ACL_VERSION_FUID)
458                 aclp->z_ops = zfs_acl_fuid_ops;
459         else
460                 aclp->z_ops = zfs_acl_v0_ops;
461         return (aclp);
462 }
463
464 zfs_acl_node_t *
465 zfs_acl_node_alloc(size_t bytes)
466 {
467         zfs_acl_node_t *aclnode;
468
469         aclnode = kmem_zalloc(sizeof (zfs_acl_node_t), KM_SLEEP);
470         if (bytes) {
471                 aclnode->z_acldata = kmem_alloc(bytes, KM_SLEEP);
472                 aclnode->z_allocdata = aclnode->z_acldata;
473                 aclnode->z_allocsize = bytes;
474                 aclnode->z_size = bytes;
475         }
476
477         return (aclnode);
478 }
479
480 static void
481 zfs_acl_node_free(zfs_acl_node_t *aclnode)
482 {
483         if (aclnode->z_allocsize)
484                 kmem_free(aclnode->z_allocdata, aclnode->z_allocsize);
485         kmem_free(aclnode, sizeof (zfs_acl_node_t));
486 }
487
488 static void
489 zfs_acl_release_nodes(zfs_acl_t *aclp)
490 {
491         zfs_acl_node_t *aclnode;
492
493         while (aclnode = list_head(&aclp->z_acl)) {
494                 list_remove(&aclp->z_acl, aclnode);
495                 zfs_acl_node_free(aclnode);
496         }
497         aclp->z_acl_count = 0;
498         aclp->z_acl_bytes = 0;
499 }
500
501 void
502 zfs_acl_free(zfs_acl_t *aclp)
503 {
504         zfs_acl_release_nodes(aclp);
505         list_destroy(&aclp->z_acl);
506         kmem_free(aclp, sizeof (zfs_acl_t));
507 }
508
509 static boolean_t
510 zfs_acl_valid_ace_type(uint_t type, uint_t flags)
511 {
512         uint16_t entry_type;
513
514         switch (type) {
515         case ALLOW:
516         case DENY:
517         case ACE_SYSTEM_AUDIT_ACE_TYPE:
518         case ACE_SYSTEM_ALARM_ACE_TYPE:
519                 entry_type = flags & ACE_TYPE_FLAGS;
520                 return (entry_type == ACE_OWNER ||
521                     entry_type == OWNING_GROUP ||
522                     entry_type == ACE_EVERYONE || entry_type == 0 ||
523                     entry_type == ACE_IDENTIFIER_GROUP);
524         default:
525                 if (type >= MIN_ACE_TYPE && type <= MAX_ACE_TYPE)
526                         return (B_TRUE);
527         }
528         return (B_FALSE);
529 }
530
531 static boolean_t
532 zfs_ace_valid(vtype_t obj_type, zfs_acl_t *aclp, uint16_t type, uint16_t iflags)
533 {
534         /*
535          * first check type of entry
536          */
537
538         if (!zfs_acl_valid_ace_type(type, iflags))
539                 return (B_FALSE);
540
541         switch (type) {
542         case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE:
543         case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE:
544         case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE:
545         case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE:
546                 if (aclp->z_version < ZFS_ACL_VERSION_FUID)
547                         return (B_FALSE);
548                 aclp->z_hints |= ZFS_ACL_OBJ_ACE;
549         }
550
551         /*
552          * next check inheritance level flags
553          */
554
555         if (obj_type == VDIR &&
556             (iflags & (ACE_FILE_INHERIT_ACE|ACE_DIRECTORY_INHERIT_ACE)))
557                 aclp->z_hints |= ZFS_INHERIT_ACE;
558
559         if (iflags & (ACE_INHERIT_ONLY_ACE|ACE_NO_PROPAGATE_INHERIT_ACE)) {
560                 if ((iflags & (ACE_FILE_INHERIT_ACE|
561                     ACE_DIRECTORY_INHERIT_ACE)) == 0) {
562                         return (B_FALSE);
563                 }
564         }
565
566         return (B_TRUE);
567 }
568
569 static void *
570 zfs_acl_next_ace(zfs_acl_t *aclp, void *start, uint64_t *who,
571     uint32_t *access_mask, uint16_t *iflags, uint16_t *type)
572 {
573         zfs_acl_node_t *aclnode;
574
575         ASSERT(aclp);
576
577         if (start == NULL) {
578                 aclnode = list_head(&aclp->z_acl);
579                 if (aclnode == NULL)
580                         return (NULL);
581
582                 aclp->z_next_ace = aclnode->z_acldata;
583                 aclp->z_curr_node = aclnode;
584                 aclnode->z_ace_idx = 0;
585         }
586
587         aclnode = aclp->z_curr_node;
588
589         if (aclnode == NULL)
590                 return (NULL);
591
592         if (aclnode->z_ace_idx >= aclnode->z_ace_count) {
593                 aclnode = list_next(&aclp->z_acl, aclnode);
594                 if (aclnode == NULL)
595                         return (NULL);
596                 else {
597                         aclp->z_curr_node = aclnode;
598                         aclnode->z_ace_idx = 0;
599                         aclp->z_next_ace = aclnode->z_acldata;
600                 }
601         }
602
603         if (aclnode->z_ace_idx < aclnode->z_ace_count) {
604                 void *acep = aclp->z_next_ace;
605                 size_t ace_size;
606
607                 /*
608                  * Make sure we don't overstep our bounds
609                  */
610                 ace_size = aclp->z_ops.ace_size(acep);
611
612                 if (((caddr_t)acep + ace_size) >
613                     ((caddr_t)aclnode->z_acldata + aclnode->z_size)) {
614                         return (NULL);
615                 }
616
617                 *iflags = aclp->z_ops.ace_flags_get(acep);
618                 *type = aclp->z_ops.ace_type_get(acep);
619                 *access_mask = aclp->z_ops.ace_mask_get(acep);
620                 *who = aclp->z_ops.ace_who_get(acep);
621                 aclp->z_next_ace = (caddr_t)aclp->z_next_ace + ace_size;
622                 aclnode->z_ace_idx++;
623
624                 return ((void *)acep);
625         }
626         return (NULL);
627 }
628
629 /*ARGSUSED*/
630 static uint64_t
631 zfs_ace_walk(void *datap, uint64_t cookie, int aclcnt,
632     uint16_t *flags, uint16_t *type, uint32_t *mask)
633 {
634         zfs_acl_t *aclp = datap;
635         zfs_ace_hdr_t *acep = (zfs_ace_hdr_t *)(uintptr_t)cookie;
636         uint64_t who;
637
638         acep = zfs_acl_next_ace(aclp, acep, &who, mask,
639             flags, type);
640         return ((uint64_t)(uintptr_t)acep);
641 }
642
643 static zfs_acl_node_t *
644 zfs_acl_curr_node(zfs_acl_t *aclp)
645 {
646         ASSERT(aclp->z_curr_node);
647         return (aclp->z_curr_node);
648 }
649
650 /*
651  * Copy ACE to internal ZFS format.
652  * While processing the ACL each ACE will be validated for correctness.
653  * ACE FUIDs will be created later.
654  */
655 int
656 zfs_copy_ace_2_fuid(zfsvfs_t *zfsvfs, vtype_t obj_type, zfs_acl_t *aclp,
657     void *datap, zfs_ace_t *z_acl, uint64_t aclcnt, size_t *size,
658     zfs_fuid_info_t **fuidp, cred_t *cr)
659 {
660         int i;
661         uint16_t entry_type;
662         zfs_ace_t *aceptr = z_acl;
663         ace_t *acep = datap;
664         zfs_object_ace_t *zobjacep;
665         ace_object_t *aceobjp;
666
667         for (i = 0; i != aclcnt; i++) {
668                 aceptr->z_hdr.z_access_mask = acep->a_access_mask;
669                 aceptr->z_hdr.z_flags = acep->a_flags;
670                 aceptr->z_hdr.z_type = acep->a_type;
671                 entry_type = aceptr->z_hdr.z_flags & ACE_TYPE_FLAGS;
672                 if (entry_type != ACE_OWNER && entry_type != OWNING_GROUP &&
673                     entry_type != ACE_EVERYONE) {
674                         aceptr->z_fuid = zfs_fuid_create(zfsvfs, acep->a_who,
675                             cr, (entry_type == 0) ?
676                             ZFS_ACE_USER : ZFS_ACE_GROUP, fuidp);
677                 }
678
679                 /*
680                  * Make sure ACE is valid
681                  */
682                 if (zfs_ace_valid(obj_type, aclp, aceptr->z_hdr.z_type,
683                     aceptr->z_hdr.z_flags) != B_TRUE)
684                         return (EINVAL);
685
686                 switch (acep->a_type) {
687                 case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE:
688                 case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE:
689                 case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE:
690                 case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE:
691                         zobjacep = (zfs_object_ace_t *)aceptr;
692                         aceobjp = (ace_object_t *)acep;
693
694                         bcopy(aceobjp->a_obj_type, zobjacep->z_object_type,
695                             sizeof (aceobjp->a_obj_type));
696                         bcopy(aceobjp->a_inherit_obj_type,
697                             zobjacep->z_inherit_type,
698                             sizeof (aceobjp->a_inherit_obj_type));
699                         acep = (ace_t *)((caddr_t)acep + sizeof (ace_object_t));
700                         break;
701                 default:
702                         acep = (ace_t *)((caddr_t)acep + sizeof (ace_t));
703                 }
704
705                 aceptr = (zfs_ace_t *)((caddr_t)aceptr +
706                     aclp->z_ops.ace_size(aceptr));
707         }
708
709         *size = (caddr_t)aceptr - (caddr_t)z_acl;
710
711         return (0);
712 }
713
714 /*
715  * Copy ZFS ACEs to fixed size ace_t layout
716  */
717 static void
718 zfs_copy_fuid_2_ace(zfsvfs_t *zfsvfs, zfs_acl_t *aclp, cred_t *cr,
719     void *datap, int filter)
720 {
721         uint64_t who;
722         uint32_t access_mask;
723         uint16_t iflags, type;
724         zfs_ace_hdr_t *zacep = NULL;
725         ace_t *acep = datap;
726         ace_object_t *objacep;
727         zfs_object_ace_t *zobjacep;
728         size_t ace_size;
729         uint16_t entry_type;
730
731         while (zacep = zfs_acl_next_ace(aclp, zacep,
732             &who, &access_mask, &iflags, &type)) {
733
734                 switch (type) {
735                 case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE:
736                 case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE:
737                 case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE:
738                 case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE:
739                         if (filter) {
740                                 continue;
741                         }
742                         zobjacep = (zfs_object_ace_t *)zacep;
743                         objacep = (ace_object_t *)acep;
744                         bcopy(zobjacep->z_object_type,
745                             objacep->a_obj_type,
746                             sizeof (zobjacep->z_object_type));
747                         bcopy(zobjacep->z_inherit_type,
748                             objacep->a_inherit_obj_type,
749                             sizeof (zobjacep->z_inherit_type));
750                         ace_size = sizeof (ace_object_t);
751                         break;
752                 default:
753                         ace_size = sizeof (ace_t);
754                         break;
755                 }
756
757                 entry_type = (iflags & ACE_TYPE_FLAGS);
758                 if ((entry_type != ACE_OWNER &&
759                     entry_type != OWNING_GROUP &&
760                     entry_type != ACE_EVERYONE)) {
761                         acep->a_who = zfs_fuid_map_id(zfsvfs, who,
762                             cr, (entry_type & ACE_IDENTIFIER_GROUP) ?
763                             ZFS_ACE_GROUP : ZFS_ACE_USER);
764                 } else {
765                         acep->a_who = (uid_t)(int64_t)who;
766                 }
767                 acep->a_access_mask = access_mask;
768                 acep->a_flags = iflags;
769                 acep->a_type = type;
770                 acep = (ace_t *)((caddr_t)acep + ace_size);
771         }
772 }
773
774 static int
775 zfs_copy_ace_2_oldace(vtype_t obj_type, zfs_acl_t *aclp, ace_t *acep,
776     zfs_oldace_t *z_acl, int aclcnt, size_t *size)
777 {
778         int i;
779         zfs_oldace_t *aceptr = z_acl;
780
781         for (i = 0; i != aclcnt; i++, aceptr++) {
782                 aceptr->z_access_mask = acep[i].a_access_mask;
783                 aceptr->z_type = acep[i].a_type;
784                 aceptr->z_flags = acep[i].a_flags;
785                 aceptr->z_fuid = acep[i].a_who;
786                 /*
787                  * Make sure ACE is valid
788                  */
789                 if (zfs_ace_valid(obj_type, aclp, aceptr->z_type,
790                     aceptr->z_flags) != B_TRUE)
791                         return (EINVAL);
792         }
793         *size = (caddr_t)aceptr - (caddr_t)z_acl;
794         return (0);
795 }
796
797 /*
798  * convert old ACL format to new
799  */
800 void
801 zfs_acl_xform(znode_t *zp, zfs_acl_t *aclp, cred_t *cr)
802 {
803         zfs_oldace_t *oldaclp;
804         int i;
805         uint16_t type, iflags;
806         uint32_t access_mask;
807         uint64_t who;
808         void *cookie = NULL;
809         zfs_acl_node_t *newaclnode;
810
811         ASSERT(aclp->z_version == ZFS_ACL_VERSION_INITIAL);
812         /*
813          * First create the ACE in a contiguous piece of memory
814          * for zfs_copy_ace_2_fuid().
815          *
816          * We only convert an ACL once, so this won't happen
817          * everytime.
818          */
819         oldaclp = kmem_alloc(sizeof (zfs_oldace_t) * aclp->z_acl_count,
820             KM_SLEEP);
821         i = 0;
822         while (cookie = zfs_acl_next_ace(aclp, cookie, &who,
823             &access_mask, &iflags, &type)) {
824                 oldaclp[i].z_flags = iflags;
825                 oldaclp[i].z_type = type;
826                 oldaclp[i].z_fuid = who;
827                 oldaclp[i++].z_access_mask = access_mask;
828         }
829
830         newaclnode = zfs_acl_node_alloc(aclp->z_acl_count *
831             sizeof (zfs_object_ace_t));
832         aclp->z_ops = zfs_acl_fuid_ops;
833         VERIFY(zfs_copy_ace_2_fuid(zp->z_zfsvfs, ZTOV(zp)->v_type, aclp,
834             oldaclp, newaclnode->z_acldata, aclp->z_acl_count,
835             &newaclnode->z_size, NULL, cr) == 0);
836         newaclnode->z_ace_count = aclp->z_acl_count;
837         aclp->z_version = ZFS_ACL_VERSION;
838         kmem_free(oldaclp, aclp->z_acl_count * sizeof (zfs_oldace_t));
839
840         /*
841          * Release all previous ACL nodes
842          */
843
844         zfs_acl_release_nodes(aclp);
845
846         list_insert_head(&aclp->z_acl, newaclnode);
847
848         aclp->z_acl_bytes = newaclnode->z_size;
849         aclp->z_acl_count = newaclnode->z_ace_count;
850
851 }
852
853 /*
854  * Convert unix access mask to v4 access mask
855  */
856 static uint32_t
857 zfs_unix_to_v4(uint32_t access_mask)
858 {
859         uint32_t new_mask = 0;
860
861         if (access_mask & S_IXOTH)
862                 new_mask |= ACE_EXECUTE;
863         if (access_mask & S_IWOTH)
864                 new_mask |= ACE_WRITE_DATA;
865         if (access_mask & S_IROTH)
866                 new_mask |= ACE_READ_DATA;
867         return (new_mask);
868 }
869
870 static void
871 zfs_set_ace(zfs_acl_t *aclp, void *acep, uint32_t access_mask,
872     uint16_t access_type, uint64_t fuid, uint16_t entry_type)
873 {
874         uint16_t type = entry_type & ACE_TYPE_FLAGS;
875
876         aclp->z_ops.ace_mask_set(acep, access_mask);
877         aclp->z_ops.ace_type_set(acep, access_type);
878         aclp->z_ops.ace_flags_set(acep, entry_type);
879         if ((type != ACE_OWNER && type != OWNING_GROUP &&
880             type != ACE_EVERYONE))
881                 aclp->z_ops.ace_who_set(acep, fuid);
882 }
883
884 /*
885  * Determine mode of file based on ACL.
886  * Also, create FUIDs for any User/Group ACEs
887  */
888 uint64_t
889 zfs_mode_compute(uint64_t fmode, zfs_acl_t *aclp,
890     uint64_t *pflags, uint64_t fuid, uint64_t fgid)
891 {
892         int             entry_type;
893         mode_t          mode;
894         mode_t          seen = 0;
895         zfs_ace_hdr_t   *acep = NULL;
896         uint64_t        who;
897         uint16_t        iflags, type;
898         uint32_t        access_mask;
899         boolean_t       an_exec_denied = B_FALSE;
900
901         mode = (fmode & (S_IFMT | S_ISUID | S_ISGID | S_ISVTX));
902
903         while (acep = zfs_acl_next_ace(aclp, acep, &who,
904             &access_mask, &iflags, &type)) {
905
906                 if (!zfs_acl_valid_ace_type(type, iflags))
907                         continue;
908
909                 entry_type = (iflags & ACE_TYPE_FLAGS);
910
911                 /*
912                  * Skip over owner@, group@ or everyone@ inherit only ACEs
913                  */
914                 if ((iflags & ACE_INHERIT_ONLY_ACE) &&
915                     (entry_type == ACE_OWNER || entry_type == ACE_EVERYONE ||
916                     entry_type == OWNING_GROUP))
917                         continue;
918
919                 if (entry_type == ACE_OWNER || (entry_type == 0 &&
920                     who == fuid)) {
921                         if ((access_mask & ACE_READ_DATA) &&
922                             (!(seen & S_IRUSR))) {
923                                 seen |= S_IRUSR;
924                                 if (type == ALLOW) {
925                                         mode |= S_IRUSR;
926                                 }
927                         }
928                         if ((access_mask & ACE_WRITE_DATA) &&
929                             (!(seen & S_IWUSR))) {
930                                 seen |= S_IWUSR;
931                                 if (type == ALLOW) {
932                                         mode |= S_IWUSR;
933                                 }
934                         }
935                         if ((access_mask & ACE_EXECUTE) &&
936                             (!(seen & S_IXUSR))) {
937                                 seen |= S_IXUSR;
938                                 if (type == ALLOW) {
939                                         mode |= S_IXUSR;
940                                 }
941                         }
942                 } else if (entry_type == OWNING_GROUP ||
943                     (entry_type == ACE_IDENTIFIER_GROUP && who == fgid)) {
944                         if ((access_mask & ACE_READ_DATA) &&
945                             (!(seen & S_IRGRP))) {
946                                 seen |= S_IRGRP;
947                                 if (type == ALLOW) {
948                                         mode |= S_IRGRP;
949                                 }
950                         }
951                         if ((access_mask & ACE_WRITE_DATA) &&
952                             (!(seen & S_IWGRP))) {
953                                 seen |= S_IWGRP;
954                                 if (type == ALLOW) {
955                                         mode |= S_IWGRP;
956                                 }
957                         }
958                         if ((access_mask & ACE_EXECUTE) &&
959                             (!(seen & S_IXGRP))) {
960                                 seen |= S_IXGRP;
961                                 if (type == ALLOW) {
962                                         mode |= S_IXGRP;
963                                 }
964                         }
965                 } else if (entry_type == ACE_EVERYONE) {
966                         if ((access_mask & ACE_READ_DATA)) {
967                                 if (!(seen & S_IRUSR)) {
968                                         seen |= S_IRUSR;
969                                         if (type == ALLOW) {
970                                                 mode |= S_IRUSR;
971                                         }
972                                 }
973                                 if (!(seen & S_IRGRP)) {
974                                         seen |= S_IRGRP;
975                                         if (type == ALLOW) {
976                                                 mode |= S_IRGRP;
977                                         }
978                                 }
979                                 if (!(seen & S_IROTH)) {
980                                         seen |= S_IROTH;
981                                         if (type == ALLOW) {
982                                                 mode |= S_IROTH;
983                                         }
984                                 }
985                         }
986                         if ((access_mask & ACE_WRITE_DATA)) {
987                                 if (!(seen & S_IWUSR)) {
988                                         seen |= S_IWUSR;
989                                         if (type == ALLOW) {
990                                                 mode |= S_IWUSR;
991                                         }
992                                 }
993                                 if (!(seen & S_IWGRP)) {
994                                         seen |= S_IWGRP;
995                                         if (type == ALLOW) {
996                                                 mode |= S_IWGRP;
997                                         }
998                                 }
999                                 if (!(seen & S_IWOTH)) {
1000                                         seen |= S_IWOTH;
1001                                         if (type == ALLOW) {
1002                                                 mode |= S_IWOTH;
1003                                         }
1004                                 }
1005                         }
1006                         if ((access_mask & ACE_EXECUTE)) {
1007                                 if (!(seen & S_IXUSR)) {
1008                                         seen |= S_IXUSR;
1009                                         if (type == ALLOW) {
1010                                                 mode |= S_IXUSR;
1011                                         }
1012                                 }
1013                                 if (!(seen & S_IXGRP)) {
1014                                         seen |= S_IXGRP;
1015                                         if (type == ALLOW) {
1016                                                 mode |= S_IXGRP;
1017                                         }
1018                                 }
1019                                 if (!(seen & S_IXOTH)) {
1020                                         seen |= S_IXOTH;
1021                                         if (type == ALLOW) {
1022                                                 mode |= S_IXOTH;
1023                                         }
1024                                 }
1025                         }
1026                 } else {
1027                         /*
1028                          * Only care if this IDENTIFIER_GROUP or
1029                          * USER ACE denies execute access to someone,
1030                          * mode is not affected
1031                          */
1032                         if ((access_mask & ACE_EXECUTE) && type == DENY)
1033                                 an_exec_denied = B_TRUE;
1034                 }
1035         }
1036
1037         /*
1038          * Failure to allow is effectively a deny, so execute permission
1039          * is denied if it was never mentioned or if we explicitly
1040          * weren't allowed it.
1041          */
1042         if (!an_exec_denied &&
1043             ((seen & ALL_MODE_EXECS) != ALL_MODE_EXECS ||
1044             (mode & ALL_MODE_EXECS) != ALL_MODE_EXECS))
1045                 an_exec_denied = B_TRUE;
1046
1047         if (an_exec_denied)
1048                 *pflags &= ~ZFS_NO_EXECS_DENIED;
1049         else
1050                 *pflags |= ZFS_NO_EXECS_DENIED;
1051
1052         return (mode);
1053 }
1054
1055 /*
1056  * Read an external acl object.  If the intent is to modify, always
1057  * create a new acl and leave any cached acl in place.
1058  */
1059 static int
1060 zfs_acl_node_read(znode_t *zp, boolean_t have_lock, zfs_acl_t **aclpp,
1061     boolean_t will_modify)
1062 {
1063         zfs_acl_t       *aclp;
1064         int             aclsize;
1065         int             acl_count;
1066         zfs_acl_node_t  *aclnode;
1067         zfs_acl_phys_t  znode_acl;
1068         int             version;
1069         int             error;
1070         boolean_t       drop_lock = B_FALSE;
1071
1072         ASSERT(MUTEX_HELD(&zp->z_acl_lock));
1073
1074         if (zp->z_acl_cached && !will_modify) {
1075                 *aclpp = zp->z_acl_cached;
1076                 return (0);
1077         }
1078
1079         /*
1080          * close race where znode could be upgrade while trying to
1081          * read the znode attributes.
1082          *
1083          * But this could only happen if the file isn't already an SA
1084          * znode
1085          */
1086         if (!zp->z_is_sa && !have_lock) {
1087                 mutex_enter(&zp->z_lock);
1088                 drop_lock = B_TRUE;
1089         }
1090         version = zfs_znode_acl_version(zp);
1091
1092         if ((error = zfs_acl_znode_info(zp, &aclsize,
1093             &acl_count, &znode_acl)) != 0) {
1094                 goto done;
1095         }
1096
1097         aclp = zfs_acl_alloc(version);
1098
1099         aclp->z_acl_count = acl_count;
1100         aclp->z_acl_bytes = aclsize;
1101
1102         aclnode = zfs_acl_node_alloc(aclsize);
1103         aclnode->z_ace_count = aclp->z_acl_count;
1104         aclnode->z_size = aclsize;
1105
1106         if (!zp->z_is_sa) {
1107                 if (znode_acl.z_acl_extern_obj) {
1108                         error = dmu_read(zp->z_zfsvfs->z_os,
1109                             znode_acl.z_acl_extern_obj, 0, aclnode->z_size,
1110                             aclnode->z_acldata, DMU_READ_PREFETCH);
1111                 } else {
1112                         bcopy(znode_acl.z_ace_data, aclnode->z_acldata,
1113                             aclnode->z_size);
1114                 }
1115         } else {
1116                 error = sa_lookup(zp->z_sa_hdl, SA_ZPL_DACL_ACES(zp->z_zfsvfs),
1117                     aclnode->z_acldata, aclnode->z_size);
1118         }
1119
1120         if (error != 0) {
1121                 zfs_acl_free(aclp);
1122                 zfs_acl_node_free(aclnode);
1123                 /* convert checksum errors into IO errors */
1124                 if (error == ECKSUM)
1125                         error = EIO;
1126                 goto done;
1127         }
1128
1129         list_insert_head(&aclp->z_acl, aclnode);
1130
1131         *aclpp = aclp;
1132         if (!will_modify)
1133                 zp->z_acl_cached = aclp;
1134 done:
1135         if (drop_lock)
1136                 mutex_exit(&zp->z_lock);
1137         return (error);
1138 }
1139
1140 /*ARGSUSED*/
1141 void
1142 zfs_acl_data_locator(void **dataptr, uint32_t *length, uint32_t buflen,
1143     boolean_t start, void *userdata)
1144 {
1145         zfs_acl_locator_cb_t *cb = (zfs_acl_locator_cb_t *)userdata;
1146
1147         if (start) {
1148                 cb->cb_acl_node = list_head(&cb->cb_aclp->z_acl);
1149         } else {
1150                 cb->cb_acl_node = list_next(&cb->cb_aclp->z_acl,
1151                     cb->cb_acl_node);
1152         }
1153         *dataptr = cb->cb_acl_node->z_acldata;
1154         *length = cb->cb_acl_node->z_size;
1155 }
1156
1157 int
1158 zfs_acl_chown_setattr(znode_t *zp)
1159 {
1160         int error;
1161         zfs_acl_t *aclp;
1162
1163         ASSERT(MUTEX_HELD(&zp->z_lock));
1164         ASSERT(MUTEX_HELD(&zp->z_acl_lock));
1165
1166         if ((error = zfs_acl_node_read(zp, B_TRUE, &aclp, B_FALSE)) == 0)
1167                 zp->z_mode = zfs_mode_compute(zp->z_mode, aclp,
1168                     &zp->z_pflags, zp->z_uid, zp->z_gid);
1169         return (error);
1170 }
1171
1172 /*
1173  * common code for setting ACLs.
1174  *
1175  * This function is called from zfs_mode_update, zfs_perm_init, and zfs_setacl.
1176  * zfs_setacl passes a non-NULL inherit pointer (ihp) to indicate that it's
1177  * already checked the acl and knows whether to inherit.
1178  */
1179 int
1180 zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
1181 {
1182         int                     error;
1183         zfsvfs_t                *zfsvfs = zp->z_zfsvfs;
1184         dmu_object_type_t       otype;
1185         zfs_acl_locator_cb_t    locate = { 0 };
1186         uint64_t                mode;
1187         sa_bulk_attr_t          bulk[5];
1188         uint64_t                ctime[2];
1189         int                     count = 0;
1190
1191         mode = zp->z_mode;
1192
1193         mode = zfs_mode_compute(mode, aclp, &zp->z_pflags,
1194             zp->z_uid, zp->z_gid);
1195
1196         zp->z_mode = mode;
1197         SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MODE(zfsvfs), NULL,
1198             &mode, sizeof (mode));
1199         SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zfsvfs), NULL,
1200             &zp->z_pflags, sizeof (zp->z_pflags));
1201         SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs), NULL,
1202             &ctime, sizeof (ctime));
1203
1204         if (zp->z_acl_cached) {
1205                 zfs_acl_free(zp->z_acl_cached);
1206                 zp->z_acl_cached = NULL;
1207         }
1208
1209         /*
1210          * Upgrade needed?
1211          */
1212         if (!zfsvfs->z_use_fuids) {
1213                 otype = DMU_OT_OLDACL;
1214         } else {
1215                 if ((aclp->z_version == ZFS_ACL_VERSION_INITIAL) &&
1216                     (zfsvfs->z_version >= ZPL_VERSION_FUID))
1217                         zfs_acl_xform(zp, aclp, cr);
1218                 ASSERT(aclp->z_version >= ZFS_ACL_VERSION_FUID);
1219                 otype = DMU_OT_ACL;
1220         }
1221
1222         /*
1223          * Arrgh, we have to handle old on disk format
1224          * as well as newer (preferred) SA format.
1225          */
1226
1227         if (zp->z_is_sa) { /* the easy case, just update the ACL attribute */
1228                 locate.cb_aclp = aclp;
1229                 SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_DACL_ACES(zfsvfs),
1230                     zfs_acl_data_locator, &locate, aclp->z_acl_bytes);
1231                 SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_DACL_COUNT(zfsvfs),
1232                     NULL, &aclp->z_acl_count, sizeof (uint64_t));
1233         } else { /* Painful legacy way */
1234                 zfs_acl_node_t *aclnode;
1235                 uint64_t off = 0;
1236                 zfs_acl_phys_t acl_phys;
1237                 uint64_t aoid;
1238
1239                 if ((error = sa_lookup(zp->z_sa_hdl, SA_ZPL_ZNODE_ACL(zfsvfs),
1240                     &acl_phys, sizeof (acl_phys))) != 0)
1241                         return (error);
1242
1243                 aoid = acl_phys.z_acl_extern_obj;
1244
1245                 if (aclp->z_acl_bytes > ZFS_ACE_SPACE) {
1246                         /*
1247                          * If ACL was previously external and we are now
1248                          * converting to new ACL format then release old
1249                          * ACL object and create a new one.
1250                          */
1251                         if (aoid &&
1252                             aclp->z_version != acl_phys.z_acl_version) {
1253                                 error = dmu_object_free(zfsvfs->z_os, aoid, tx);
1254                                 if (error)
1255                                         return (error);
1256                                 aoid = 0;
1257                         }
1258                         if (aoid == 0) {
1259                                 aoid = dmu_object_alloc(zfsvfs->z_os,
1260                                     otype, aclp->z_acl_bytes,
1261                                     otype == DMU_OT_ACL ?
1262                                     DMU_OT_SYSACL : DMU_OT_NONE,
1263                                     otype == DMU_OT_ACL ?
1264                                     DN_MAX_BONUSLEN : 0, tx);
1265                         } else {
1266                                 (void) dmu_object_set_blocksize(zfsvfs->z_os,
1267                                     aoid, aclp->z_acl_bytes, 0, tx);
1268                         }
1269                         acl_phys.z_acl_extern_obj = aoid;
1270                         for (aclnode = list_head(&aclp->z_acl); aclnode;
1271                             aclnode = list_next(&aclp->z_acl, aclnode)) {
1272                                 if (aclnode->z_ace_count == 0)
1273                                         continue;
1274                                 dmu_write(zfsvfs->z_os, aoid, off,
1275                                     aclnode->z_size, aclnode->z_acldata, tx);
1276                                 off += aclnode->z_size;
1277                         }
1278                 } else {
1279                         void *start = acl_phys.z_ace_data;
1280                         /*
1281                          * Migrating back embedded?
1282                          */
1283                         if (acl_phys.z_acl_extern_obj) {
1284                                 error = dmu_object_free(zfsvfs->z_os,
1285                                     acl_phys.z_acl_extern_obj, tx);
1286                                 if (error)
1287                                         return (error);
1288                                 acl_phys.z_acl_extern_obj = 0;
1289                         }
1290
1291                         for (aclnode = list_head(&aclp->z_acl); aclnode;
1292                             aclnode = list_next(&aclp->z_acl, aclnode)) {
1293                                 if (aclnode->z_ace_count == 0)
1294                                         continue;
1295                                 bcopy(aclnode->z_acldata, start,
1296                                     aclnode->z_size);
1297                                 start = (caddr_t)start + aclnode->z_size;
1298                         }
1299                 }
1300                 /*
1301                  * If Old version then swap count/bytes to match old
1302                  * layout of znode_acl_phys_t.
1303                  */
1304                 if (aclp->z_version == ZFS_ACL_VERSION_INITIAL) {
1305                         acl_phys.z_acl_size = aclp->z_acl_count;
1306                         acl_phys.z_acl_count = aclp->z_acl_bytes;
1307                 } else {
1308                         acl_phys.z_acl_size = aclp->z_acl_bytes;
1309                         acl_phys.z_acl_count = aclp->z_acl_count;
1310                 }
1311                 acl_phys.z_acl_version = aclp->z_version;
1312
1313                 SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_ZNODE_ACL(zfsvfs), NULL,
1314                     &acl_phys, sizeof (acl_phys));
1315         }
1316
1317         /*
1318          * Replace ACL wide bits, but first clear them.
1319          */
1320         zp->z_pflags &= ~ZFS_ACL_WIDE_FLAGS;
1321
1322         zp->z_pflags |= aclp->z_hints;
1323
1324         if (ace_trivial_common(aclp, 0, zfs_ace_walk) == 0)
1325                 zp->z_pflags |= ZFS_ACL_TRIVIAL;
1326
1327         zfs_tstamp_update_setup(zp, STATE_CHANGED, NULL, ctime, B_TRUE);
1328         return (sa_bulk_update(zp->z_sa_hdl, bulk, count, tx));
1329 }
1330
1331 static void
1332 zfs_acl_chmod(vtype_t vtype, uint64_t mode, boolean_t trim, zfs_acl_t *aclp)
1333 {
1334         void            *acep = NULL;
1335         uint64_t        who;
1336         int             new_count, new_bytes;
1337         int             ace_size;
1338         int             entry_type;
1339         uint16_t        iflags, type;
1340         uint32_t        access_mask;
1341         zfs_acl_node_t  *newnode;
1342         size_t          abstract_size = aclp->z_ops.ace_abstract_size();
1343         void            *zacep;
1344         boolean_t       isdir;
1345         trivial_acl_t   masks;
1346
1347         new_count = new_bytes = 0;
1348
1349         isdir = (vtype == VDIR);
1350
1351         acl_trivial_access_masks((mode_t)mode, isdir, &masks);
1352
1353         newnode = zfs_acl_node_alloc((abstract_size * 6) + aclp->z_acl_bytes);
1354
1355         zacep = newnode->z_acldata;
1356         if (masks.allow0) {
1357                 zfs_set_ace(aclp, zacep, masks.allow0, ALLOW, -1, ACE_OWNER);
1358                 zacep = (void *)((uintptr_t)zacep + abstract_size);
1359                 new_count++;
1360                 new_bytes += abstract_size;
1361         } if (masks.deny1) {
1362                 zfs_set_ace(aclp, zacep, masks.deny1, DENY, -1, ACE_OWNER);
1363                 zacep = (void *)((uintptr_t)zacep + abstract_size);
1364                 new_count++;
1365                 new_bytes += abstract_size;
1366         }
1367         if (masks.deny2) {
1368                 zfs_set_ace(aclp, zacep, masks.deny2, DENY, -1, OWNING_GROUP);
1369                 zacep = (void *)((uintptr_t)zacep + abstract_size);
1370                 new_count++;
1371                 new_bytes += abstract_size;
1372         }
1373
1374         while (acep = zfs_acl_next_ace(aclp, acep, &who, &access_mask,
1375             &iflags, &type)) {
1376                 uint16_t inherit_flags;
1377
1378                 entry_type = (iflags & ACE_TYPE_FLAGS);
1379                 inherit_flags = (iflags & ALL_INHERIT);
1380
1381                 if ((entry_type == ACE_OWNER || entry_type == ACE_EVERYONE ||
1382                     (entry_type == OWNING_GROUP)) &&
1383                     ((inherit_flags & ACE_INHERIT_ONLY_ACE) == 0)) {
1384                         continue;
1385                 }
1386
1387                 /*
1388                  * If this ACL has any inheritable ACEs, mark that in
1389                  * the hints (which are later masked into the pflags)
1390                  * so create knows to do inheritance.
1391                  */
1392                 if (isdir && (inherit_flags &
1393                     (ACE_FILE_INHERIT_ACE|ACE_DIRECTORY_INHERIT_ACE)))
1394                         aclp->z_hints |= ZFS_INHERIT_ACE;
1395
1396                 if ((type != ALLOW && type != DENY) ||
1397                     (inherit_flags & ACE_INHERIT_ONLY_ACE)) {
1398                         switch (type) {
1399                         case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE:
1400                         case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE:
1401                         case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE:
1402                         case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE:
1403                                 aclp->z_hints |= ZFS_ACL_OBJ_ACE;
1404                                 break;
1405                         }
1406                 } else {
1407
1408                         /*
1409                          * Limit permissions to be no greater than
1410                          * group permissions.
1411                          * The "aclinherit" and "aclmode" properties
1412                          * affect policy for create and chmod(2),
1413                          * respectively.
1414                          */
1415                         if ((type == ALLOW) && trim)
1416                                 access_mask &= masks.group;
1417                 }
1418                 zfs_set_ace(aclp, zacep, access_mask, type, who, iflags);
1419                 ace_size = aclp->z_ops.ace_size(acep);
1420                 zacep = (void *)((uintptr_t)zacep + ace_size);
1421                 new_count++;
1422                 new_bytes += ace_size;
1423         }
1424         zfs_set_ace(aclp, zacep, masks.owner, 0, -1, ACE_OWNER);
1425         zacep = (void *)((uintptr_t)zacep + abstract_size);
1426         zfs_set_ace(aclp, zacep, masks.group, 0, -1, OWNING_GROUP);
1427         zacep = (void *)((uintptr_t)zacep + abstract_size);
1428         zfs_set_ace(aclp, zacep, masks.everyone, 0, -1, ACE_EVERYONE);
1429
1430         new_count += 3;
1431         new_bytes += abstract_size * 3;
1432         zfs_acl_release_nodes(aclp);
1433         aclp->z_acl_count = new_count;
1434         aclp->z_acl_bytes = new_bytes;
1435         newnode->z_ace_count = new_count;
1436         newnode->z_size = new_bytes;
1437         list_insert_tail(&aclp->z_acl, newnode);
1438 }
1439
1440 int
1441 zfs_acl_chmod_setattr(znode_t *zp, zfs_acl_t **aclp, uint64_t mode)
1442 {
1443         int error = 0;
1444
1445         mutex_enter(&zp->z_acl_lock);
1446         mutex_enter(&zp->z_lock);
1447         if (zp->z_zfsvfs->z_acl_mode == ZFS_ACL_DISCARD)
1448                 *aclp = zfs_acl_alloc(zfs_acl_version_zp(zp));
1449         else
1450                 error = zfs_acl_node_read(zp, B_TRUE, aclp, B_TRUE);
1451
1452         if (error == 0) {
1453                 (*aclp)->z_hints = zp->z_pflags & V4_ACL_WIDE_FLAGS;
1454                 zfs_acl_chmod(ZTOV(zp)->v_type, mode,
1455                     (zp->z_zfsvfs->z_acl_mode == ZFS_ACL_GROUPMASK), *aclp);
1456         }
1457         mutex_exit(&zp->z_lock);
1458         mutex_exit(&zp->z_acl_lock);
1459
1460         return (error);
1461 }
1462
1463 /*
1464  * strip off write_owner and write_acl
1465  */
1466 static void
1467 zfs_restricted_update(zfsvfs_t *zfsvfs, zfs_acl_t *aclp, void *acep)
1468 {
1469         uint32_t mask = aclp->z_ops.ace_mask_get(acep);
1470
1471         if ((zfsvfs->z_acl_inherit == ZFS_ACL_RESTRICTED) &&
1472             (aclp->z_ops.ace_type_get(acep) == ALLOW)) {
1473                 mask &= ~RESTRICTED_CLEAR;
1474                 aclp->z_ops.ace_mask_set(acep, mask);
1475         }
1476 }
1477
1478 /*
1479  * Should ACE be inherited?
1480  */
1481 static int
1482 zfs_ace_can_use(vtype_t vtype, uint16_t acep_flags)
1483 {
1484         int     iflags = (acep_flags & 0xf);
1485
1486         if ((vtype == VDIR) && (iflags & ACE_DIRECTORY_INHERIT_ACE))
1487                 return (1);
1488         else if (iflags & ACE_FILE_INHERIT_ACE)
1489                 return (!((vtype == VDIR) &&
1490                     (iflags & ACE_NO_PROPAGATE_INHERIT_ACE)));
1491         return (0);
1492 }
1493
1494 /*
1495  * inherit inheritable ACEs from parent
1496  */
1497 static zfs_acl_t *
1498 zfs_acl_inherit(zfsvfs_t *zfsvfs, vtype_t vtype, zfs_acl_t *paclp,
1499     uint64_t mode, boolean_t *need_chmod)
1500 {
1501         void            *pacep;
1502         void            *acep;
1503         zfs_acl_node_t  *aclnode;
1504         zfs_acl_t       *aclp = NULL;
1505         uint64_t        who;
1506         uint32_t        access_mask;
1507         uint16_t        iflags, newflags, type;
1508         size_t          ace_size;
1509         void            *data1, *data2;
1510         size_t          data1sz, data2sz;
1511         boolean_t       vdir = vtype == VDIR;
1512         boolean_t       vreg = vtype == VREG;
1513         boolean_t       passthrough, passthrough_x, noallow;
1514
1515         passthrough_x =
1516             zfsvfs->z_acl_inherit == ZFS_ACL_PASSTHROUGH_X;
1517         passthrough = passthrough_x ||
1518             zfsvfs->z_acl_inherit == ZFS_ACL_PASSTHROUGH;
1519         noallow =
1520             zfsvfs->z_acl_inherit == ZFS_ACL_NOALLOW;
1521
1522         *need_chmod = B_TRUE;
1523         pacep = NULL;
1524         aclp = zfs_acl_alloc(paclp->z_version);
1525         if (zfsvfs->z_acl_inherit == ZFS_ACL_DISCARD || vtype == VLNK)
1526                 return (aclp);
1527         while (pacep = zfs_acl_next_ace(paclp, pacep, &who,
1528             &access_mask, &iflags, &type)) {
1529
1530                 /*
1531                  * don't inherit bogus ACEs
1532                  */
1533                 if (!zfs_acl_valid_ace_type(type, iflags))
1534                         continue;
1535
1536                 if (noallow && type == ALLOW)
1537                         continue;
1538
1539                 ace_size = aclp->z_ops.ace_size(pacep);
1540
1541                 if (!zfs_ace_can_use(vtype, iflags))
1542                         continue;
1543
1544                 /*
1545                  * If owner@, group@, or everyone@ inheritable
1546                  * then zfs_acl_chmod() isn't needed.
1547                  */
1548                 if (passthrough &&
1549                     ((iflags & (ACE_OWNER|ACE_EVERYONE)) ||
1550                     ((iflags & OWNING_GROUP) ==
1551                     OWNING_GROUP)) && (vreg || (vdir && (iflags &
1552                     ACE_DIRECTORY_INHERIT_ACE)))) {
1553                         *need_chmod = B_FALSE;
1554                 }
1555
1556                 if (!vdir && passthrough_x &&
1557                     ((mode & (S_IXUSR | S_IXGRP | S_IXOTH)) == 0)) {
1558                         access_mask &= ~ACE_EXECUTE;
1559                 }
1560
1561                 aclnode = zfs_acl_node_alloc(ace_size);
1562                 list_insert_tail(&aclp->z_acl, aclnode);
1563                 acep = aclnode->z_acldata;
1564
1565                 zfs_set_ace(aclp, acep, access_mask, type,
1566                     who, iflags|ACE_INHERITED_ACE);
1567
1568                 /*
1569                  * Copy special opaque data if any
1570                  */
1571                 if ((data1sz = paclp->z_ops.ace_data(pacep, &data1)) != 0) {
1572                         VERIFY((data2sz = aclp->z_ops.ace_data(acep,
1573                             &data2)) == data1sz);
1574                         bcopy(data1, data2, data2sz);
1575                 }
1576
1577                 aclp->z_acl_count++;
1578                 aclnode->z_ace_count++;
1579                 aclp->z_acl_bytes += aclnode->z_size;
1580                 newflags = aclp->z_ops.ace_flags_get(acep);
1581
1582                 if (vdir)
1583                         aclp->z_hints |= ZFS_INHERIT_ACE;
1584
1585                 if ((iflags & ACE_NO_PROPAGATE_INHERIT_ACE) || !vdir) {
1586                         newflags &= ~ALL_INHERIT;
1587                         aclp->z_ops.ace_flags_set(acep,
1588                             newflags|ACE_INHERITED_ACE);
1589                         zfs_restricted_update(zfsvfs, aclp, acep);
1590                         continue;
1591                 }
1592
1593                 ASSERT(vdir);
1594
1595                 /*
1596                  * If only FILE_INHERIT is set then turn on
1597                  * inherit_only
1598                  */
1599                 if ((iflags & (ACE_FILE_INHERIT_ACE |
1600                     ACE_DIRECTORY_INHERIT_ACE)) == ACE_FILE_INHERIT_ACE) {
1601                         newflags |= ACE_INHERIT_ONLY_ACE;
1602                         aclp->z_ops.ace_flags_set(acep,
1603                             newflags|ACE_INHERITED_ACE);
1604                 } else {
1605                         newflags &= ~ACE_INHERIT_ONLY_ACE;
1606                         aclp->z_ops.ace_flags_set(acep,
1607                             newflags|ACE_INHERITED_ACE);
1608                 }
1609         }
1610         return (aclp);
1611 }
1612
1613 /*
1614  * Create file system object initial permissions
1615  * including inheritable ACEs.
1616  */
1617 int
1618 zfs_acl_ids_create(znode_t *dzp, int flag, vattr_t *vap, cred_t *cr,
1619     vsecattr_t *vsecp, zfs_acl_ids_t *acl_ids)
1620 {
1621         int             error;
1622         zfsvfs_t        *zfsvfs = dzp->z_zfsvfs;
1623         zfs_acl_t       *paclp;
1624         gid_t           gid;
1625         boolean_t       need_chmod = B_TRUE;
1626         boolean_t       inherited = B_FALSE;
1627
1628         bzero(acl_ids, sizeof (zfs_acl_ids_t));
1629         acl_ids->z_mode = MAKEIMODE(vap->va_type, vap->va_mode);
1630
1631         if (vsecp)
1632                 if ((error = zfs_vsec_2_aclp(zfsvfs, vap->va_type, vsecp, cr,
1633                     &acl_ids->z_fuidp, &acl_ids->z_aclp)) != 0)
1634                         return (error);
1635         /*
1636          * Determine uid and gid.
1637          */
1638         if ((flag & IS_ROOT_NODE) || zfsvfs->z_replay ||
1639             ((flag & IS_XATTR) && (vap->va_type == VDIR))) {
1640                 acl_ids->z_fuid = zfs_fuid_create(zfsvfs,
1641                     (uint64_t)vap->va_uid, cr,
1642                     ZFS_OWNER, &acl_ids->z_fuidp);
1643                 acl_ids->z_fgid = zfs_fuid_create(zfsvfs,
1644                     (uint64_t)vap->va_gid, cr,
1645                     ZFS_GROUP, &acl_ids->z_fuidp);
1646                 gid = vap->va_gid;
1647         } else {
1648                 acl_ids->z_fuid = zfs_fuid_create_cred(zfsvfs, ZFS_OWNER,
1649                     cr, &acl_ids->z_fuidp);
1650                 acl_ids->z_fgid = 0;
1651                 if (vap->va_mask & AT_GID)  {
1652                         acl_ids->z_fgid = zfs_fuid_create(zfsvfs,
1653                             (uint64_t)vap->va_gid,
1654                             cr, ZFS_GROUP, &acl_ids->z_fuidp);
1655                         gid = vap->va_gid;
1656                         if (acl_ids->z_fgid != dzp->z_gid &&
1657                             !groupmember(vap->va_gid, cr) &&
1658                             secpolicy_vnode_create_gid(cr) != 0)
1659                                 acl_ids->z_fgid = 0;
1660                 }
1661                 if (acl_ids->z_fgid == 0) {
1662                         if (dzp->z_mode & S_ISGID) {
1663                                 char            *domain;
1664                                 uint32_t        rid;
1665
1666                                 acl_ids->z_fgid = dzp->z_gid;
1667                                 gid = zfs_fuid_map_id(zfsvfs, acl_ids->z_fgid,
1668                                     cr, ZFS_GROUP);
1669
1670                                 if (zfsvfs->z_use_fuids &&
1671                                     IS_EPHEMERAL(acl_ids->z_fgid)) {
1672                                         domain = zfs_fuid_idx_domain(
1673                                             &zfsvfs->z_fuid_idx,
1674                                             FUID_INDEX(acl_ids->z_fgid));
1675                                         rid = FUID_RID(acl_ids->z_fgid);
1676                                         zfs_fuid_node_add(&acl_ids->z_fuidp,
1677                                             domain, rid,
1678                                             FUID_INDEX(acl_ids->z_fgid),
1679                                             acl_ids->z_fgid, ZFS_GROUP);
1680                                 }
1681                         } else {
1682                                 acl_ids->z_fgid = zfs_fuid_create_cred(zfsvfs,
1683                                     ZFS_GROUP, cr, &acl_ids->z_fuidp);
1684 #ifdef __FreeBSD__
1685                                 gid = acl_ids->z_fgid = dzp->z_gid;
1686 #else
1687                                 gid = crgetgid(cr);
1688 #endif
1689                         }
1690                 }
1691         }
1692
1693         /*
1694          * If we're creating a directory, and the parent directory has the
1695          * set-GID bit set, set in on the new directory.
1696          * Otherwise, if the user is neither privileged nor a member of the
1697          * file's new group, clear the file's set-GID bit.
1698          */
1699
1700         if (!(flag & IS_ROOT_NODE) && (dzp->z_mode & S_ISGID) &&
1701             (vap->va_type == VDIR)) {
1702                 acl_ids->z_mode |= S_ISGID;
1703         } else {
1704                 if ((acl_ids->z_mode & S_ISGID) &&
1705                     secpolicy_vnode_setids_setgids(ZTOV(dzp), cr, gid) != 0)
1706                         acl_ids->z_mode &= ~S_ISGID;
1707         }
1708
1709         if (acl_ids->z_aclp == NULL) {
1710                 mutex_enter(&dzp->z_acl_lock);
1711                 mutex_enter(&dzp->z_lock);
1712                 if (!(flag & IS_ROOT_NODE) &&
1713                     (dzp->z_pflags & ZFS_INHERIT_ACE) &&
1714                     !(dzp->z_pflags & ZFS_XATTR)) {
1715                         VERIFY(0 == zfs_acl_node_read(dzp, B_TRUE,
1716                             &paclp, B_FALSE));
1717                         acl_ids->z_aclp = zfs_acl_inherit(zfsvfs,
1718                             vap->va_type, paclp, acl_ids->z_mode, &need_chmod);
1719                         inherited = B_TRUE;
1720                 } else {
1721                         acl_ids->z_aclp =
1722                             zfs_acl_alloc(zfs_acl_version_zp(dzp));
1723                         acl_ids->z_aclp->z_hints |= ZFS_ACL_TRIVIAL;
1724                 }
1725                 mutex_exit(&dzp->z_lock);
1726                 mutex_exit(&dzp->z_acl_lock);
1727                 if (need_chmod) {
1728                         acl_ids->z_aclp->z_hints |= (vap->va_type == VDIR) ?
1729                             ZFS_ACL_AUTO_INHERIT : 0;
1730                         zfs_acl_chmod(vap->va_type, acl_ids->z_mode,
1731                             (zfsvfs->z_acl_inherit == ZFS_ACL_RESTRICTED),
1732                             acl_ids->z_aclp);
1733                 }
1734         }
1735
1736         if (inherited || vsecp) {
1737                 acl_ids->z_mode = zfs_mode_compute(acl_ids->z_mode,
1738                     acl_ids->z_aclp, &acl_ids->z_aclp->z_hints,
1739                     acl_ids->z_fuid, acl_ids->z_fgid);
1740                 if (ace_trivial_common(acl_ids->z_aclp, 0, zfs_ace_walk) == 0)
1741                         acl_ids->z_aclp->z_hints |= ZFS_ACL_TRIVIAL;
1742         }
1743
1744         return (0);
1745 }
1746
1747 /*
1748  * Free ACL and fuid_infop, but not the acl_ids structure
1749  */
1750 void
1751 zfs_acl_ids_free(zfs_acl_ids_t *acl_ids)
1752 {
1753         if (acl_ids->z_aclp)
1754                 zfs_acl_free(acl_ids->z_aclp);
1755         if (acl_ids->z_fuidp)
1756                 zfs_fuid_info_free(acl_ids->z_fuidp);
1757         acl_ids->z_aclp = NULL;
1758         acl_ids->z_fuidp = NULL;
1759 }
1760
1761 boolean_t
1762 zfs_acl_ids_overquota(zfsvfs_t *zfsvfs, zfs_acl_ids_t *acl_ids)
1763 {
1764         return (zfs_fuid_overquota(zfsvfs, B_FALSE, acl_ids->z_fuid) ||
1765             zfs_fuid_overquota(zfsvfs, B_TRUE, acl_ids->z_fgid));
1766 }
1767
1768 /*
1769  * Retrieve a files ACL
1770  */
1771 int
1772 zfs_getacl(znode_t *zp, vsecattr_t *vsecp, boolean_t skipaclchk, cred_t *cr)
1773 {
1774         zfs_acl_t       *aclp;
1775         ulong_t         mask;
1776         int             error;
1777         int             count = 0;
1778         int             largeace = 0;
1779
1780         mask = vsecp->vsa_mask & (VSA_ACE | VSA_ACECNT |
1781             VSA_ACE_ACLFLAGS | VSA_ACE_ALLTYPES);
1782
1783         if (mask == 0)
1784                 return (ENOSYS);
1785
1786         if (error = zfs_zaccess(zp, ACE_READ_ACL, 0, skipaclchk, cr))
1787                 return (error);
1788
1789         mutex_enter(&zp->z_acl_lock);
1790
1791         error = zfs_acl_node_read(zp, B_FALSE, &aclp, B_FALSE);
1792         if (error != 0) {
1793                 mutex_exit(&zp->z_acl_lock);
1794                 return (error);
1795         }
1796
1797         /*
1798          * Scan ACL to determine number of ACEs
1799          */
1800         if ((zp->z_pflags & ZFS_ACL_OBJ_ACE) && !(mask & VSA_ACE_ALLTYPES)) {
1801                 void *zacep = NULL;
1802                 uint64_t who;
1803                 uint32_t access_mask;
1804                 uint16_t type, iflags;
1805
1806                 while (zacep = zfs_acl_next_ace(aclp, zacep,
1807                     &who, &access_mask, &iflags, &type)) {
1808                         switch (type) {
1809                         case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE:
1810                         case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE:
1811                         case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE:
1812                         case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE:
1813                                 largeace++;
1814                                 continue;
1815                         default:
1816                                 count++;
1817                         }
1818                 }
1819                 vsecp->vsa_aclcnt = count;
1820         } else
1821                 count = (int)aclp->z_acl_count;
1822
1823         if (mask & VSA_ACECNT) {
1824                 vsecp->vsa_aclcnt = count;
1825         }
1826
1827         if (mask & VSA_ACE) {
1828                 size_t aclsz;
1829
1830                 aclsz = count * sizeof (ace_t) +
1831                     sizeof (ace_object_t) * largeace;
1832
1833                 vsecp->vsa_aclentp = kmem_alloc(aclsz, KM_SLEEP);
1834                 vsecp->vsa_aclentsz = aclsz;
1835
1836                 if (aclp->z_version == ZFS_ACL_VERSION_FUID)
1837                         zfs_copy_fuid_2_ace(zp->z_zfsvfs, aclp, cr,
1838                             vsecp->vsa_aclentp, !(mask & VSA_ACE_ALLTYPES));
1839                 else {
1840                         zfs_acl_node_t *aclnode;
1841                         void *start = vsecp->vsa_aclentp;
1842
1843                         for (aclnode = list_head(&aclp->z_acl); aclnode;
1844                             aclnode = list_next(&aclp->z_acl, aclnode)) {
1845                                 bcopy(aclnode->z_acldata, start,
1846                                     aclnode->z_size);
1847                                 start = (caddr_t)start + aclnode->z_size;
1848                         }
1849                         ASSERT((caddr_t)start - (caddr_t)vsecp->vsa_aclentp ==
1850                             aclp->z_acl_bytes);
1851                 }
1852         }
1853         if (mask & VSA_ACE_ACLFLAGS) {
1854                 vsecp->vsa_aclflags = 0;
1855                 if (zp->z_pflags & ZFS_ACL_DEFAULTED)
1856                         vsecp->vsa_aclflags |= ACL_DEFAULTED;
1857                 if (zp->z_pflags & ZFS_ACL_PROTECTED)
1858                         vsecp->vsa_aclflags |= ACL_PROTECTED;
1859                 if (zp->z_pflags & ZFS_ACL_AUTO_INHERIT)
1860                         vsecp->vsa_aclflags |= ACL_AUTO_INHERIT;
1861         }
1862
1863         mutex_exit(&zp->z_acl_lock);
1864
1865         return (0);
1866 }
1867
1868 int
1869 zfs_vsec_2_aclp(zfsvfs_t *zfsvfs, vtype_t obj_type,
1870     vsecattr_t *vsecp, cred_t *cr, zfs_fuid_info_t **fuidp, zfs_acl_t **zaclp)
1871 {
1872         zfs_acl_t *aclp;
1873         zfs_acl_node_t *aclnode;
1874         int aclcnt = vsecp->vsa_aclcnt;
1875         int error;
1876
1877         if (vsecp->vsa_aclcnt > MAX_ACL_ENTRIES || vsecp->vsa_aclcnt <= 0)
1878                 return (EINVAL);
1879
1880         aclp = zfs_acl_alloc(zfs_acl_version(zfsvfs->z_version));
1881
1882         aclp->z_hints = 0;
1883         aclnode = zfs_acl_node_alloc(aclcnt * sizeof (zfs_object_ace_t));
1884         if (aclp->z_version == ZFS_ACL_VERSION_INITIAL) {
1885                 if ((error = zfs_copy_ace_2_oldace(obj_type, aclp,
1886                     (ace_t *)vsecp->vsa_aclentp, aclnode->z_acldata,
1887                     aclcnt, &aclnode->z_size)) != 0) {
1888                         zfs_acl_free(aclp);
1889                         zfs_acl_node_free(aclnode);
1890                         return (error);
1891                 }
1892         } else {
1893                 if ((error = zfs_copy_ace_2_fuid(zfsvfs, obj_type, aclp,
1894                     vsecp->vsa_aclentp, aclnode->z_acldata, aclcnt,
1895                     &aclnode->z_size, fuidp, cr)) != 0) {
1896                         zfs_acl_free(aclp);
1897                         zfs_acl_node_free(aclnode);
1898                         return (error);
1899                 }
1900         }
1901         aclp->z_acl_bytes = aclnode->z_size;
1902         aclnode->z_ace_count = aclcnt;
1903         aclp->z_acl_count = aclcnt;
1904         list_insert_head(&aclp->z_acl, aclnode);
1905
1906         /*
1907          * If flags are being set then add them to z_hints
1908          */
1909         if (vsecp->vsa_mask & VSA_ACE_ACLFLAGS) {
1910                 if (vsecp->vsa_aclflags & ACL_PROTECTED)
1911                         aclp->z_hints |= ZFS_ACL_PROTECTED;
1912                 if (vsecp->vsa_aclflags & ACL_DEFAULTED)
1913                         aclp->z_hints |= ZFS_ACL_DEFAULTED;
1914                 if (vsecp->vsa_aclflags & ACL_AUTO_INHERIT)
1915                         aclp->z_hints |= ZFS_ACL_AUTO_INHERIT;
1916         }
1917
1918         *zaclp = aclp;
1919
1920         return (0);
1921 }
1922
1923 /*
1924  * Set a files ACL
1925  */
1926 int
1927 zfs_setacl(znode_t *zp, vsecattr_t *vsecp, boolean_t skipaclchk, cred_t *cr)
1928 {
1929         zfsvfs_t        *zfsvfs = zp->z_zfsvfs;
1930         zilog_t         *zilog = zfsvfs->z_log;
1931         ulong_t         mask = vsecp->vsa_mask & (VSA_ACE | VSA_ACECNT);
1932         dmu_tx_t        *tx;
1933         int             error;
1934         zfs_acl_t       *aclp;
1935         zfs_fuid_info_t *fuidp = NULL;
1936         boolean_t       fuid_dirtied;
1937         uint64_t        acl_obj;
1938
1939         if (mask == 0)
1940                 return (ENOSYS);
1941
1942         if (zp->z_pflags & ZFS_IMMUTABLE)
1943                 return (EPERM);
1944
1945         if (error = zfs_zaccess(zp, ACE_WRITE_ACL, 0, skipaclchk, cr))
1946                 return (error);
1947
1948         error = zfs_vsec_2_aclp(zfsvfs, ZTOV(zp)->v_type, vsecp, cr, &fuidp,
1949             &aclp);
1950         if (error)
1951                 return (error);
1952
1953         /*
1954          * If ACL wide flags aren't being set then preserve any
1955          * existing flags.
1956          */
1957         if (!(vsecp->vsa_mask & VSA_ACE_ACLFLAGS)) {
1958                 aclp->z_hints |=
1959                     (zp->z_pflags & V4_ACL_WIDE_FLAGS);
1960         }
1961 top:
1962         mutex_enter(&zp->z_acl_lock);
1963         mutex_enter(&zp->z_lock);
1964
1965         tx = dmu_tx_create(zfsvfs->z_os);
1966
1967         dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_TRUE);
1968
1969         fuid_dirtied = zfsvfs->z_fuid_dirty;
1970         if (fuid_dirtied)
1971                 zfs_fuid_txhold(zfsvfs, tx);
1972
1973         /*
1974          * If old version and ACL won't fit in bonus and we aren't
1975          * upgrading then take out necessary DMU holds
1976          */
1977
1978         if ((acl_obj = zfs_external_acl(zp)) != 0) {
1979                 if (zfsvfs->z_version >= ZPL_VERSION_FUID &&
1980                     zfs_znode_acl_version(zp) <= ZFS_ACL_VERSION_INITIAL) {
1981                         dmu_tx_hold_free(tx, acl_obj, 0,
1982                             DMU_OBJECT_END);
1983                         dmu_tx_hold_write(tx, DMU_NEW_OBJECT, 0,
1984                             aclp->z_acl_bytes);
1985                 } else {
1986                         dmu_tx_hold_write(tx, acl_obj, 0, aclp->z_acl_bytes);
1987                 }
1988         } else if (!zp->z_is_sa && aclp->z_acl_bytes > ZFS_ACE_SPACE) {
1989                 dmu_tx_hold_write(tx, DMU_NEW_OBJECT, 0, aclp->z_acl_bytes);
1990         }
1991
1992         zfs_sa_upgrade_txholds(tx, zp);
1993         error = dmu_tx_assign(tx, TXG_NOWAIT);
1994         if (error) {
1995                 mutex_exit(&zp->z_acl_lock);
1996                 mutex_exit(&zp->z_lock);
1997
1998                 if (error == ERESTART) {
1999                         dmu_tx_wait(tx);
2000                         dmu_tx_abort(tx);
2001                         goto top;
2002                 }
2003                 dmu_tx_abort(tx);
2004                 zfs_acl_free(aclp);
2005                 return (error);
2006         }
2007
2008         error = zfs_aclset_common(zp, aclp, cr, tx);
2009         ASSERT(error == 0);
2010         ASSERT(zp->z_acl_cached == NULL);
2011         zp->z_acl_cached = aclp;
2012
2013         if (fuid_dirtied)
2014                 zfs_fuid_sync(zfsvfs, tx);
2015
2016         zfs_log_acl(zilog, tx, zp, vsecp, fuidp);
2017
2018         if (fuidp)
2019                 zfs_fuid_info_free(fuidp);
2020         dmu_tx_commit(tx);
2021 done:
2022         mutex_exit(&zp->z_lock);
2023         mutex_exit(&zp->z_acl_lock);
2024
2025         return (error);
2026 }
2027
2028 /*
2029  * Check accesses of interest (AoI) against attributes of the dataset
2030  * such as read-only.  Returns zero if no AoI conflict with dataset
2031  * attributes, otherwise an appropriate errno is returned.
2032  */
2033 static int
2034 zfs_zaccess_dataset_check(znode_t *zp, uint32_t v4_mode)
2035 {
2036         if ((v4_mode & WRITE_MASK) &&
2037             (zp->z_zfsvfs->z_vfs->vfs_flag & VFS_RDONLY) &&
2038             (!IS_DEVVP(ZTOV(zp)) ||
2039             (IS_DEVVP(ZTOV(zp)) && (v4_mode & WRITE_MASK_ATTRS)))) {
2040                 return (EROFS);
2041         }
2042
2043         /*
2044          * Only check for READONLY on non-directories.
2045          */
2046         if ((v4_mode & WRITE_MASK_DATA) &&
2047             (((ZTOV(zp)->v_type != VDIR) &&
2048             (zp->z_pflags & (ZFS_READONLY | ZFS_IMMUTABLE))) ||
2049             (ZTOV(zp)->v_type == VDIR &&
2050             (zp->z_pflags & ZFS_IMMUTABLE)))) {
2051                 return (EPERM);
2052         }
2053
2054 #ifdef sun
2055         if ((v4_mode & (ACE_DELETE | ACE_DELETE_CHILD)) &&
2056             (zp->z_pflags & ZFS_NOUNLINK)) {
2057                 return (EPERM);
2058         }
2059 #else
2060         /*
2061          * In FreeBSD we allow to modify directory's content is ZFS_NOUNLINK
2062          * (sunlnk) is set. We just don't allow directory removal, which is
2063          * handled in zfs_zaccess_delete().
2064          */
2065         if ((v4_mode & ACE_DELETE) &&
2066             (zp->z_pflags & ZFS_NOUNLINK)) {
2067                 return (EPERM);
2068         }
2069 #endif
2070
2071         if (((v4_mode & (ACE_READ_DATA|ACE_EXECUTE)) &&
2072             (zp->z_pflags & ZFS_AV_QUARANTINED))) {
2073                 return (EACCES);
2074         }
2075
2076         return (0);
2077 }
2078
2079 /*
2080  * The primary usage of this function is to loop through all of the
2081  * ACEs in the znode, determining what accesses of interest (AoI) to
2082  * the caller are allowed or denied.  The AoI are expressed as bits in
2083  * the working_mode parameter.  As each ACE is processed, bits covered
2084  * by that ACE are removed from the working_mode.  This removal
2085  * facilitates two things.  The first is that when the working mode is
2086  * empty (= 0), we know we've looked at all the AoI. The second is
2087  * that the ACE interpretation rules don't allow a later ACE to undo
2088  * something granted or denied by an earlier ACE.  Removing the
2089  * discovered access or denial enforces this rule.  At the end of
2090  * processing the ACEs, all AoI that were found to be denied are
2091  * placed into the working_mode, giving the caller a mask of denied
2092  * accesses.  Returns:
2093  *      0               if all AoI granted
2094  *      EACCESS         if the denied mask is non-zero
2095  *      other error     if abnormal failure (e.g., IO error)
2096  *
2097  * A secondary usage of the function is to determine if any of the
2098  * AoI are granted.  If an ACE grants any access in
2099  * the working_mode, we immediately short circuit out of the function.
2100  * This mode is chosen by setting anyaccess to B_TRUE.  The
2101  * working_mode is not a denied access mask upon exit if the function
2102  * is used in this manner.
2103  */
2104 static int
2105 zfs_zaccess_aces_check(znode_t *zp, uint32_t *working_mode,
2106     boolean_t anyaccess, cred_t *cr)
2107 {
2108         zfsvfs_t        *zfsvfs = zp->z_zfsvfs;
2109         zfs_acl_t       *aclp;
2110         int             error;
2111         uid_t           uid = crgetuid(cr);
2112         uint64_t        who;
2113         uint16_t        type, iflags;
2114         uint16_t        entry_type;
2115         uint32_t        access_mask;
2116         uint32_t        deny_mask = 0;
2117         zfs_ace_hdr_t   *acep = NULL;
2118         boolean_t       checkit;
2119         uid_t           gowner;
2120         uid_t           fowner;
2121
2122         zfs_fuid_map_ids(zp, cr, &fowner, &gowner);
2123
2124         mutex_enter(&zp->z_acl_lock);
2125
2126         error = zfs_acl_node_read(zp, B_FALSE, &aclp, B_FALSE);
2127         if (error != 0) {
2128                 mutex_exit(&zp->z_acl_lock);
2129                 return (error);
2130         }
2131
2132         ASSERT(zp->z_acl_cached);
2133
2134         while (acep = zfs_acl_next_ace(aclp, acep, &who, &access_mask,
2135             &iflags, &type)) {
2136                 uint32_t mask_matched;
2137
2138                 if (!zfs_acl_valid_ace_type(type, iflags))
2139                         continue;
2140
2141                 if (ZTOV(zp)->v_type == VDIR && (iflags & ACE_INHERIT_ONLY_ACE))
2142                         continue;
2143
2144                 /* Skip ACE if it does not affect any AoI */
2145                 mask_matched = (access_mask & *working_mode);
2146                 if (!mask_matched)
2147                         continue;
2148
2149                 entry_type = (iflags & ACE_TYPE_FLAGS);
2150
2151                 checkit = B_FALSE;
2152
2153                 switch (entry_type) {
2154                 case ACE_OWNER:
2155                         if (uid == fowner)
2156                                 checkit = B_TRUE;
2157                         break;
2158                 case OWNING_GROUP:
2159                         who = gowner;
2160                         /*FALLTHROUGH*/
2161                 case ACE_IDENTIFIER_GROUP:
2162                         checkit = zfs_groupmember(zfsvfs, who, cr);
2163                         break;
2164                 case ACE_EVERYONE:
2165                         checkit = B_TRUE;
2166                         break;
2167
2168                 /* USER Entry */
2169                 default:
2170                         if (entry_type == 0) {
2171                                 uid_t newid;
2172
2173                                 newid = zfs_fuid_map_id(zfsvfs, who, cr,
2174                                     ZFS_ACE_USER);
2175                                 if (newid != IDMAP_WK_CREATOR_OWNER_UID &&
2176                                     uid == newid)
2177                                         checkit = B_TRUE;
2178                                 break;
2179                         } else {
2180                                 mutex_exit(&zp->z_acl_lock);
2181                                 return (EIO);
2182                         }
2183                 }
2184
2185                 if (checkit) {
2186                         if (type == DENY) {
2187                                 DTRACE_PROBE3(zfs__ace__denies,
2188                                     znode_t *, zp,
2189                                     zfs_ace_hdr_t *, acep,
2190                                     uint32_t, mask_matched);
2191                                 deny_mask |= mask_matched;
2192                         } else {
2193                                 DTRACE_PROBE3(zfs__ace__allows,
2194                                     znode_t *, zp,
2195                                     zfs_ace_hdr_t *, acep,
2196                                     uint32_t, mask_matched);
2197                                 if (anyaccess) {
2198                                         mutex_exit(&zp->z_acl_lock);
2199                                         return (0);
2200                                 }
2201                         }
2202                         *working_mode &= ~mask_matched;
2203                 }
2204
2205                 /* Are we done? */
2206                 if (*working_mode == 0)
2207                         break;
2208         }
2209
2210         mutex_exit(&zp->z_acl_lock);
2211
2212         /* Put the found 'denies' back on the working mode */
2213         if (deny_mask) {
2214                 *working_mode |= deny_mask;
2215                 return (EACCES);
2216         } else if (*working_mode) {
2217                 return (-1);
2218         }
2219
2220         return (0);
2221 }
2222
2223 /*
2224  * Return true if any access whatsoever granted, we don't actually
2225  * care what access is granted.
2226  */
2227 boolean_t
2228 zfs_has_access(znode_t *zp, cred_t *cr)
2229 {
2230         uint32_t have = ACE_ALL_PERMS;
2231
2232         if (zfs_zaccess_aces_check(zp, &have, B_TRUE, cr) != 0) {
2233                 uid_t owner;
2234
2235                 owner = zfs_fuid_map_id(zp->z_zfsvfs, zp->z_uid, cr, ZFS_OWNER);
2236                 return (secpolicy_vnode_any_access(cr, ZTOV(zp), owner) == 0);
2237         }
2238         return (B_TRUE);
2239 }
2240
2241 static int
2242 zfs_zaccess_common(znode_t *zp, uint32_t v4_mode, uint32_t *working_mode,
2243     boolean_t *check_privs, boolean_t skipaclchk, cred_t *cr)
2244 {
2245         zfsvfs_t *zfsvfs = zp->z_zfsvfs;
2246         int err;
2247
2248         *working_mode = v4_mode;
2249         *check_privs = B_TRUE;
2250
2251         /*
2252          * Short circuit empty requests
2253          */
2254         if (v4_mode == 0 || zfsvfs->z_replay) {
2255                 *working_mode = 0;
2256                 return (0);
2257         }
2258
2259         if ((err = zfs_zaccess_dataset_check(zp, v4_mode)) != 0) {
2260                 *check_privs = B_FALSE;
2261                 return (err);
2262         }
2263
2264         /*
2265          * The caller requested that the ACL check be skipped.  This
2266          * would only happen if the caller checked VOP_ACCESS() with a
2267          * 32 bit ACE mask and already had the appropriate permissions.
2268          */
2269         if (skipaclchk) {
2270                 *working_mode = 0;
2271                 return (0);
2272         }
2273
2274         return (zfs_zaccess_aces_check(zp, working_mode, B_FALSE, cr));
2275 }
2276
2277 static int
2278 zfs_zaccess_append(znode_t *zp, uint32_t *working_mode, boolean_t *check_privs,
2279     cred_t *cr)
2280 {
2281         if (*working_mode != ACE_WRITE_DATA)
2282                 return (EACCES);
2283
2284         return (zfs_zaccess_common(zp, ACE_APPEND_DATA, working_mode,
2285             check_privs, B_FALSE, cr));
2286 }
2287
2288 int
2289 zfs_fastaccesschk_execute(znode_t *zdp, cred_t *cr)
2290 {
2291         boolean_t owner = B_FALSE;
2292         boolean_t groupmbr = B_FALSE;
2293         boolean_t is_attr;
2294         uid_t uid = crgetuid(cr);
2295         int error;
2296
2297         if (zdp->z_pflags & ZFS_AV_QUARANTINED)
2298                 return (EACCES);
2299
2300         is_attr = ((zdp->z_pflags & ZFS_XATTR) &&
2301             (ZTOV(zdp)->v_type == VDIR));
2302         if (is_attr)
2303                 goto slow;
2304
2305
2306         mutex_enter(&zdp->z_acl_lock);
2307
2308         if (zdp->z_pflags & ZFS_NO_EXECS_DENIED) {
2309                 mutex_exit(&zdp->z_acl_lock);
2310                 return (0);
2311         }
2312
2313         if (FUID_INDEX(zdp->z_uid) != 0 || FUID_INDEX(zdp->z_gid) != 0) {
2314                 mutex_exit(&zdp->z_acl_lock);
2315                 goto slow;
2316         }
2317
2318         if (uid == zdp->z_uid) {
2319                 owner = B_TRUE;
2320                 if (zdp->z_mode & S_IXUSR) {
2321                         mutex_exit(&zdp->z_acl_lock);
2322                         return (0);
2323                 } else {
2324                         mutex_exit(&zdp->z_acl_lock);
2325                         goto slow;
2326                 }
2327         }
2328         if (groupmember(zdp->z_gid, cr)) {
2329                 groupmbr = B_TRUE;
2330                 if (zdp->z_mode & S_IXGRP) {
2331                         mutex_exit(&zdp->z_acl_lock);
2332                         return (0);
2333                 } else {
2334                         mutex_exit(&zdp->z_acl_lock);
2335                         goto slow;
2336                 }
2337         }
2338         if (!owner && !groupmbr) {
2339                 if (zdp->z_mode & S_IXOTH) {
2340                         mutex_exit(&zdp->z_acl_lock);
2341                         return (0);
2342                 }
2343         }
2344
2345         mutex_exit(&zdp->z_acl_lock);
2346
2347 slow:
2348         DTRACE_PROBE(zfs__fastpath__execute__access__miss);
2349         ZFS_ENTER(zdp->z_zfsvfs);
2350         error = zfs_zaccess(zdp, ACE_EXECUTE, 0, B_FALSE, cr);
2351         ZFS_EXIT(zdp->z_zfsvfs);
2352         return (error);
2353 }
2354
2355 /*
2356  * Determine whether Access should be granted/denied.
2357  * The least priv subsytem is always consulted as a basic privilege
2358  * can define any form of access.
2359  */
2360 int
2361 zfs_zaccess(znode_t *zp, int mode, int flags, boolean_t skipaclchk, cred_t *cr)
2362 {
2363         uint32_t        working_mode;
2364         int             error;
2365         int             is_attr;
2366         boolean_t       check_privs;
2367         znode_t         *xzp;
2368         znode_t         *check_zp = zp;
2369         mode_t          needed_bits;
2370         uid_t           owner;
2371
2372         is_attr = ((zp->z_pflags & ZFS_XATTR) && (ZTOV(zp)->v_type == VDIR));
2373
2374 #ifdef __FreeBSD__
2375         /*
2376          * In FreeBSD, we don't care about permissions of individual ADS.
2377          * Note that not checking them is not just an optimization - without
2378          * this shortcut, EA operations may bogusly fail with EACCES.
2379          */
2380         if (zp->z_pflags & ZFS_XATTR)
2381                 return (0);
2382 #else
2383         /*
2384          * If attribute then validate against base file
2385          */
2386         if (is_attr) {
2387                 uint64_t        parent;
2388
2389                 if ((error = sa_lookup(zp->z_sa_hdl,
2390                     SA_ZPL_PARENT(zp->z_zfsvfs), &parent,
2391                     sizeof (parent))) != 0)
2392                         return (error);
2393
2394                 if ((error = zfs_zget(zp->z_zfsvfs,
2395                     parent, &xzp)) != 0)        {
2396                         return (error);
2397                 }
2398
2399                 check_zp = xzp;
2400
2401                 /*
2402                  * fixup mode to map to xattr perms
2403                  */
2404
2405                 if (mode & (ACE_WRITE_DATA|ACE_APPEND_DATA)) {
2406                         mode &= ~(ACE_WRITE_DATA|ACE_APPEND_DATA);
2407                         mode |= ACE_WRITE_NAMED_ATTRS;
2408                 }
2409
2410                 if (mode & (ACE_READ_DATA|ACE_EXECUTE)) {
2411                         mode &= ~(ACE_READ_DATA|ACE_EXECUTE);
2412                         mode |= ACE_READ_NAMED_ATTRS;
2413                 }
2414         }
2415 #endif
2416
2417         owner = zfs_fuid_map_id(zp->z_zfsvfs, zp->z_uid, cr, ZFS_OWNER);
2418         /*
2419          * Map the bits required to the standard vnode flags VREAD|VWRITE|VEXEC
2420          * in needed_bits.  Map the bits mapped by working_mode (currently
2421          * missing) in missing_bits.
2422          * Call secpolicy_vnode_access2() with (needed_bits & ~checkmode),
2423          * needed_bits.
2424          */
2425         needed_bits = 0;
2426
2427         working_mode = mode;
2428         if ((working_mode & (ACE_READ_ACL|ACE_READ_ATTRIBUTES)) &&
2429             owner == crgetuid(cr))
2430                 working_mode &= ~(ACE_READ_ACL|ACE_READ_ATTRIBUTES);
2431
2432         if (working_mode & (ACE_READ_DATA|ACE_READ_NAMED_ATTRS|
2433             ACE_READ_ACL|ACE_READ_ATTRIBUTES|ACE_SYNCHRONIZE))
2434                 needed_bits |= VREAD;
2435         if (working_mode & (ACE_WRITE_DATA|ACE_WRITE_NAMED_ATTRS|
2436             ACE_APPEND_DATA|ACE_WRITE_ATTRIBUTES|ACE_SYNCHRONIZE))
2437                 needed_bits |= VWRITE;
2438         if (working_mode & ACE_EXECUTE)
2439                 needed_bits |= VEXEC;
2440
2441         if ((error = zfs_zaccess_common(check_zp, mode, &working_mode,
2442             &check_privs, skipaclchk, cr)) == 0) {
2443                 if (is_attr)
2444                         VN_RELE(ZTOV(xzp));
2445                 return (secpolicy_vnode_access2(cr, ZTOV(zp), owner,
2446                     needed_bits, needed_bits));
2447         }
2448
2449         if (error && !check_privs) {
2450                 if (is_attr)
2451                         VN_RELE(ZTOV(xzp));
2452                 return (error);
2453         }
2454
2455         if (error && (flags & V_APPEND)) {
2456                 error = zfs_zaccess_append(zp, &working_mode, &check_privs, cr);
2457         }
2458
2459         if (error && check_privs) {
2460                 mode_t          checkmode = 0;
2461
2462                 /*
2463                  * First check for implicit owner permission on
2464                  * read_acl/read_attributes
2465                  */
2466
2467                 error = 0;
2468                 ASSERT(working_mode != 0);
2469
2470                 if ((working_mode & (ACE_READ_ACL|ACE_READ_ATTRIBUTES) &&
2471                     owner == crgetuid(cr)))
2472                         working_mode &= ~(ACE_READ_ACL|ACE_READ_ATTRIBUTES);
2473
2474                 if (working_mode & (ACE_READ_DATA|ACE_READ_NAMED_ATTRS|
2475                     ACE_READ_ACL|ACE_READ_ATTRIBUTES|ACE_SYNCHRONIZE))
2476                         checkmode |= VREAD;
2477                 if (working_mode & (ACE_WRITE_DATA|ACE_WRITE_NAMED_ATTRS|
2478                     ACE_APPEND_DATA|ACE_WRITE_ATTRIBUTES|ACE_SYNCHRONIZE))
2479                         checkmode |= VWRITE;
2480                 if (working_mode & ACE_EXECUTE)
2481                         checkmode |= VEXEC;
2482
2483                 error = secpolicy_vnode_access2(cr, ZTOV(check_zp), owner,
2484                     needed_bits & ~checkmode, needed_bits);
2485
2486                 if (error == 0 && (working_mode & ACE_WRITE_OWNER))
2487                         error = secpolicy_vnode_chown(ZTOV(check_zp), cr, owner);
2488                 if (error == 0 && (working_mode & ACE_WRITE_ACL))
2489                         error = secpolicy_vnode_setdac(ZTOV(check_zp), cr, owner);
2490
2491                 if (error == 0 && (working_mode &
2492                     (ACE_DELETE|ACE_DELETE_CHILD)))
2493                         error = secpolicy_vnode_remove(ZTOV(check_zp), cr);
2494
2495                 if (error == 0 && (working_mode & ACE_SYNCHRONIZE)) {
2496                         error = secpolicy_vnode_chown(ZTOV(check_zp), cr, owner);
2497                 }
2498                 if (error == 0) {
2499                         /*
2500                          * See if any bits other than those already checked
2501                          * for are still present.  If so then return EACCES
2502                          */
2503                         if (working_mode & ~(ZFS_CHECKED_MASKS)) {
2504                                 error = EACCES;
2505                         }
2506                 }
2507         } else if (error == 0) {
2508                 error = secpolicy_vnode_access2(cr, ZTOV(zp), owner,
2509                     needed_bits, needed_bits);
2510         }
2511
2512
2513         if (is_attr)
2514                 VN_RELE(ZTOV(xzp));
2515
2516         return (error);
2517 }
2518
2519 /*
2520  * Translate traditional unix VREAD/VWRITE/VEXEC mode into
2521  * native ACL format and call zfs_zaccess()
2522  */
2523 int
2524 zfs_zaccess_rwx(znode_t *zp, mode_t mode, int flags, cred_t *cr)
2525 {
2526         return (zfs_zaccess(zp, zfs_unix_to_v4(mode >> 6), flags, B_FALSE, cr));
2527 }
2528
2529 /*
2530  * Access function for secpolicy_vnode_setattr
2531  */
2532 int
2533 zfs_zaccess_unix(znode_t *zp, mode_t mode, cred_t *cr)
2534 {
2535         int v4_mode = zfs_unix_to_v4(mode >> 6);
2536
2537         return (zfs_zaccess(zp, v4_mode, 0, B_FALSE, cr));
2538 }
2539
2540 static int
2541 zfs_delete_final_check(znode_t *zp, znode_t *dzp,
2542     mode_t available_perms, cred_t *cr)
2543 {
2544         int error;
2545         uid_t downer;
2546
2547         downer = zfs_fuid_map_id(dzp->z_zfsvfs, dzp->z_uid, cr, ZFS_OWNER);
2548
2549         error = secpolicy_vnode_access2(cr, ZTOV(dzp),
2550             downer, available_perms, VWRITE|VEXEC);
2551
2552         if (error == 0)
2553                 error = zfs_sticky_remove_access(dzp, zp, cr);
2554
2555         return (error);
2556 }
2557
2558 /*
2559  * Determine whether Access should be granted/deny, without
2560  * consulting least priv subsystem.
2561  *
2562  *
2563  * The following chart is the recommended NFSv4 enforcement for
2564  * ability to delete an object.
2565  *
2566  *      -------------------------------------------------------
2567  *      |   Parent Dir  |           Target Object Permissions |
2568  *      |  permissions  |                                     |
2569  *      -------------------------------------------------------
2570  *      |               | ACL Allows | ACL Denies| Delete     |
2571  *      |               |  Delete    |  Delete   | unspecified|
2572  *      -------------------------------------------------------
2573  *      |  ACL Allows   | Permit     | Permit    | Permit     |
2574  *      |  DELETE_CHILD |                                     |
2575  *      -------------------------------------------------------
2576  *      |  ACL Denies   | Permit     | Deny      | Deny       |
2577  *      |  DELETE_CHILD |            |           |            |
2578  *      -------------------------------------------------------
2579  *      | ACL specifies |            |           |            |
2580  *      | only allow    | Permit     | Permit    | Permit     |
2581  *      | write and     |            |           |            |
2582  *      | execute       |            |           |            |
2583  *      -------------------------------------------------------
2584  *      | ACL denies    |            |           |            |
2585  *      | write and     | Permit     | Deny      | Deny       |
2586  *      | execute       |            |           |            |
2587  *      -------------------------------------------------------
2588  *         ^
2589  *         |
2590  *         No search privilege, can't even look up file?
2591  *
2592  */
2593 int
2594 zfs_zaccess_delete(znode_t *dzp, znode_t *zp, cred_t *cr)
2595 {
2596         uint32_t dzp_working_mode = 0;
2597         uint32_t zp_working_mode = 0;
2598         int dzp_error, zp_error;
2599         mode_t available_perms;
2600         boolean_t dzpcheck_privs = B_TRUE;
2601         boolean_t zpcheck_privs = B_TRUE;
2602
2603         /*
2604          * We want specific DELETE permissions to
2605          * take precedence over WRITE/EXECUTE.  We don't
2606          * want an ACL such as this to mess us up.
2607          * user:joe:write_data:deny,user:joe:delete:allow
2608          *
2609          * However, deny permissions may ultimately be overridden
2610          * by secpolicy_vnode_access().
2611          *
2612          * We will ask for all of the necessary permissions and then
2613          * look at the working modes from the directory and target object
2614          * to determine what was found.
2615          */
2616
2617         if (zp->z_pflags & (ZFS_IMMUTABLE | ZFS_NOUNLINK))
2618                 return (EPERM);
2619
2620         /*
2621          * First row
2622          * If the directory permissions allow the delete, we are done.
2623          */
2624         if ((dzp_error = zfs_zaccess_common(dzp, ACE_DELETE_CHILD,
2625             &dzp_working_mode, &dzpcheck_privs, B_FALSE, cr)) == 0)
2626                 return (0);
2627
2628         /*
2629          * If target object has delete permission then we are done
2630          */
2631         if ((zp_error = zfs_zaccess_common(zp, ACE_DELETE, &zp_working_mode,
2632             &zpcheck_privs, B_FALSE, cr)) == 0)
2633                 return (0);
2634
2635         ASSERT(dzp_error && zp_error);
2636
2637         if (!dzpcheck_privs)
2638                 return (dzp_error);
2639         if (!zpcheck_privs)
2640                 return (zp_error);
2641
2642         /*
2643          * Second row
2644          *
2645          * If directory returns EACCES then delete_child was denied
2646          * due to deny delete_child.  In this case send the request through
2647          * secpolicy_vnode_remove().  We don't use zfs_delete_final_check()
2648          * since that *could* allow the delete based on write/execute permission
2649          * and we want delete permissions to override write/execute.
2650          */
2651
2652         if (dzp_error == EACCES)
2653                 return (secpolicy_vnode_remove(ZTOV(dzp), cr)); /* XXXPJD: s/dzp/zp/ ? */
2654
2655         /*
2656          * Third Row
2657          * only need to see if we have write/execute on directory.
2658          */
2659
2660         dzp_error = zfs_zaccess_common(dzp, ACE_EXECUTE|ACE_WRITE_DATA,
2661             &dzp_working_mode, &dzpcheck_privs, B_FALSE, cr);
2662
2663         if (dzp_error != 0 && !dzpcheck_privs)
2664                 return (dzp_error);
2665
2666         /*
2667          * Fourth row
2668          */
2669
2670         available_perms = (dzp_working_mode & ACE_WRITE_DATA) ? 0 : VWRITE;
2671         available_perms |= (dzp_working_mode & ACE_EXECUTE) ? 0 : VEXEC;
2672
2673         return (zfs_delete_final_check(zp, dzp, available_perms, cr));
2674
2675 }
2676
2677 int
2678 zfs_zaccess_rename(znode_t *sdzp, znode_t *szp, znode_t *tdzp,
2679     znode_t *tzp, cred_t *cr)
2680 {
2681         int add_perm;
2682         int error;
2683
2684         if (szp->z_pflags & ZFS_AV_QUARANTINED)
2685                 return (EACCES);
2686
2687         add_perm = (ZTOV(szp)->v_type == VDIR) ?
2688             ACE_ADD_SUBDIRECTORY : ACE_ADD_FILE;
2689
2690         /*
2691          * Rename permissions are combination of delete permission +
2692          * add file/subdir permission.
2693          *
2694          * BSD operating systems also require write permission
2695          * on the directory being moved from one parent directory
2696          * to another.
2697          */
2698         if (ZTOV(szp)->v_type == VDIR && ZTOV(sdzp) != ZTOV(tdzp)) {
2699                 if (error = zfs_zaccess(szp, ACE_WRITE_DATA, 0, B_FALSE, cr))
2700                         return (error);
2701         }
2702
2703         /*
2704          * first make sure we do the delete portion.
2705          *
2706          * If that succeeds then check for add_file/add_subdir permissions
2707          */
2708
2709         if (error = zfs_zaccess_delete(sdzp, szp, cr))
2710                 return (error);
2711
2712         /*
2713          * If we have a tzp, see if we can delete it?
2714          */
2715         if (tzp) {
2716                 if (error = zfs_zaccess_delete(tdzp, tzp, cr))
2717                         return (error);
2718         }
2719
2720         /*
2721          * Now check for add permissions
2722          */
2723         error = zfs_zaccess(tdzp, add_perm, 0, B_FALSE, cr);
2724
2725         return (error);
2726 }