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