1da6c28aaSamw /*
2da6c28aaSamw * CDDL HEADER START
3da6c28aaSamw *
4da6c28aaSamw * The contents of this file are subject to the terms of the
5da6c28aaSamw * Common Development and Distribution License (the "License").
6da6c28aaSamw * You may not use this file except in compliance with the License.
7da6c28aaSamw *
8da6c28aaSamw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9da6c28aaSamw * or http://www.opensolaris.org/os/licensing.
10da6c28aaSamw * See the License for the specific language governing permissions
11da6c28aaSamw * and limitations under the License.
12da6c28aaSamw *
13da6c28aaSamw * When distributing Covered Code, include this CDDL HEADER in each
14da6c28aaSamw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15da6c28aaSamw * If applicable, add the following below this CDDL HEADER, with the
16da6c28aaSamw * fields enclosed by brackets "[]" replaced with your own identifying
17da6c28aaSamw * information: Portions Copyright [yyyy] [name of copyright owner]
18da6c28aaSamw *
19da6c28aaSamw * CDDL HEADER END
20da6c28aaSamw */
21da6c28aaSamw /*
22f96bd5c8SAlan Wright * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
23da6c28aaSamw * Use is subject to license terms.
24da6c28aaSamw */
25da6c28aaSamw
26da6c28aaSamw /*
27da6c28aaSamw * This module provides Security Descriptor handling functions.
28da6c28aaSamw */
29da6c28aaSamw
3055bf511dSas200622 #include <smbsrv/smb_kproto.h>
31da6c28aaSamw #include <smbsrv/smb_fsops.h>
32da6c28aaSamw #include <smbsrv/smb_idmap.h>
33da6c28aaSamw
3455bf511dSas200622 static void smb_sd_set_sacl(smb_sd_t *, smb_acl_t *, boolean_t, int);
3555bf511dSas200622 static void smb_sd_set_dacl(smb_sd_t *, smb_acl_t *, boolean_t, int);
3655bf511dSas200622 static uint32_t smb_sd_fromfs(smb_fssd_t *, smb_sd_t *);
37da6c28aaSamw
38da6c28aaSamw void
smb_sd_init(smb_sd_t * sd,uint8_t revision)39da6c28aaSamw smb_sd_init(smb_sd_t *sd, uint8_t revision)
40da6c28aaSamw {
41da6c28aaSamw bzero(sd, sizeof (smb_sd_t));
4255bf511dSas200622 sd->sd_revision = revision;
43da6c28aaSamw }
44da6c28aaSamw
45da6c28aaSamw /*
46da6c28aaSamw * smb_sd_term
47da6c28aaSamw *
48da6c28aaSamw * Free non-NULL members of 'sd' which has to be in
49da6c28aaSamw * absolute (pointer) form.
50da6c28aaSamw */
51da6c28aaSamw void
smb_sd_term(smb_sd_t * sd)52da6c28aaSamw smb_sd_term(smb_sd_t *sd)
53da6c28aaSamw {
54da6c28aaSamw ASSERT(sd);
5555bf511dSas200622 ASSERT((sd->sd_control & SE_SELF_RELATIVE) == 0);
56da6c28aaSamw
576537f381Sas200622 smb_sid_free(sd->sd_owner);
586537f381Sas200622 smb_sid_free(sd->sd_group);
5955bf511dSas200622 smb_acl_free(sd->sd_dacl);
6055bf511dSas200622 smb_acl_free(sd->sd_sacl);
61da6c28aaSamw
62da6c28aaSamw bzero(sd, sizeof (smb_sd_t));
63da6c28aaSamw }
64da6c28aaSamw
65da6c28aaSamw uint32_t
smb_sd_len(smb_sd_t * sd,uint32_t secinfo)6655bf511dSas200622 smb_sd_len(smb_sd_t *sd, uint32_t secinfo)
67da6c28aaSamw {
6855bf511dSas200622 uint32_t length = SMB_SD_HDRSIZE;
69da6c28aaSamw
7055bf511dSas200622 if (secinfo & SMB_OWNER_SECINFO)
716537f381Sas200622 length += smb_sid_len(sd->sd_owner);
72da6c28aaSamw
7355bf511dSas200622 if (secinfo & SMB_GROUP_SECINFO)
746537f381Sas200622 length += smb_sid_len(sd->sd_group);
75da6c28aaSamw
7655bf511dSas200622 if (secinfo & SMB_DACL_SECINFO)
7755bf511dSas200622 length += smb_acl_len(sd->sd_dacl);
78da6c28aaSamw
7955bf511dSas200622 if (secinfo & SMB_SACL_SECINFO)
8055bf511dSas200622 length += smb_acl_len(sd->sd_sacl);
81da6c28aaSamw
82da6c28aaSamw return (length);
83da6c28aaSamw }
84da6c28aaSamw
85da6c28aaSamw /*
86da6c28aaSamw * smb_sd_get_secinfo
87da6c28aaSamw *
88da6c28aaSamw * Return the security information mask for the specified security
89da6c28aaSamw * descriptor.
90da6c28aaSamw */
91da6c28aaSamw uint32_t
smb_sd_get_secinfo(smb_sd_t * sd)9255bf511dSas200622 smb_sd_get_secinfo(smb_sd_t *sd)
93da6c28aaSamw {
94da6c28aaSamw uint32_t sec_info = 0;
95da6c28aaSamw
9655bf511dSas200622 if (sd == NULL)
97da6c28aaSamw return (0);
98da6c28aaSamw
9955bf511dSas200622 if (sd->sd_owner)
100da6c28aaSamw sec_info |= SMB_OWNER_SECINFO;
101da6c28aaSamw
10255bf511dSas200622 if (sd->sd_group)
103da6c28aaSamw sec_info |= SMB_GROUP_SECINFO;
104da6c28aaSamw
10555bf511dSas200622 if (sd->sd_dacl)
106da6c28aaSamw sec_info |= SMB_DACL_SECINFO;
107da6c28aaSamw
10855bf511dSas200622 if (sd->sd_sacl)
109da6c28aaSamw sec_info |= SMB_SACL_SECINFO;
110da6c28aaSamw
111da6c28aaSamw return (sec_info);
112da6c28aaSamw }
113da6c28aaSamw
114da6c28aaSamw /*
11555bf511dSas200622 * smb_sd_read
116da6c28aaSamw *
11755bf511dSas200622 * Read uid, gid and ACL from filesystem. The returned ACL from read
11855bf511dSas200622 * routine is always in ZFS format. Convert the ZFS acl to a Win acl
11955bf511dSas200622 * and return the Win SD in absolute form.
120da6c28aaSamw *
12155bf511dSas200622 * NOTE: upon successful return caller MUST free the memory allocated
12255bf511dSas200622 * for the returned SD by calling smb_sd_term().
123da6c28aaSamw */
12455bf511dSas200622 uint32_t
smb_sd_read(smb_request_t * sr,smb_sd_t * sd,uint32_t secinfo)12555bf511dSas200622 smb_sd_read(smb_request_t *sr, smb_sd_t *sd, uint32_t secinfo)
126da6c28aaSamw {
12755bf511dSas200622 smb_fssd_t fs_sd;
12855bf511dSas200622 smb_error_t smb_err;
12955bf511dSas200622 smb_node_t *node;
130da6c28aaSamw uint32_t status = NT_STATUS_SUCCESS;
13155bf511dSas200622 uint32_t sd_flags;
13255bf511dSas200622 int error;
133da6c28aaSamw
13455bf511dSas200622 node = sr->fid_ofile->f_node;
135*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sd_flags = smb_node_is_dir(node) ? SMB_FSSD_FLAGS_DIR : 0;
13655bf511dSas200622 smb_fssd_init(&fs_sd, secinfo, sd_flags);
137da6c28aaSamw
13855bf511dSas200622 error = smb_fsop_sdread(sr, sr->user_cr, node, &fs_sd);
13955bf511dSas200622 if (error) {
140dc20a302Sas200622 smbsr_map_errno(error, &smb_err);
14155bf511dSas200622 return (smb_err.status);
142da6c28aaSamw }
143da6c28aaSamw
14455bf511dSas200622 status = smb_sd_fromfs(&fs_sd, sd);
14555bf511dSas200622 smb_fssd_term(&fs_sd);
146da6c28aaSamw
147da6c28aaSamw return (status);
148da6c28aaSamw }
149da6c28aaSamw
150da6c28aaSamw /*
15155bf511dSas200622 * smb_sd_write
15255bf511dSas200622 *
15355bf511dSas200622 * Takes a Win SD in absolute form, converts it to
15455bf511dSas200622 * ZFS format and write it to filesystem. The write routine
15555bf511dSas200622 * converts ZFS acl to Posix acl if required.
15655bf511dSas200622 */
15755bf511dSas200622 uint32_t
smb_sd_write(smb_request_t * sr,smb_sd_t * sd,uint32_t secinfo)15855bf511dSas200622 smb_sd_write(smb_request_t *sr, smb_sd_t *sd, uint32_t secinfo)
15955bf511dSas200622 {
16055bf511dSas200622 smb_node_t *node;
16155bf511dSas200622 smb_fssd_t fs_sd;
16255bf511dSas200622 smb_error_t smb_err;
16355bf511dSas200622 uint32_t status;
16455bf511dSas200622 uint32_t sd_flags;
16555bf511dSas200622 int error;
16655bf511dSas200622
16755bf511dSas200622 node = sr->fid_ofile->f_node;
168*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sd_flags = smb_node_is_dir(node) ? SMB_FSSD_FLAGS_DIR : 0;
16955bf511dSas200622 smb_fssd_init(&fs_sd, secinfo, sd_flags);
17055bf511dSas200622
17155bf511dSas200622 status = smb_sd_tofs(sd, &fs_sd);
17255bf511dSas200622 if (status != NT_STATUS_SUCCESS) {
17355bf511dSas200622 smb_fssd_term(&fs_sd);
17455bf511dSas200622 return (status);
17555bf511dSas200622 }
17655bf511dSas200622
17755bf511dSas200622 error = smb_fsop_sdwrite(sr, sr->user_cr, node, &fs_sd, 0);
17855bf511dSas200622 smb_fssd_term(&fs_sd);
17955bf511dSas200622
18055bf511dSas200622 if (error) {
1812c1b14e5Sjose borrego if (error == EBADE)
1822c1b14e5Sjose borrego return (NT_STATUS_INVALID_OWNER);
183dc20a302Sas200622 smbsr_map_errno(error, &smb_err);
18455bf511dSas200622 return (smb_err.status);
18555bf511dSas200622 }
18655bf511dSas200622
18755bf511dSas200622 return (NT_STATUS_SUCCESS);
18855bf511dSas200622 }
18955bf511dSas200622
19055bf511dSas200622
19155bf511dSas200622 /*
192da6c28aaSamw * smb_sd_tofs
193da6c28aaSamw *
194da6c28aaSamw * Creates a filesystem security structure based on the given
195da6c28aaSamw * Windows security descriptor.
196da6c28aaSamw */
197da6c28aaSamw uint32_t
smb_sd_tofs(smb_sd_t * sd,smb_fssd_t * fs_sd)19855bf511dSas200622 smb_sd_tofs(smb_sd_t *sd, smb_fssd_t *fs_sd)
199da6c28aaSamw {
2006537f381Sas200622 smb_sid_t *sid;
201da6c28aaSamw uint32_t status = NT_STATUS_SUCCESS;
202da6c28aaSamw uint16_t sd_control;
203da6c28aaSamw idmap_stat idm_stat;
204da6c28aaSamw int idtype;
205da6c28aaSamw int flags = 0;
206da6c28aaSamw
20755bf511dSas200622 sd_control = sd->sd_control;
208da6c28aaSamw
209da6c28aaSamw /*
210da6c28aaSamw * ZFS only has one set of flags so for now only
211da6c28aaSamw * Windows DACL flags are taken into account.
212da6c28aaSamw */
213da6c28aaSamw if (sd_control & SE_DACL_DEFAULTED)
214da6c28aaSamw flags |= ACL_DEFAULTED;
215da6c28aaSamw if (sd_control & SE_DACL_AUTO_INHERITED)
216da6c28aaSamw flags |= ACL_AUTO_INHERIT;
217da6c28aaSamw if (sd_control & SE_DACL_PROTECTED)
218da6c28aaSamw flags |= ACL_PROTECTED;
219da6c28aaSamw
220da6c28aaSamw if (fs_sd->sd_flags & SMB_FSSD_FLAGS_DIR)
221da6c28aaSamw flags |= ACL_IS_DIR;
222da6c28aaSamw
223da6c28aaSamw /* Owner */
224da6c28aaSamw if (fs_sd->sd_secinfo & SMB_OWNER_SECINFO) {
22555bf511dSas200622 sid = sd->sd_owner;
2266537f381Sas200622 if (!smb_sid_isvalid(sid))
227da6c28aaSamw return (NT_STATUS_INVALID_SID);
228da6c28aaSamw
2292c1b14e5Sjose borrego idtype = SMB_IDMAP_USER;
230da6c28aaSamw idm_stat = smb_idmap_getid(sid, &fs_sd->sd_uid, &idtype);
231da6c28aaSamw if (idm_stat != IDMAP_SUCCESS) {
232da6c28aaSamw return (NT_STATUS_NONE_MAPPED);
233da6c28aaSamw }
234da6c28aaSamw }
235da6c28aaSamw
236da6c28aaSamw /* Group */
237da6c28aaSamw if (fs_sd->sd_secinfo & SMB_GROUP_SECINFO) {
23855bf511dSas200622 sid = sd->sd_group;
2396537f381Sas200622 if (!smb_sid_isvalid(sid))
240da6c28aaSamw return (NT_STATUS_INVALID_SID);
241da6c28aaSamw
2422c1b14e5Sjose borrego idtype = SMB_IDMAP_GROUP;
243da6c28aaSamw idm_stat = smb_idmap_getid(sid, &fs_sd->sd_gid, &idtype);
244da6c28aaSamw if (idm_stat != IDMAP_SUCCESS) {
245da6c28aaSamw return (NT_STATUS_NONE_MAPPED);
246da6c28aaSamw }
247da6c28aaSamw }
248da6c28aaSamw
249da6c28aaSamw /* DACL */
250da6c28aaSamw if (fs_sd->sd_secinfo & SMB_DACL_SECINFO) {
25155bf511dSas200622 if (sd->sd_control & SE_DACL_PRESENT) {
25255bf511dSas200622 status = smb_acl_to_zfs(sd->sd_dacl, flags,
253da6c28aaSamw SMB_DACL_SECINFO, &fs_sd->sd_zdacl);
254da6c28aaSamw if (status != NT_STATUS_SUCCESS)
255da6c28aaSamw return (status);
256da6c28aaSamw }
257da6c28aaSamw else
258da6c28aaSamw return (NT_STATUS_INVALID_ACL);
259da6c28aaSamw }
260da6c28aaSamw
261da6c28aaSamw /* SACL */
262da6c28aaSamw if (fs_sd->sd_secinfo & SMB_SACL_SECINFO) {
26355bf511dSas200622 if (sd->sd_control & SE_SACL_PRESENT) {
26455bf511dSas200622 status = smb_acl_to_zfs(sd->sd_sacl, flags,
265da6c28aaSamw SMB_SACL_SECINFO, &fs_sd->sd_zsacl);
266da6c28aaSamw if (status != NT_STATUS_SUCCESS) {
267da6c28aaSamw return (status);
268da6c28aaSamw }
269da6c28aaSamw } else {
270da6c28aaSamw return (NT_STATUS_INVALID_ACL);
271da6c28aaSamw }
272da6c28aaSamw }
273da6c28aaSamw
274da6c28aaSamw return (status);
275da6c28aaSamw }
276da6c28aaSamw
277da6c28aaSamw /*
27855bf511dSas200622 * smb_sd_fromfs
279da6c28aaSamw *
28055bf511dSas200622 * Makes an Windows style security descriptor in absolute form
28155bf511dSas200622 * based on the given filesystem security information.
282da6c28aaSamw *
28355bf511dSas200622 * Should call smb_sd_term() for the returned sd to free allocated
28455bf511dSas200622 * members.
285da6c28aaSamw */
28655bf511dSas200622 static uint32_t
smb_sd_fromfs(smb_fssd_t * fs_sd,smb_sd_t * sd)28755bf511dSas200622 smb_sd_fromfs(smb_fssd_t *fs_sd, smb_sd_t *sd)
288da6c28aaSamw {
289da6c28aaSamw uint32_t status = NT_STATUS_SUCCESS;
29055bf511dSas200622 smb_acl_t *acl = NULL;
2916537f381Sas200622 smb_sid_t *sid;
29255bf511dSas200622 idmap_stat idm_stat;
293da6c28aaSamw
29455bf511dSas200622 ASSERT(fs_sd);
29555bf511dSas200622 ASSERT(sd);
296da6c28aaSamw
29755bf511dSas200622 smb_sd_init(sd, SECURITY_DESCRIPTOR_REVISION);
298da6c28aaSamw
29955bf511dSas200622 /* Owner */
30055bf511dSas200622 if (fs_sd->sd_secinfo & SMB_OWNER_SECINFO) {
30155bf511dSas200622 idm_stat = smb_idmap_getsid(fs_sd->sd_uid,
30255bf511dSas200622 SMB_IDMAP_USER, &sid);
303da6c28aaSamw
30455bf511dSas200622 if (idm_stat != IDMAP_SUCCESS) {
30555bf511dSas200622 smb_sd_term(sd);
30655bf511dSas200622 return (NT_STATUS_NONE_MAPPED);
307da6c28aaSamw }
308da6c28aaSamw
30955bf511dSas200622 sd->sd_owner = sid;
31055bf511dSas200622 }
31155bf511dSas200622
31255bf511dSas200622 /* Group */
31355bf511dSas200622 if (fs_sd->sd_secinfo & SMB_GROUP_SECINFO) {
31455bf511dSas200622 idm_stat = smb_idmap_getsid(fs_sd->sd_gid,
31555bf511dSas200622 SMB_IDMAP_GROUP, &sid);
31655bf511dSas200622
31755bf511dSas200622 if (idm_stat != IDMAP_SUCCESS) {
31855bf511dSas200622 smb_sd_term(sd);
31955bf511dSas200622 return (NT_STATUS_NONE_MAPPED);
32055bf511dSas200622 }
32155bf511dSas200622
32255bf511dSas200622 sd->sd_group = sid;
32355bf511dSas200622 }
32455bf511dSas200622
32555bf511dSas200622 /* DACL */
32655bf511dSas200622 if (fs_sd->sd_secinfo & SMB_DACL_SECINFO) {
32755bf511dSas200622 if (fs_sd->sd_zdacl != NULL) {
328f96bd5c8SAlan Wright acl = smb_acl_from_zfs(fs_sd->sd_zdacl);
32955bf511dSas200622 if (acl == NULL) {
33055bf511dSas200622 smb_sd_term(sd);
33155bf511dSas200622 return (NT_STATUS_INTERNAL_ERROR);
33255bf511dSas200622 }
33355bf511dSas200622
334da6c28aaSamw /*
33555bf511dSas200622 * Need to sort the ACL before send it to Windows
33655bf511dSas200622 * clients. Winodws GUI is sensitive about the order
33755bf511dSas200622 * of ACEs.
338da6c28aaSamw */
33955bf511dSas200622 smb_acl_sort(acl);
34055bf511dSas200622 smb_sd_set_dacl(sd, acl, B_TRUE,
34155bf511dSas200622 fs_sd->sd_zdacl->acl_flags);
34255bf511dSas200622 } else {
34355bf511dSas200622 smb_sd_set_dacl(sd, NULL, B_FALSE, 0);
34455bf511dSas200622 }
345da6c28aaSamw }
346da6c28aaSamw
34755bf511dSas200622 /* SACL */
34855bf511dSas200622 if (fs_sd->sd_secinfo & SMB_SACL_SECINFO) {
34955bf511dSas200622 if (fs_sd->sd_zsacl != NULL) {
350f96bd5c8SAlan Wright acl = smb_acl_from_zfs(fs_sd->sd_zsacl);
35155bf511dSas200622 if (acl == NULL) {
35255bf511dSas200622 smb_sd_term(sd);
35355bf511dSas200622 return (NT_STATUS_INTERNAL_ERROR);
354da6c28aaSamw }
355da6c28aaSamw
35655bf511dSas200622 smb_sd_set_sacl(sd, acl, B_TRUE,
35755bf511dSas200622 fs_sd->sd_zsacl->acl_flags);
35855bf511dSas200622 } else {
35955bf511dSas200622 smb_sd_set_sacl(sd, NULL, B_FALSE, 0);
36055bf511dSas200622 }
361da6c28aaSamw }
362da6c28aaSamw
36355bf511dSas200622 return (status);
36455bf511dSas200622 }
36555bf511dSas200622
36655bf511dSas200622 static void
smb_sd_set_dacl(smb_sd_t * sd,smb_acl_t * acl,boolean_t present,int flags)36755bf511dSas200622 smb_sd_set_dacl(smb_sd_t *sd, smb_acl_t *acl, boolean_t present, int flags)
36855bf511dSas200622 {
36955bf511dSas200622 ASSERT((sd->sd_control & SE_SELF_RELATIVE) == 0);
37055bf511dSas200622
37155bf511dSas200622 sd->sd_dacl = acl;
37255bf511dSas200622
37355bf511dSas200622 if (flags & ACL_DEFAULTED)
37455bf511dSas200622 sd->sd_control |= SE_DACL_DEFAULTED;
37555bf511dSas200622 if (flags & ACL_AUTO_INHERIT)
37655bf511dSas200622 sd->sd_control |= SE_DACL_AUTO_INHERITED;
37755bf511dSas200622 if (flags & ACL_PROTECTED)
37855bf511dSas200622 sd->sd_control |= SE_DACL_PROTECTED;
37955bf511dSas200622
38055bf511dSas200622 if (present)
38155bf511dSas200622 sd->sd_control |= SE_DACL_PRESENT;
38255bf511dSas200622 }
38355bf511dSas200622
38455bf511dSas200622 static void
smb_sd_set_sacl(smb_sd_t * sd,smb_acl_t * acl,boolean_t present,int flags)38555bf511dSas200622 smb_sd_set_sacl(smb_sd_t *sd, smb_acl_t *acl, boolean_t present, int flags)
38655bf511dSas200622 {
38755bf511dSas200622 ASSERT((sd->sd_control & SE_SELF_RELATIVE) == 0);
38855bf511dSas200622
38955bf511dSas200622 sd->sd_sacl = acl;
39055bf511dSas200622
39155bf511dSas200622 if (flags & ACL_DEFAULTED)
39255bf511dSas200622 sd->sd_control |= SE_SACL_DEFAULTED;
39355bf511dSas200622 if (flags & ACL_AUTO_INHERIT)
39455bf511dSas200622 sd->sd_control |= SE_SACL_AUTO_INHERITED;
39555bf511dSas200622 if (flags & ACL_PROTECTED)
39655bf511dSas200622 sd->sd_control |= SE_SACL_PROTECTED;
39755bf511dSas200622
39855bf511dSas200622 if (present)
39955bf511dSas200622 sd->sd_control |= SE_SACL_PRESENT;
40055bf511dSas200622 }
40155bf511dSas200622
40255bf511dSas200622 /*
40355bf511dSas200622 * smb_fssd_init
40455bf511dSas200622 *
40555bf511dSas200622 * Initializes the given FS SD structure.
40655bf511dSas200622 */
40755bf511dSas200622 void
smb_fssd_init(smb_fssd_t * fs_sd,uint32_t secinfo,uint32_t flags)40855bf511dSas200622 smb_fssd_init(smb_fssd_t *fs_sd, uint32_t secinfo, uint32_t flags)
40955bf511dSas200622 {
41055bf511dSas200622 bzero(fs_sd, sizeof (smb_fssd_t));
41155bf511dSas200622 fs_sd->sd_secinfo = secinfo;
41255bf511dSas200622 fs_sd->sd_flags = flags;
41355bf511dSas200622 }
41455bf511dSas200622
41555bf511dSas200622 /*
41655bf511dSas200622 * smb_fssd_term
41755bf511dSas200622 *
41855bf511dSas200622 * Frees allocated memory for acl fields.
41955bf511dSas200622 */
42055bf511dSas200622 void
smb_fssd_term(smb_fssd_t * fs_sd)42155bf511dSas200622 smb_fssd_term(smb_fssd_t *fs_sd)
42255bf511dSas200622 {
42355bf511dSas200622 ASSERT(fs_sd);
42455bf511dSas200622
42555bf511dSas200622 smb_fsacl_free(fs_sd->sd_zdacl);
42655bf511dSas200622 smb_fsacl_free(fs_sd->sd_zsacl);
42755bf511dSas200622 bzero(fs_sd, sizeof (smb_fssd_t));
428da6c28aaSamw }
429