xref: /linux/fs/smb/server/smbacl.c (revision cbae17630954cb89f2bdf5bbadfd3aa81ea67283)
1 // SPDX-License-Identifier: LGPL-2.1+
2 /*
3  *   Copyright (C) International Business Machines  Corp., 2007,2008
4  *   Author(s): Steve French (sfrench@us.ibm.com)
5  *   Copyright (C) 2020 Samsung Electronics Co., Ltd.
6  *   Author(s): Namjae Jeon <linkinjeon@kernel.org>
7  */
8 
9 #include <linux/fs.h>
10 #include <linux/slab.h>
11 #include <linux/string.h>
12 #include <linux/mnt_idmapping.h>
13 
14 #include "smbacl.h"
15 #include "smb_common.h"
16 #include "server.h"
17 #include "misc.h"
18 #include "mgmt/share_config.h"
19 
20 static const struct smb_sid domain = {1, 4, {0, 0, 0, 0, 0, 5},
21 	{cpu_to_le32(21), cpu_to_le32(1), cpu_to_le32(2), cpu_to_le32(3),
22 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} };
23 
24 /* security id for everyone/world system group */
25 static const struct smb_sid creator_owner = {
26 	1, 1, {0, 0, 0, 0, 0, 3}, {0} };
27 /* security id for everyone/world system group */
28 static const struct smb_sid creator_group = {
29 	1, 1, {0, 0, 0, 0, 0, 3}, {cpu_to_le32(1)} };
30 
31 /* security id for everyone/world system group */
32 static const struct smb_sid sid_everyone = {
33 	1, 1, {0, 0, 0, 0, 0, 1}, {0} };
34 /* security id for Authenticated Users system group */
35 static const struct smb_sid sid_authusers = {
36 	1, 1, {0, 0, 0, 0, 0, 5}, {cpu_to_le32(11)} };
37 
38 /* S-1-22-1 Unmapped Unix users */
39 static const struct smb_sid sid_unix_users = {1, 1, {0, 0, 0, 0, 0, 22},
40 		{cpu_to_le32(1), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} };
41 
42 /* S-1-22-2 Unmapped Unix groups */
43 static const struct smb_sid sid_unix_groups = { 1, 1, {0, 0, 0, 0, 0, 22},
44 		{cpu_to_le32(2), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} };
45 
46 /*
47  * See http://technet.microsoft.com/en-us/library/hh509017(v=ws.10).aspx
48  */
49 
50 /* S-1-5-88 MS NFS and Apple style UID/GID/mode */
51 
52 /* S-1-5-88-1 Unix uid */
53 static const struct smb_sid sid_unix_NFS_users = { 1, 2, {0, 0, 0, 0, 0, 5},
54 	{cpu_to_le32(88),
55 	 cpu_to_le32(1), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} };
56 
57 /* S-1-5-88-2 Unix gid */
58 static const struct smb_sid sid_unix_NFS_groups = { 1, 2, {0, 0, 0, 0, 0, 5},
59 	{cpu_to_le32(88),
60 	 cpu_to_le32(2), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} };
61 
62 /* S-1-5-88-3 Unix mode */
63 static const struct smb_sid sid_unix_NFS_mode = { 1, 2, {0, 0, 0, 0, 0, 5},
64 	{cpu_to_le32(88),
65 	 cpu_to_le32(3), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} };
66 
67 /*
68  * if the two SIDs (roughly equivalent to a UUID for a user or group) are
69  * the same returns zero, if they do not match returns non-zero.
70  */
71 int compare_sids(const struct smb_sid *ctsid, const struct smb_sid *cwsid)
72 {
73 	int i;
74 	int num_subauth, num_sat, num_saw;
75 
76 	if (!ctsid || !cwsid)
77 		return 1;
78 
79 	/* compare the revision */
80 	if (ctsid->revision != cwsid->revision) {
81 		if (ctsid->revision > cwsid->revision)
82 			return 1;
83 		else
84 			return -1;
85 	}
86 
87 	/* compare all of the six auth values */
88 	for (i = 0; i < NUM_AUTHS; ++i) {
89 		if (ctsid->authority[i] != cwsid->authority[i]) {
90 			if (ctsid->authority[i] > cwsid->authority[i])
91 				return 1;
92 			else
93 				return -1;
94 		}
95 	}
96 
97 	/* compare all of the subauth values if any */
98 	num_sat = ctsid->num_subauth;
99 	num_saw = cwsid->num_subauth;
100 	num_subauth = min(num_sat, num_saw);
101 	if (num_subauth) {
102 		for (i = 0; i < num_subauth; ++i) {
103 			if (ctsid->sub_auth[i] != cwsid->sub_auth[i]) {
104 				if (le32_to_cpu(ctsid->sub_auth[i]) >
105 				    le32_to_cpu(cwsid->sub_auth[i]))
106 					return 1;
107 				else
108 					return -1;
109 			}
110 		}
111 	}
112 
113 	return 0; /* sids compare/match */
114 }
115 
116 static void smb_copy_sid(struct smb_sid *dst, const struct smb_sid *src)
117 {
118 	int i;
119 
120 	dst->revision = src->revision;
121 	dst->num_subauth = min_t(u8, src->num_subauth, SID_MAX_SUB_AUTHORITIES);
122 	for (i = 0; i < NUM_AUTHS; ++i)
123 		dst->authority[i] = src->authority[i];
124 	for (i = 0; i < dst->num_subauth; ++i)
125 		dst->sub_auth[i] = src->sub_auth[i];
126 }
127 
128 /*
129  * change posix mode to reflect permissions
130  * pmode is the existing mode (we only want to overwrite part of this
131  * bits to set can be: S_IRWXU, S_IRWXG or S_IRWXO ie 00700 or 00070 or 00007
132  */
133 static umode_t access_flags_to_mode(struct smb_fattr *fattr, __le32 ace_flags,
134 				    int type)
135 {
136 	__u32 flags = le32_to_cpu(ace_flags);
137 	umode_t mode = 0;
138 
139 	if (flags & GENERIC_ALL) {
140 		mode = 0777;
141 		ksmbd_debug(SMB, "all perms\n");
142 		return mode;
143 	}
144 
145 	if ((flags & GENERIC_READ) || (flags & FILE_READ_RIGHTS))
146 		mode = 0444;
147 	if ((flags & GENERIC_WRITE) || (flags & FILE_WRITE_RIGHTS)) {
148 		mode |= 0222;
149 		if (S_ISDIR(fattr->cf_mode))
150 			mode |= 0111;
151 	}
152 	if ((flags & GENERIC_EXECUTE) || (flags & FILE_EXEC_RIGHTS))
153 		mode |= 0111;
154 
155 	if (type == ACCESS_DENIED_ACE_TYPE || type == ACCESS_DENIED_OBJECT_ACE_TYPE)
156 		mode = ~mode;
157 
158 	ksmbd_debug(SMB, "access flags 0x%x mode now %04o\n", flags, mode);
159 
160 	return mode;
161 }
162 
163 /*
164  * Generate access flags to reflect permissions mode is the existing mode.
165  * This function is called for every ACE in the DACL whose SID matches
166  * with either owner or group or everyone.
167  */
168 static void mode_to_access_flags(umode_t mode, umode_t bits_to_use,
169 				 __u32 *pace_flags)
170 {
171 	/* reset access mask */
172 	*pace_flags = 0x0;
173 
174 	/* bits to use are either S_IRWXU or S_IRWXG or S_IRWXO */
175 	mode &= bits_to_use;
176 
177 	/*
178 	 * check for R/W/X UGO since we do not know whose flags
179 	 * is this but we have cleared all the bits sans RWX for
180 	 * either user or group or other as per bits_to_use
181 	 */
182 	if (mode & 0444)
183 		*pace_flags |= SET_FILE_READ_RIGHTS;
184 	if (mode & 0222)
185 		*pace_flags |= FILE_WRITE_RIGHTS;
186 	if (mode & 0111)
187 		*pace_flags |= SET_FILE_EXEC_RIGHTS;
188 
189 	ksmbd_debug(SMB, "mode: %o, access flags now 0x%x\n",
190 		    mode, *pace_flags);
191 }
192 
193 static __u16 fill_ace_for_sid(struct smb_ace *pntace,
194 			      const struct smb_sid *psid, int type, int flags,
195 			      umode_t mode, umode_t bits)
196 {
197 	int i;
198 	__u16 size = 0;
199 	__u32 access_req = 0;
200 
201 	pntace->type = type;
202 	pntace->flags = flags;
203 	mode_to_access_flags(mode, bits, &access_req);
204 	if (!access_req)
205 		access_req = SET_MINIMUM_RIGHTS;
206 	pntace->access_req = cpu_to_le32(access_req);
207 
208 	pntace->sid.revision = psid->revision;
209 	pntace->sid.num_subauth = psid->num_subauth;
210 	for (i = 0; i < NUM_AUTHS; i++)
211 		pntace->sid.authority[i] = psid->authority[i];
212 	for (i = 0; i < psid->num_subauth; i++)
213 		pntace->sid.sub_auth[i] = psid->sub_auth[i];
214 
215 	size = 1 + 1 + 2 + 4 + 1 + 1 + 6 + (psid->num_subauth * 4);
216 	pntace->size = cpu_to_le16(size);
217 
218 	return size;
219 }
220 
221 void id_to_sid(unsigned int cid, uint sidtype, struct smb_sid *ssid)
222 {
223 	switch (sidtype) {
224 	case SIDOWNER:
225 		smb_copy_sid(ssid, &server_conf.domain_sid);
226 		break;
227 	case SIDUNIX_USER:
228 		smb_copy_sid(ssid, &sid_unix_users);
229 		break;
230 	case SIDUNIX_GROUP:
231 		smb_copy_sid(ssid, &sid_unix_groups);
232 		break;
233 	case SIDCREATOR_OWNER:
234 		smb_copy_sid(ssid, &creator_owner);
235 		return;
236 	case SIDCREATOR_GROUP:
237 		smb_copy_sid(ssid, &creator_group);
238 		return;
239 	case SIDNFS_USER:
240 		smb_copy_sid(ssid, &sid_unix_NFS_users);
241 		break;
242 	case SIDNFS_GROUP:
243 		smb_copy_sid(ssid, &sid_unix_NFS_groups);
244 		break;
245 	case SIDNFS_MODE:
246 		smb_copy_sid(ssid, &sid_unix_NFS_mode);
247 		break;
248 	default:
249 		return;
250 	}
251 
252 	/* RID */
253 	ssid->sub_auth[ssid->num_subauth] = cpu_to_le32(cid);
254 	ssid->num_subauth++;
255 }
256 
257 static int sid_to_id(struct mnt_idmap *idmap,
258 		     struct smb_sid *psid, uint sidtype,
259 		     struct smb_fattr *fattr)
260 {
261 	const struct smb_sid *sid_prefix;
262 	int rc = -EINVAL;
263 
264 	/*
265 	 * If we have too many subauthorities, then something is really wrong.
266 	 * Just return an error.
267 	 */
268 	if (unlikely(psid->num_subauth > SID_MAX_SUB_AUTHORITIES)) {
269 		pr_err("%s: %u subauthorities is too many!\n",
270 		       __func__, psid->num_subauth);
271 		return -EIO;
272 	}
273 
274 	if (psid->num_subauth == 0) {
275 		pr_err("%s: zero subauthorities!\n", __func__);
276 		return -EIO;
277 	}
278 
279 	if (sidtype == SIDOWNER) {
280 		kuid_t uid;
281 		uid_t id;
282 
283 		/* Only the server domain RID has a local uid representation. */
284 		sid_prefix = &server_conf.domain_sid;
285 		if (psid->num_subauth != sid_prefix->num_subauth + 1 ||
286 		    compare_sids(psid, sid_prefix))
287 			return -EINVAL;
288 
289 		id = le32_to_cpu(psid->sub_auth[psid->num_subauth - 1]);
290 		uid = KUIDT_INIT(id);
291 		uid = from_vfsuid(idmap, &init_user_ns, VFSUIDT_INIT(uid));
292 		if (uid_valid(uid)) {
293 			fattr->cf_uid = uid;
294 			rc = 0;
295 		}
296 	} else {
297 		kgid_t gid;
298 		gid_t id;
299 
300 		/* Local gids are represented by S-1-22-2-<gid>. */
301 		sid_prefix = &sid_unix_groups;
302 		if (psid->num_subauth != sid_prefix->num_subauth + 1 ||
303 		    compare_sids(psid, sid_prefix))
304 			return -EINVAL;
305 
306 		id = le32_to_cpu(psid->sub_auth[psid->num_subauth - 1]);
307 		gid = KGIDT_INIT(id);
308 		gid = from_vfsgid(idmap, &init_user_ns, VFSGIDT_INIT(gid));
309 		if (gid_valid(gid)) {
310 			fattr->cf_gid = gid;
311 			rc = 0;
312 		}
313 	}
314 
315 	return rc;
316 }
317 
318 void posix_state_to_acl(struct posix_acl_state *state,
319 			struct posix_acl_entry *pace)
320 {
321 	int i;
322 
323 	pace->e_tag = ACL_USER_OBJ;
324 	pace->e_perm = state->owner.allow;
325 	for (i = 0; i < state->users->n; i++) {
326 		pace++;
327 		pace->e_tag = ACL_USER;
328 		pace->e_uid = state->users->aces[i].uid;
329 		pace->e_perm = state->users->aces[i].perms.allow;
330 	}
331 
332 	pace++;
333 	pace->e_tag = ACL_GROUP_OBJ;
334 	pace->e_perm = state->group.allow;
335 
336 	for (i = 0; i < state->groups->n; i++) {
337 		pace++;
338 		pace->e_tag = ACL_GROUP;
339 		pace->e_gid = state->groups->aces[i].gid;
340 		pace->e_perm = state->groups->aces[i].perms.allow;
341 	}
342 
343 	if (state->users->n || state->groups->n) {
344 		pace++;
345 		pace->e_tag = ACL_MASK;
346 		pace->e_perm = state->mask.allow;
347 	}
348 
349 	pace++;
350 	pace->e_tag = ACL_OTHER;
351 	pace->e_perm = state->other.allow;
352 }
353 
354 int init_acl_state(struct posix_acl_state *state, u16 cnt)
355 {
356 	int alloc;
357 
358 	memset(state, 0, sizeof(struct posix_acl_state));
359 	/*
360 	 * In the worst case, each individual acl could be for a distinct
361 	 * named user or group, but we don't know which, so we allocate
362 	 * enough space for either:
363 	 */
364 	alloc = sizeof(struct posix_ace_state_array)
365 		+ cnt * sizeof(struct posix_user_ace_state);
366 	state->users = kzalloc(alloc, KSMBD_DEFAULT_GFP);
367 	if (!state->users)
368 		return -ENOMEM;
369 	state->groups = kzalloc(alloc, KSMBD_DEFAULT_GFP);
370 	if (!state->groups) {
371 		kfree(state->users);
372 		return -ENOMEM;
373 	}
374 	return 0;
375 }
376 
377 void free_acl_state(struct posix_acl_state *state)
378 {
379 	kfree(state->users);
380 	kfree(state->groups);
381 }
382 
383 static void parse_dacl(struct mnt_idmap *idmap,
384 		       struct smb_acl *pdacl, char *end_of_acl,
385 		       struct smb_sid *pownersid, struct smb_sid *pgrpsid,
386 		       struct smb_fattr *fattr)
387 {
388 	int i, ret;
389 	u16 num_aces = 0;
390 	u16 dacl_size;
391 	unsigned int acl_size;
392 	char *acl_base;
393 	struct smb_ace **ppace;
394 	struct posix_acl_entry *cf_pace, *cf_pdace;
395 	struct posix_acl_state acl_state, default_acl_state;
396 	umode_t mode = 0, acl_mode;
397 	bool owner_found = false, group_found = false, others_found = false;
398 
399 	if (!pdacl)
400 		return;
401 
402 	/* validate that we do not go past end of acl */
403 	if (end_of_acl < (char *)pdacl + sizeof(struct smb_acl) ||
404 	    end_of_acl < (char *)pdacl + le16_to_cpu(pdacl->size)) {
405 		pr_err("ACL too small to parse DACL\n");
406 		return;
407 	}
408 
409 	ksmbd_debug(SMB, "DACL revision %d size %d num aces %d\n",
410 		    le16_to_cpu(pdacl->revision), le16_to_cpu(pdacl->size),
411 		    le16_to_cpu(pdacl->num_aces));
412 
413 	acl_base = (char *)pdacl;
414 	acl_size = sizeof(struct smb_acl);
415 
416 	num_aces = le16_to_cpu(pdacl->num_aces);
417 	if (num_aces <= 0)
418 		return;
419 
420 	dacl_size = le16_to_cpu(pdacl->size);
421 	if (dacl_size < sizeof(struct smb_acl))
422 		return;
423 
424 	if (num_aces > (dacl_size - sizeof(struct smb_acl)) /
425 			(offsetof(struct smb_ace, sid) +
426 			 offsetof(struct smb_sid, sub_auth) + sizeof(__le16)))
427 		return;
428 
429 	ret = init_acl_state(&acl_state, num_aces);
430 	if (ret)
431 		return;
432 	ret = init_acl_state(&default_acl_state, num_aces);
433 	if (ret) {
434 		free_acl_state(&acl_state);
435 		return;
436 	}
437 
438 	ppace = kmalloc_objs(struct smb_ace *, num_aces, KSMBD_DEFAULT_GFP);
439 	if (!ppace) {
440 		free_acl_state(&default_acl_state);
441 		free_acl_state(&acl_state);
442 		return;
443 	}
444 
445 	/*
446 	 * reset rwx permissions for user/group/other.
447 	 * Also, if num_aces is 0 i.e. DACL has no ACEs,
448 	 * user/group/other have no permissions
449 	 */
450 	for (i = 0; i < num_aces; ++i) {
451 		if (end_of_acl - acl_base < acl_size)
452 			break;
453 
454 		ppace[i] = (struct smb_ace *)(acl_base + acl_size);
455 		acl_base = (char *)ppace[i];
456 		acl_size = offsetof(struct smb_ace, sid) +
457 			offsetof(struct smb_sid, sub_auth);
458 
459 		if (end_of_acl - acl_base < acl_size ||
460 		    ppace[i]->sid.num_subauth == 0 ||
461 		    ppace[i]->sid.num_subauth > SID_MAX_SUB_AUTHORITIES ||
462 		    (end_of_acl - acl_base <
463 		     acl_size + sizeof(__le32) * ppace[i]->sid.num_subauth) ||
464 		    (le16_to_cpu(ppace[i]->size) <
465 		     acl_size + sizeof(__le32) * ppace[i]->sid.num_subauth))
466 			break;
467 
468 		acl_size = le16_to_cpu(ppace[i]->size);
469 		ppace[i]->access_req =
470 			smb_map_generic_desired_access(ppace[i]->access_req);
471 
472 		if (ppace[i]->sid.num_subauth >= 3 &&
473 		    !(compare_sids(&ppace[i]->sid, &sid_unix_NFS_mode))) {
474 			fattr->cf_mode =
475 				le32_to_cpu(ppace[i]->sid.sub_auth[2]);
476 			break;
477 		} else if (!compare_sids(&ppace[i]->sid, pownersid)) {
478 			acl_mode = access_flags_to_mode(fattr,
479 							ppace[i]->access_req,
480 							ppace[i]->type);
481 			acl_mode &= 0700;
482 
483 			if (!owner_found) {
484 				mode &= ~(0700);
485 				mode |= acl_mode;
486 			}
487 			owner_found = true;
488 		} else if (!compare_sids(&ppace[i]->sid, pgrpsid) ||
489 			   ppace[i]->sid.sub_auth[ppace[i]->sid.num_subauth - 1] ==
490 			    DOMAIN_USER_RID_LE) {
491 			acl_mode = access_flags_to_mode(fattr,
492 							ppace[i]->access_req,
493 							ppace[i]->type);
494 			acl_mode &= 0070;
495 			if (!group_found) {
496 				mode &= ~(0070);
497 				mode |= acl_mode;
498 			}
499 			group_found = true;
500 		} else if (!compare_sids(&ppace[i]->sid, &sid_everyone)) {
501 			acl_mode = access_flags_to_mode(fattr,
502 							ppace[i]->access_req,
503 							ppace[i]->type);
504 			acl_mode &= 0007;
505 			if (!others_found) {
506 				mode &= ~(0007);
507 				mode |= acl_mode;
508 			}
509 			others_found = true;
510 		} else if (!compare_sids(&ppace[i]->sid, &creator_owner)) {
511 			continue;
512 		} else if (!compare_sids(&ppace[i]->sid, &creator_group)) {
513 			continue;
514 		} else if (!compare_sids(&ppace[i]->sid, &sid_authusers)) {
515 			continue;
516 		} else {
517 			struct smb_fattr temp_fattr;
518 
519 			acl_mode = access_flags_to_mode(fattr, ppace[i]->access_req,
520 							ppace[i]->type);
521 			temp_fattr.cf_uid = INVALID_UID;
522 			ret = sid_to_id(idmap, &ppace[i]->sid, SIDOWNER, &temp_fattr);
523 			if (ret || uid_eq(temp_fattr.cf_uid, INVALID_UID)) {
524 				pr_err("%s: Error %d mapping Owner SID to uid\n",
525 				       __func__, ret);
526 				continue;
527 			}
528 
529 			acl_state.owner.allow = ((acl_mode & 0700) >> 6) | 0004;
530 			acl_state.users->aces[acl_state.users->n].uid =
531 				temp_fattr.cf_uid;
532 			acl_state.users->aces[acl_state.users->n++].perms.allow =
533 				((acl_mode & 0700) >> 6) | 0004;
534 			default_acl_state.owner.allow = ((acl_mode & 0700) >> 6) | 0004;
535 			default_acl_state.users->aces[default_acl_state.users->n].uid =
536 				temp_fattr.cf_uid;
537 			default_acl_state.users->aces[default_acl_state.users->n++].perms.allow =
538 				((acl_mode & 0700) >> 6) | 0004;
539 		}
540 	}
541 	kfree(ppace);
542 
543 	if (owner_found) {
544 		/* The owner must be set to at least read-only. */
545 		acl_state.owner.allow = ((mode & 0700) >> 6) | 0004;
546 		acl_state.users->aces[acl_state.users->n].uid = fattr->cf_uid;
547 		acl_state.users->aces[acl_state.users->n++].perms.allow =
548 			((mode & 0700) >> 6) | 0004;
549 		default_acl_state.owner.allow = ((mode & 0700) >> 6) | 0004;
550 		default_acl_state.users->aces[default_acl_state.users->n].uid =
551 			fattr->cf_uid;
552 		default_acl_state.users->aces[default_acl_state.users->n++].perms.allow =
553 			((mode & 0700) >> 6) | 0004;
554 	}
555 
556 	if (group_found) {
557 		acl_state.group.allow = (mode & 0070) >> 3;
558 		acl_state.groups->aces[acl_state.groups->n].gid =
559 			fattr->cf_gid;
560 		acl_state.groups->aces[acl_state.groups->n++].perms.allow =
561 			(mode & 0070) >> 3;
562 		default_acl_state.group.allow = (mode & 0070) >> 3;
563 		default_acl_state.groups->aces[default_acl_state.groups->n].gid =
564 			fattr->cf_gid;
565 		default_acl_state.groups->aces[default_acl_state.groups->n++].perms.allow =
566 			(mode & 0070) >> 3;
567 	}
568 
569 	if (others_found) {
570 		fattr->cf_mode &= ~(0007);
571 		fattr->cf_mode |= mode & 0007;
572 
573 		acl_state.other.allow = mode & 0007;
574 		default_acl_state.other.allow = mode & 0007;
575 	}
576 
577 	if (acl_state.users->n || acl_state.groups->n) {
578 		acl_state.mask.allow = 0x07;
579 
580 		if (IS_ENABLED(CONFIG_FS_POSIX_ACL)) {
581 			fattr->cf_acls =
582 				posix_acl_alloc(acl_state.users->n +
583 					acl_state.groups->n + 4, KSMBD_DEFAULT_GFP);
584 			if (fattr->cf_acls) {
585 				cf_pace = fattr->cf_acls->a_entries;
586 				posix_state_to_acl(&acl_state, cf_pace);
587 			}
588 		}
589 	}
590 
591 	if (default_acl_state.users->n || default_acl_state.groups->n) {
592 		default_acl_state.mask.allow = 0x07;
593 
594 		if (IS_ENABLED(CONFIG_FS_POSIX_ACL)) {
595 			fattr->cf_dacls =
596 				posix_acl_alloc(default_acl_state.users->n +
597 				default_acl_state.groups->n + 4, KSMBD_DEFAULT_GFP);
598 			if (fattr->cf_dacls) {
599 				cf_pdace = fattr->cf_dacls->a_entries;
600 				posix_state_to_acl(&default_acl_state, cf_pdace);
601 			}
602 		}
603 	}
604 	free_acl_state(&acl_state);
605 	free_acl_state(&default_acl_state);
606 }
607 
608 static void set_posix_acl_entries_dacl(struct mnt_idmap *idmap,
609 				       struct smb_ace *pndace,
610 				       struct smb_fattr *fattr, u16 *num_aces,
611 				       u16 *size, u32 nt_aces_num)
612 {
613 	struct posix_acl_entry *pace;
614 	struct smb_sid *sid;
615 	struct smb_ace *ntace;
616 	int i, j;
617 	u16 ace_sz;
618 
619 	if (!fattr->cf_acls)
620 		goto posix_default_acl;
621 
622 	pace = fattr->cf_acls->a_entries;
623 	for (i = 0; i < fattr->cf_acls->a_count; i++, pace++) {
624 		int flags = 0;
625 
626 		sid = kmalloc_obj(struct smb_sid, KSMBD_DEFAULT_GFP);
627 		if (!sid)
628 			break;
629 
630 		if (pace->e_tag == ACL_USER) {
631 			uid_t uid;
632 			unsigned int sid_type = SIDOWNER;
633 
634 			uid = posix_acl_uid_translate(idmap, pace);
635 			if (!uid)
636 				sid_type = SIDUNIX_USER;
637 			id_to_sid(uid, sid_type, sid);
638 		} else if (pace->e_tag == ACL_GROUP) {
639 			gid_t gid;
640 
641 			gid = posix_acl_gid_translate(idmap, pace);
642 			id_to_sid(gid, SIDUNIX_GROUP, sid);
643 		} else if (pace->e_tag == ACL_OTHER && !nt_aces_num) {
644 			smb_copy_sid(sid, &sid_everyone);
645 		} else {
646 			kfree(sid);
647 			continue;
648 		}
649 		ntace = pndace;
650 		for (j = 0; j < nt_aces_num; j++) {
651 			if (ntace->sid.sub_auth[ntace->sid.num_subauth - 1] ==
652 					sid->sub_auth[sid->num_subauth - 1])
653 				goto pass_same_sid;
654 			ntace = (struct smb_ace *)((char *)ntace +
655 					le16_to_cpu(ntace->size));
656 		}
657 
658 		if (S_ISDIR(fattr->cf_mode) && pace->e_tag == ACL_OTHER)
659 			flags = 0x03;
660 
661 		ntace = (struct smb_ace *)((char *)pndace + *size);
662 		ace_sz = fill_ace_for_sid(ntace, sid, ACCESS_ALLOWED, flags,
663 				pace->e_perm, 0777);
664 		if (check_add_overflow(*size, ace_sz, size)) {
665 			kfree(sid);
666 			break;
667 		}
668 		(*num_aces)++;
669 		if (pace->e_tag == ACL_USER)
670 			ntace->access_req |=
671 				FILE_DELETE_LE | FILE_DELETE_CHILD_LE;
672 
673 		if (S_ISDIR(fattr->cf_mode) &&
674 		    (pace->e_tag == ACL_USER || pace->e_tag == ACL_GROUP)) {
675 			ntace = (struct smb_ace *)((char *)pndace + *size);
676 			ace_sz = fill_ace_for_sid(ntace, sid, ACCESS_ALLOWED,
677 					0x03, pace->e_perm, 0777);
678 			if (check_add_overflow(*size, ace_sz, size)) {
679 				kfree(sid);
680 				break;
681 			}
682 			(*num_aces)++;
683 			if (pace->e_tag == ACL_USER)
684 				ntace->access_req |=
685 					FILE_DELETE_LE | FILE_DELETE_CHILD_LE;
686 		}
687 
688 pass_same_sid:
689 		kfree(sid);
690 	}
691 
692 	if (nt_aces_num)
693 		return;
694 
695 posix_default_acl:
696 	if (!fattr->cf_dacls)
697 		return;
698 
699 	pace = fattr->cf_dacls->a_entries;
700 	for (i = 0; i < fattr->cf_dacls->a_count; i++, pace++) {
701 		sid = kmalloc_obj(struct smb_sid, KSMBD_DEFAULT_GFP);
702 		if (!sid)
703 			break;
704 
705 		if (pace->e_tag == ACL_USER) {
706 			uid_t uid;
707 
708 			uid = posix_acl_uid_translate(idmap, pace);
709 			id_to_sid(uid, SIDCREATOR_OWNER, sid);
710 		} else if (pace->e_tag == ACL_GROUP) {
711 			gid_t gid;
712 
713 			gid = posix_acl_gid_translate(idmap, pace);
714 			id_to_sid(gid, SIDCREATOR_GROUP, sid);
715 		} else {
716 			kfree(sid);
717 			continue;
718 		}
719 
720 		ntace = (struct smb_ace *)((char *)pndace + *size);
721 		ace_sz = fill_ace_for_sid(ntace, sid, ACCESS_ALLOWED, 0x0b,
722 				pace->e_perm, 0777);
723 		if (check_add_overflow(*size, ace_sz, size)) {
724 			kfree(sid);
725 			break;
726 		}
727 		(*num_aces)++;
728 		if (pace->e_tag == ACL_USER)
729 			ntace->access_req |=
730 				FILE_DELETE_LE | FILE_DELETE_CHILD_LE;
731 		kfree(sid);
732 	}
733 }
734 
735 static void set_ntacl_dacl(struct mnt_idmap *idmap,
736 			   struct smb_acl *pndacl,
737 			   struct smb_acl *nt_dacl,
738 			   unsigned int aces_size,
739 			   const struct smb_sid *pownersid,
740 			   const struct smb_sid *pgrpsid,
741 			   struct smb_fattr *fattr)
742 {
743 	struct smb_ace *ntace, *pndace;
744 	u16 nt_num_aces = le16_to_cpu(nt_dacl->num_aces), num_aces = 0;
745 	unsigned short size = 0;
746 	int i;
747 
748 	pndace = (struct smb_ace *)((char *)pndacl + sizeof(struct smb_acl));
749 	if (nt_num_aces) {
750 		ntace = (struct smb_ace *)((char *)nt_dacl + sizeof(struct smb_acl));
751 		for (i = 0; i < nt_num_aces; i++) {
752 			unsigned short nt_ace_size;
753 
754 			if (offsetof(struct smb_ace, access_req) > aces_size)
755 				break;
756 
757 			nt_ace_size = le16_to_cpu(ntace->size);
758 			if (nt_ace_size > aces_size)
759 				break;
760 
761 			if (ntace->sid.num_subauth == 0 ||
762 			    ntace->sid.num_subauth > SID_MAX_SUB_AUTHORITIES)
763 				goto next_ace;
764 
765 			memcpy((char *)pndace + size, ntace, nt_ace_size);
766 			if (check_add_overflow(size, nt_ace_size, &size))
767 				break;
768 			num_aces++;
769 
770 next_ace:
771 			aces_size -= nt_ace_size;
772 			ntace = (struct smb_ace *)((char *)ntace + nt_ace_size);
773 		}
774 	}
775 
776 	set_posix_acl_entries_dacl(idmap, pndace, fattr,
777 				   &num_aces, &size, nt_num_aces);
778 	pndacl->num_aces = cpu_to_le16(num_aces);
779 	pndacl->size = cpu_to_le16(le16_to_cpu(pndacl->size) + size);
780 }
781 
782 static void set_mode_dacl(struct mnt_idmap *idmap,
783 			  struct smb_acl *pndacl, struct smb_fattr *fattr)
784 {
785 	struct smb_ace *pace, *pndace;
786 	u16 num_aces = 0;
787 	u16 size = 0, ace_size = 0;
788 	uid_t uid;
789 	const struct smb_sid *sid;
790 
791 	pace = pndace = (struct smb_ace *)((char *)pndacl + sizeof(struct smb_acl));
792 
793 	if (fattr->cf_acls) {
794 		set_posix_acl_entries_dacl(idmap, pndace, fattr,
795 					   &num_aces, &size, num_aces);
796 		goto out;
797 	}
798 
799 	/* owner RID */
800 	uid = from_kuid(&init_user_ns, fattr->cf_uid);
801 	if (uid)
802 		sid = &server_conf.domain_sid;
803 	else
804 		sid = &sid_unix_users;
805 	ace_size = fill_ace_for_sid(pace, sid, ACCESS_ALLOWED, 0,
806 				    fattr->cf_mode, 0700);
807 	pace->sid.sub_auth[pace->sid.num_subauth++] = cpu_to_le32(uid);
808 	pace->size = cpu_to_le16(ace_size + 4);
809 	size += le16_to_cpu(pace->size);
810 	pace = (struct smb_ace *)((char *)pndace + size);
811 
812 	/* Group RID */
813 	ace_size = fill_ace_for_sid(pace, &sid_unix_groups,
814 				    ACCESS_ALLOWED, 0, fattr->cf_mode, 0070);
815 	pace->sid.sub_auth[pace->sid.num_subauth++] =
816 		cpu_to_le32(from_kgid(&init_user_ns, fattr->cf_gid));
817 	pace->size = cpu_to_le16(ace_size + 4);
818 	size += le16_to_cpu(pace->size);
819 	pace = (struct smb_ace *)((char *)pndace + size);
820 	num_aces = 3;
821 
822 	if (S_ISDIR(fattr->cf_mode)) {
823 		pace = (struct smb_ace *)((char *)pndace + size);
824 
825 		/* creator owner */
826 		size += fill_ace_for_sid(pace, &creator_owner, ACCESS_ALLOWED,
827 					 0x0b, fattr->cf_mode, 0700);
828 		pace = (struct smb_ace *)((char *)pndace + size);
829 
830 		/* creator group */
831 		size += fill_ace_for_sid(pace, &creator_group, ACCESS_ALLOWED,
832 					 0x0b, fattr->cf_mode, 0070);
833 		pace = (struct smb_ace *)((char *)pndace + size);
834 		num_aces = 5;
835 	}
836 
837 	/* other */
838 	size += fill_ace_for_sid(pace, &sid_everyone, ACCESS_ALLOWED, 0,
839 				 fattr->cf_mode, 0007);
840 
841 out:
842 	pndacl->num_aces = cpu_to_le16(num_aces);
843 	pndacl->size = cpu_to_le16(le16_to_cpu(pndacl->size) + size);
844 }
845 
846 static int parse_sid(struct smb_sid *psid, char *end_of_acl)
847 {
848 	/*
849 	 * validate that we do not go past end of ACL - sid must be at least 8
850 	 * bytes long (assuming no sub-auths - e.g. the null SID
851 	 */
852 	if (end_of_acl < (char *)psid + 8) {
853 		pr_err("ACL too small to parse SID %p\n", psid);
854 		return -EINVAL;
855 	}
856 
857 	if (!psid->num_subauth)
858 		return 0;
859 
860 	if (psid->num_subauth > SID_MAX_SUB_AUTHORITIES ||
861 	    end_of_acl < (char *)psid + 8 + sizeof(__le32) * psid->num_subauth)
862 		return -EINVAL;
863 
864 	return 0;
865 }
866 
867 /* Convert CIFS ACL to POSIX form */
868 int parse_sec_desc(struct mnt_idmap *idmap, struct smb_ntsd *pntsd,
869 		   int acl_len, struct smb_fattr *fattr)
870 {
871 	int rc = 0;
872 	struct smb_sid *owner_sid_ptr, *group_sid_ptr;
873 	struct smb_acl *dacl_ptr; /* no need for SACL ptr */
874 	char *end_of_acl = ((char *)pntsd) + acl_len;
875 	__u32 dacloffset;
876 	int pntsd_type;
877 
878 	if (!pntsd)
879 		return -EIO;
880 
881 	if (acl_len < sizeof(struct smb_ntsd))
882 		return -EINVAL;
883 
884 	owner_sid_ptr = (struct smb_sid *)((char *)pntsd +
885 			le32_to_cpu(pntsd->osidoffset));
886 	group_sid_ptr = (struct smb_sid *)((char *)pntsd +
887 			le32_to_cpu(pntsd->gsidoffset));
888 	dacloffset = le32_to_cpu(pntsd->dacloffset);
889 	dacl_ptr = (struct smb_acl *)((char *)pntsd + dacloffset);
890 	ksmbd_debug(SMB,
891 		    "revision %d type 0x%x ooffset 0x%x goffset 0x%x sacloffset 0x%x dacloffset 0x%x\n",
892 		    pntsd->revision, pntsd->type, le32_to_cpu(pntsd->osidoffset),
893 		    le32_to_cpu(pntsd->gsidoffset),
894 		    le32_to_cpu(pntsd->sacloffset), dacloffset);
895 
896 	pntsd_type = le16_to_cpu(pntsd->type);
897 	if (!(pntsd_type & DACL_PRESENT)) {
898 		ksmbd_debug(SMB, "DACL_PRESENT in DACL type is not set\n");
899 		return rc;
900 	}
901 
902 	pntsd->type = cpu_to_le16(DACL_PRESENT);
903 
904 	if (pntsd->osidoffset) {
905 		if (le32_to_cpu(pntsd->osidoffset) < sizeof(struct smb_ntsd))
906 			return -EINVAL;
907 
908 		rc = parse_sid(owner_sid_ptr, end_of_acl);
909 		if (rc) {
910 			pr_err("%s: Error %d parsing Owner SID\n", __func__, rc);
911 			return rc;
912 		}
913 
914 		rc = sid_to_id(idmap, owner_sid_ptr, SIDOWNER, fattr);
915 		if (rc) {
916 			ksmbd_debug(SMB, "Owner SID has no Unix uid mapping\n");
917 			owner_sid_ptr = NULL;
918 			rc = 0;
919 		}
920 	}
921 
922 	if (pntsd->gsidoffset) {
923 		if (le32_to_cpu(pntsd->gsidoffset) < sizeof(struct smb_ntsd))
924 			return -EINVAL;
925 
926 		rc = parse_sid(group_sid_ptr, end_of_acl);
927 		if (rc) {
928 			pr_err("%s: Error %d mapping Owner SID to gid\n",
929 			       __func__, rc);
930 			return rc;
931 		}
932 		rc = sid_to_id(idmap, group_sid_ptr, SIDUNIX_GROUP, fattr);
933 		if (rc) {
934 			ksmbd_debug(SMB, "Group SID has no Unix gid mapping\n");
935 			group_sid_ptr = NULL;
936 			rc = 0;
937 		}
938 	}
939 
940 	if ((pntsd_type & (DACL_AUTO_INHERITED | DACL_AUTO_INHERIT_REQ)) ==
941 	    (DACL_AUTO_INHERITED | DACL_AUTO_INHERIT_REQ))
942 		pntsd->type |= cpu_to_le16(DACL_AUTO_INHERITED);
943 	if (pntsd_type & DACL_PROTECTED)
944 		pntsd->type |= cpu_to_le16(DACL_PROTECTED);
945 
946 	if (dacloffset) {
947 		if (dacloffset < sizeof(struct smb_ntsd))
948 			return -EINVAL;
949 
950 		parse_dacl(idmap, dacl_ptr, end_of_acl,
951 			   owner_sid_ptr, group_sid_ptr, fattr);
952 	}
953 
954 	return 0;
955 }
956 
957 size_t smb_acl_sec_desc_scratch_len(struct smb_fattr *fattr,
958 		struct smb_ntsd *ppntsd, int ppntsd_size, int addition_info)
959 {
960 	size_t len = sizeof(struct smb_ntsd);
961 	size_t tmp;
962 
963 	if (addition_info & OWNER_SECINFO)
964 		len += sizeof(struct smb_sid);
965 	if (addition_info & GROUP_SECINFO)
966 		len += sizeof(struct smb_sid);
967 	if (!(addition_info & DACL_SECINFO))
968 		return len;
969 
970 	len += sizeof(struct smb_acl);
971 	if (ppntsd && ppntsd_size > 0) {
972 		unsigned int dacl_offset = le32_to_cpu(ppntsd->dacloffset);
973 
974 		if (dacl_offset < ppntsd_size &&
975 		    check_add_overflow(len, ppntsd_size - dacl_offset, &len))
976 			return 0;
977 	}
978 
979 	if (fattr->cf_acls) {
980 		if (check_mul_overflow((size_t)fattr->cf_acls->a_count,
981 					2 * sizeof(struct smb_ace), &tmp) ||
982 		    check_add_overflow(len, tmp, &len))
983 			return 0;
984 	} else {
985 		/* default/minimum DACL */
986 		if (check_add_overflow(len, 5 * sizeof(struct smb_ace), &len))
987 			return 0;
988 	}
989 
990 	if (fattr->cf_dacls) {
991 		if (check_mul_overflow((size_t)fattr->cf_dacls->a_count,
992 					sizeof(struct smb_ace), &tmp) ||
993 		    check_add_overflow(len, tmp, &len))
994 			return 0;
995 	}
996 
997 	return len;
998 }
999 
1000 /* Convert permission bits from mode to equivalent CIFS ACL */
1001 int build_sec_desc(struct mnt_idmap *idmap,
1002 		   struct smb_ntsd *pntsd, struct smb_ntsd *ppntsd,
1003 		   int ppntsd_size, int addition_info, __u32 *secdesclen,
1004 		   struct smb_fattr *fattr)
1005 {
1006 	int rc = 0;
1007 	__u32 offset;
1008 	struct smb_sid *owner_sid_ptr, *group_sid_ptr;
1009 	struct smb_sid *nowner_sid_ptr, *ngroup_sid_ptr;
1010 	struct smb_acl *dacl_ptr = NULL; /* no need for SACL ptr */
1011 	uid_t uid;
1012 	gid_t gid;
1013 	unsigned int sid_type = SIDOWNER;
1014 
1015 	nowner_sid_ptr = kmalloc_obj(struct smb_sid, KSMBD_DEFAULT_GFP);
1016 	if (!nowner_sid_ptr)
1017 		return -ENOMEM;
1018 
1019 	uid = from_kuid(&init_user_ns, fattr->cf_uid);
1020 	if (!uid)
1021 		sid_type = SIDUNIX_USER;
1022 	id_to_sid(uid, sid_type, nowner_sid_ptr);
1023 
1024 	ngroup_sid_ptr = kmalloc_obj(struct smb_sid, KSMBD_DEFAULT_GFP);
1025 	if (!ngroup_sid_ptr) {
1026 		kfree(nowner_sid_ptr);
1027 		return -ENOMEM;
1028 	}
1029 
1030 	gid = from_kgid(&init_user_ns, fattr->cf_gid);
1031 	id_to_sid(gid, SIDUNIX_GROUP, ngroup_sid_ptr);
1032 
1033 	offset = sizeof(struct smb_ntsd);
1034 	pntsd->sacloffset = 0;
1035 	pntsd->revision = cpu_to_le16(1);
1036 	pntsd->type = cpu_to_le16(SELF_RELATIVE);
1037 	if (ppntsd)
1038 		pntsd->type |= ppntsd->type;
1039 
1040 	if (addition_info & OWNER_SECINFO) {
1041 		pntsd->osidoffset = cpu_to_le32(offset);
1042 		owner_sid_ptr = (struct smb_sid *)((char *)pntsd + offset);
1043 		smb_copy_sid(owner_sid_ptr, nowner_sid_ptr);
1044 		offset += 1 + 1 + 6 + (nowner_sid_ptr->num_subauth * 4);
1045 	}
1046 
1047 	if (addition_info & GROUP_SECINFO) {
1048 		pntsd->gsidoffset = cpu_to_le32(offset);
1049 		group_sid_ptr = (struct smb_sid *)((char *)pntsd + offset);
1050 		smb_copy_sid(group_sid_ptr, ngroup_sid_ptr);
1051 		offset += 1 + 1 + 6 + (ngroup_sid_ptr->num_subauth * 4);
1052 	}
1053 
1054 	if (addition_info & DACL_SECINFO) {
1055 		pntsd->type |= cpu_to_le16(DACL_PRESENT);
1056 		dacl_ptr = (struct smb_acl *)((char *)pntsd + offset);
1057 		dacl_ptr->revision = cpu_to_le16(2);
1058 		dacl_ptr->size = cpu_to_le16(sizeof(struct smb_acl));
1059 		dacl_ptr->num_aces = 0;
1060 
1061 		if (!ppntsd) {
1062 			set_mode_dacl(idmap, dacl_ptr, fattr);
1063 		} else {
1064 			struct smb_acl *ppdacl_ptr;
1065 			unsigned int dacl_offset = le32_to_cpu(ppntsd->dacloffset);
1066 			int ppdacl_size, ntacl_size = ppntsd_size - dacl_offset;
1067 
1068 			if (!dacl_offset ||
1069 			    (dacl_offset + sizeof(struct smb_acl) > ppntsd_size))
1070 				goto out;
1071 
1072 			ppdacl_ptr = (struct smb_acl *)((char *)ppntsd + dacl_offset);
1073 			ppdacl_size = le16_to_cpu(ppdacl_ptr->size);
1074 			if (ppdacl_size > ntacl_size ||
1075 			    ppdacl_size < sizeof(struct smb_acl))
1076 				goto out;
1077 
1078 			set_ntacl_dacl(idmap, dacl_ptr, ppdacl_ptr,
1079 				       ntacl_size - sizeof(struct smb_acl),
1080 				       nowner_sid_ptr, ngroup_sid_ptr,
1081 				       fattr);
1082 		}
1083 		pntsd->dacloffset = cpu_to_le32(offset);
1084 		offset += le16_to_cpu(dacl_ptr->size);
1085 	}
1086 
1087 out:
1088 	kfree(nowner_sid_ptr);
1089 	kfree(ngroup_sid_ptr);
1090 	*secdesclen = offset;
1091 	return rc;
1092 }
1093 
1094 static void smb_set_ace(struct smb_ace *ace, const struct smb_sid *sid, u8 type,
1095 			u8 flags, __le32 access_req)
1096 {
1097 	ace->type = type;
1098 	ace->flags = flags;
1099 	ace->access_req = access_req;
1100 	smb_copy_sid(&ace->sid, sid);
1101 	ace->size = cpu_to_le16(1 + 1 + 2 + 4 + 1 + 1 + 6 +
1102 				(ace->sid.num_subauth * 4));
1103 }
1104 
1105 static int smb_append_inherited_ace(struct smb_ace **ace, int *nt_size,
1106 				    u16 *ace_cnt, const struct smb_sid *sid,
1107 				    u8 type, u8 flags, __le32 access_req)
1108 {
1109 	int ace_size;
1110 
1111 	smb_set_ace(*ace, sid, type, flags, access_req);
1112 	ace_size = le16_to_cpu((*ace)->size);
1113 	/* pdacl->size is __le16 and includes struct smb_acl. */
1114 	if (check_add_overflow(*nt_size, ace_size, nt_size) ||
1115 	    *nt_size > U16_MAX - (int)sizeof(struct smb_acl))
1116 		return -EINVAL;
1117 
1118 	(*ace_cnt)++;
1119 	*ace = (struct smb_ace *)((char *)*ace + ace_size);
1120 	return 0;
1121 }
1122 
1123 static int smb_validate_ntsd_sid(struct smb_ntsd *pntsd, size_t pntsd_size,
1124 				  unsigned int sid_offset, struct smb_sid **sid,
1125 				  size_t *sid_size)
1126 {
1127 	size_t sid_end;
1128 
1129 	*sid = NULL;
1130 	*sid_size = 0;
1131 
1132 	if (!sid_offset)
1133 		return 0;
1134 
1135 	if (sid_offset < sizeof(struct smb_ntsd) ||
1136 	    check_add_overflow(sid_offset, (size_t)CIFS_SID_BASE_SIZE,
1137 			       &sid_end) ||
1138 	    sid_end > pntsd_size)
1139 		return -EINVAL;
1140 
1141 	*sid = (struct smb_sid *)((char *)pntsd + sid_offset);
1142 	if ((*sid)->num_subauth > SID_MAX_SUB_AUTHORITIES)
1143 		return -EINVAL;
1144 
1145 	if (check_add_overflow((size_t)CIFS_SID_BASE_SIZE,
1146 			       sizeof(__le32) * (size_t)(*sid)->num_subauth,
1147 			       &sid_end))
1148 		return -EINVAL;
1149 
1150 	if (sid_offset > pntsd_size || sid_end > pntsd_size - sid_offset)
1151 		return -EINVAL;
1152 
1153 	*sid_size = sid_end;
1154 	return 0;
1155 }
1156 
1157 int smb_inherit_dacl(struct ksmbd_conn *conn,
1158 		     const struct path *path,
1159 		     unsigned int uid, unsigned int gid)
1160 {
1161 	const struct smb_sid *psid, *creator = NULL;
1162 	struct smb_ace *parent_aces, *aces;
1163 	struct smb_acl *parent_pdacl;
1164 	struct smb_ntsd *parent_pntsd = NULL;
1165 	struct smb_sid owner_sid, group_sid;
1166 	struct dentry *parent = path->dentry->d_parent;
1167 	struct mnt_idmap *idmap = mnt_idmap(path->mnt);
1168 	int inherited_flags = 0, flags = 0, i, nt_size = 0, pdacl_size;
1169 	int rc = 0, pntsd_type, ppntsd_size, acl_len, aces_size;
1170 	unsigned int dacloffset;
1171 	size_t dacl_struct_end;
1172 	u16 num_aces, ace_cnt = 0;
1173 	char *aces_base;
1174 	bool is_dir = S_ISDIR(d_inode(path->dentry)->i_mode);
1175 
1176 	ppntsd_size = ksmbd_vfs_get_sd_xattr(conn, idmap,
1177 					    parent, &parent_pntsd);
1178 	if (ppntsd_size <= 0)
1179 		return -ENOENT;
1180 
1181 	dacloffset = le32_to_cpu(parent_pntsd->dacloffset);
1182 	if (!dacloffset ||
1183 	    check_add_overflow(dacloffset, sizeof(struct smb_acl), &dacl_struct_end) ||
1184 	    dacl_struct_end > (size_t)ppntsd_size) {
1185 		rc = -EINVAL;
1186 		goto free_parent_pntsd;
1187 	}
1188 
1189 	parent_pdacl = (struct smb_acl *)((char *)parent_pntsd + dacloffset);
1190 	acl_len = ppntsd_size - dacloffset;
1191 	num_aces = le16_to_cpu(parent_pdacl->num_aces);
1192 	pntsd_type = le16_to_cpu(parent_pntsd->type);
1193 	pdacl_size = le16_to_cpu(parent_pdacl->size);
1194 
1195 	if (pdacl_size > acl_len || pdacl_size < sizeof(struct smb_acl)) {
1196 		rc = -EINVAL;
1197 		goto free_parent_pntsd;
1198 	}
1199 
1200 	aces_size = pdacl_size - sizeof(struct smb_acl);
1201 
1202 	/*
1203 	 * Validate num_aces against the DACL payload before allocating.
1204 	 * Each ACE must be at least as large as its fixed-size header
1205 	 * (up to the SID base), so num_aces cannot exceed the payload
1206 	 * divided by the minimum ACE size.  This mirrors the existing
1207 	 * check in parse_dacl().
1208 	 */
1209 	if (num_aces > aces_size / (offsetof(struct smb_ace, sid) +
1210 				    offsetof(struct smb_sid, sub_auth) +
1211 				    sizeof(__le16))) {
1212 		rc = -EINVAL;
1213 		goto free_parent_pntsd;
1214 	}
1215 
1216 	aces_base = kmalloc_array(num_aces * 2, sizeof(struct smb_ace),
1217 				  KSMBD_DEFAULT_GFP);
1218 	if (!aces_base) {
1219 		rc = -ENOMEM;
1220 		goto free_parent_pntsd;
1221 	}
1222 
1223 	aces = (struct smb_ace *)aces_base;
1224 	parent_aces = (struct smb_ace *)((char *)parent_pdacl +
1225 			sizeof(struct smb_acl));
1226 
1227 	if (pntsd_type & DACL_AUTO_INHERITED)
1228 		inherited_flags = INHERITED_ACE;
1229 
1230 	for (i = 0; i < num_aces; i++) {
1231 		int pace_size;
1232 
1233 		if (aces_size < offsetof(struct smb_ace, sid) +
1234 		    CIFS_SID_BASE_SIZE)
1235 			break;
1236 
1237 		pace_size = le16_to_cpu(parent_aces->size);
1238 		if (pace_size > aces_size ||
1239 		    pace_size < offsetof(struct smb_ace, sid) +
1240 				CIFS_SID_BASE_SIZE)
1241 			break;
1242 
1243 		if (parent_aces->sid.num_subauth > SID_MAX_SUB_AUTHORITIES ||
1244 		    pace_size < offsetof(struct smb_ace, sid) +
1245 				CIFS_SID_BASE_SIZE +
1246 				sizeof(__le32) * parent_aces->sid.num_subauth)
1247 			break;
1248 
1249 		aces_size -= pace_size;
1250 
1251 		flags = parent_aces->flags;
1252 		if (!smb_inherit_flags(flags, is_dir))
1253 			goto pass;
1254 		if (is_dir) {
1255 			flags &= ~(INHERIT_ONLY_ACE | INHERITED_ACE);
1256 			if (!(flags & CONTAINER_INHERIT_ACE))
1257 				flags |= INHERIT_ONLY_ACE;
1258 			if (flags & NO_PROPAGATE_INHERIT_ACE)
1259 				flags = 0;
1260 		} else {
1261 			flags = 0;
1262 		}
1263 
1264 		if (!compare_sids(&creator_owner, &parent_aces->sid)) {
1265 			creator = &creator_owner;
1266 			id_to_sid(uid, SIDOWNER, &owner_sid);
1267 			psid = &owner_sid;
1268 		} else if (!compare_sids(&creator_group, &parent_aces->sid)) {
1269 			creator = &creator_group;
1270 			id_to_sid(gid, SIDUNIX_GROUP, &group_sid);
1271 			psid = &group_sid;
1272 		} else {
1273 			creator = NULL;
1274 			psid = &parent_aces->sid;
1275 		}
1276 
1277 		if (is_dir && creator && flags & CONTAINER_INHERIT_ACE) {
1278 			rc = smb_append_inherited_ace(&aces, &nt_size, &ace_cnt,
1279 						      psid, parent_aces->type,
1280 						      inherited_flags,
1281 						      parent_aces->access_req);
1282 			if (rc)
1283 				goto free_aces_base;
1284 			flags |= INHERIT_ONLY_ACE;
1285 			psid = creator;
1286 		} else if (is_dir && !(parent_aces->flags & NO_PROPAGATE_INHERIT_ACE)) {
1287 			psid = &parent_aces->sid;
1288 		}
1289 
1290 		rc = smb_append_inherited_ace(&aces, &nt_size, &ace_cnt, psid,
1291 					      parent_aces->type,
1292 					      flags | inherited_flags,
1293 					      parent_aces->access_req);
1294 		if (rc)
1295 			goto free_aces_base;
1296 pass:
1297 		parent_aces = (struct smb_ace *)((char *)parent_aces + pace_size);
1298 	}
1299 
1300 	if (nt_size > 0) {
1301 		struct smb_ntsd *pntsd;
1302 		struct smb_acl *pdacl;
1303 		struct smb_sid *powner_sid = NULL, *pgroup_sid = NULL;
1304 		size_t powner_sid_size = 0, pgroup_sid_size = 0, pntsd_size;
1305 		size_t pntsd_alloc_size;
1306 
1307 		rc = smb_validate_ntsd_sid(parent_pntsd, ppntsd_size,
1308 					   le32_to_cpu(parent_pntsd->osidoffset),
1309 					   &powner_sid, &powner_sid_size);
1310 		if (rc)
1311 			goto free_aces_base;
1312 		rc = smb_validate_ntsd_sid(parent_pntsd, ppntsd_size,
1313 					   le32_to_cpu(parent_pntsd->gsidoffset),
1314 					   &pgroup_sid, &pgroup_sid_size);
1315 		if (rc)
1316 			goto free_aces_base;
1317 
1318 		if (check_add_overflow(sizeof(struct smb_ntsd),
1319 				       (size_t)powner_sid_size,
1320 				       &pntsd_alloc_size) ||
1321 		    check_add_overflow(pntsd_alloc_size,
1322 				       (size_t)pgroup_sid_size,
1323 				       &pntsd_alloc_size) ||
1324 		    check_add_overflow(pntsd_alloc_size, sizeof(struct smb_acl),
1325 				       &pntsd_alloc_size) ||
1326 		    check_add_overflow(pntsd_alloc_size, (size_t)nt_size,
1327 				       &pntsd_alloc_size)) {
1328 			rc = -EINVAL;
1329 			goto free_aces_base;
1330 		}
1331 
1332 		pntsd = kzalloc(pntsd_alloc_size, KSMBD_DEFAULT_GFP);
1333 		if (!pntsd) {
1334 			rc = -ENOMEM;
1335 			goto free_aces_base;
1336 		}
1337 
1338 		pntsd->revision = cpu_to_le16(1);
1339 		pntsd->type = cpu_to_le16(SELF_RELATIVE | DACL_PRESENT);
1340 		if (le16_to_cpu(parent_pntsd->type) & DACL_AUTO_INHERITED)
1341 			pntsd->type |= cpu_to_le16(DACL_AUTO_INHERITED);
1342 		pntsd_size = sizeof(struct smb_ntsd);
1343 		pntsd->osidoffset = parent_pntsd->osidoffset;
1344 		pntsd->gsidoffset = parent_pntsd->gsidoffset;
1345 		pntsd->dacloffset = parent_pntsd->dacloffset;
1346 
1347 		if ((u64)le32_to_cpu(pntsd->osidoffset) + powner_sid_size >
1348 		    pntsd_alloc_size) {
1349 			rc = -EINVAL;
1350 			kfree(pntsd);
1351 			goto free_aces_base;
1352 		}
1353 
1354 		if ((u64)le32_to_cpu(pntsd->gsidoffset) + pgroup_sid_size >
1355 		    pntsd_alloc_size) {
1356 			rc = -EINVAL;
1357 			kfree(pntsd);
1358 			goto free_aces_base;
1359 		}
1360 
1361 		if ((u64)le32_to_cpu(pntsd->dacloffset) + sizeof(struct smb_acl) + nt_size >
1362 		    pntsd_alloc_size) {
1363 			rc = -EINVAL;
1364 			kfree(pntsd);
1365 			goto free_aces_base;
1366 		}
1367 
1368 		if (pntsd->osidoffset) {
1369 			struct smb_sid *owner_sid = (struct smb_sid *)((char *)pntsd +
1370 					le32_to_cpu(pntsd->osidoffset));
1371 			memcpy(owner_sid, powner_sid, powner_sid_size);
1372 			pntsd_size += powner_sid_size;
1373 		}
1374 
1375 		if (pntsd->gsidoffset) {
1376 			struct smb_sid *group_sid = (struct smb_sid *)((char *)pntsd +
1377 					le32_to_cpu(pntsd->gsidoffset));
1378 			memcpy(group_sid, pgroup_sid, pgroup_sid_size);
1379 			pntsd_size += pgroup_sid_size;
1380 		}
1381 
1382 		if (pntsd->dacloffset) {
1383 			struct smb_ace *pace;
1384 
1385 			pdacl = (struct smb_acl *)((char *)pntsd + le32_to_cpu(pntsd->dacloffset));
1386 			pdacl->revision = cpu_to_le16(2);
1387 			pdacl->size = cpu_to_le16(sizeof(struct smb_acl) + nt_size);
1388 			pdacl->num_aces = cpu_to_le16(ace_cnt);
1389 			pace = (struct smb_ace *)((char *)pdacl + sizeof(struct smb_acl));
1390 			memcpy(pace, aces_base, nt_size);
1391 			pntsd_size += sizeof(struct smb_acl) + nt_size;
1392 		}
1393 
1394 		ksmbd_vfs_set_sd_xattr(conn, idmap, path, pntsd, pntsd_size, false);
1395 		kfree(pntsd);
1396 	}
1397 
1398 free_aces_base:
1399 	kfree(aces_base);
1400 free_parent_pntsd:
1401 	kfree(parent_pntsd);
1402 	return rc;
1403 }
1404 
1405 bool smb_inherit_flags(int flags, bool is_dir)
1406 {
1407 	if (!is_dir)
1408 		return (flags & OBJECT_INHERIT_ACE) != 0;
1409 
1410 	if (flags & OBJECT_INHERIT_ACE && !(flags & NO_PROPAGATE_INHERIT_ACE))
1411 		return true;
1412 
1413 	if (flags & CONTAINER_INHERIT_ACE)
1414 		return true;
1415 	return false;
1416 }
1417 
1418 int smb_check_perm_dacl(struct ksmbd_conn *conn, const struct path *path,
1419 			__le32 *pdaccess, int uid)
1420 {
1421 	struct mnt_idmap *idmap = mnt_idmap(path->mnt);
1422 	struct smb_ntsd *pntsd = NULL;
1423 	struct smb_acl *pdacl;
1424 	struct posix_acl *posix_acls;
1425 	int rc = 0, pntsd_size, acl_size, aces_size, pdacl_size;
1426 	unsigned int dacl_offset;
1427 	size_t dacl_struct_end;
1428 	struct smb_sid sid;
1429 	int granted = le32_to_cpu(*pdaccess & ~FILE_MAXIMAL_ACCESS_LE);
1430 	struct smb_ace *ace;
1431 	int i, found = 0;
1432 	unsigned int access_bits = 0;
1433 	struct smb_ace *others_ace = NULL;
1434 	struct posix_acl_entry *pa_entry;
1435 	unsigned int sid_type = SIDOWNER;
1436 	unsigned short ace_size;
1437 
1438 	ksmbd_debug(SMB, "check permission using windows acl\n");
1439 	pntsd_size = ksmbd_vfs_get_sd_xattr(conn, idmap,
1440 					    path->dentry, &pntsd);
1441 	if (pntsd_size <= 0 || !pntsd)
1442 		goto err_out;
1443 
1444 	dacl_offset = le32_to_cpu(pntsd->dacloffset);
1445 	if (!dacl_offset ||
1446 	    check_add_overflow(dacl_offset, sizeof(struct smb_acl), &dacl_struct_end) ||
1447 	    dacl_struct_end > (size_t)pntsd_size)
1448 		goto err_out;
1449 
1450 	pdacl = (struct smb_acl *)((char *)pntsd + le32_to_cpu(pntsd->dacloffset));
1451 	acl_size = pntsd_size - dacl_offset;
1452 	pdacl_size = le16_to_cpu(pdacl->size);
1453 
1454 	if (pdacl_size > acl_size || pdacl_size < sizeof(struct smb_acl))
1455 		goto err_out;
1456 
1457 	if (!pdacl->num_aces) {
1458 		if (!(pdacl_size - sizeof(struct smb_acl)) &&
1459 		    *pdaccess & ~(FILE_READ_CONTROL_LE | FILE_WRITE_DAC_LE)) {
1460 			rc = -EACCES;
1461 			goto err_out;
1462 		}
1463 		goto err_out;
1464 	}
1465 
1466 	if (*pdaccess & FILE_MAXIMAL_ACCESS_LE) {
1467 		granted = READ_CONTROL | WRITE_DAC | FILE_READ_ATTRIBUTES |
1468 			DELETE;
1469 
1470 		ace = (struct smb_ace *)((char *)pdacl + sizeof(struct smb_acl));
1471 		aces_size = acl_size - sizeof(struct smb_acl);
1472 		for (i = 0; i < le16_to_cpu(pdacl->num_aces); i++) {
1473 			if (aces_size < offsetof(struct smb_ace, sid) +
1474 			    CIFS_SID_BASE_SIZE)
1475 				break;
1476 			ace_size = le16_to_cpu(ace->size);
1477 			if (ace_size > aces_size ||
1478 			    ace_size < offsetof(struct smb_ace, sid) +
1479 				       CIFS_SID_BASE_SIZE)
1480 				break;
1481 			aces_size -= ace_size;
1482 			granted |= le32_to_cpu(ace->access_req);
1483 			ace = (struct smb_ace *)((char *)ace + le16_to_cpu(ace->size));
1484 		}
1485 	}
1486 
1487 	if (!uid)
1488 		sid_type = SIDUNIX_USER;
1489 	id_to_sid(uid, sid_type, &sid);
1490 
1491 	ace = (struct smb_ace *)((char *)pdacl + sizeof(struct smb_acl));
1492 	aces_size = acl_size - sizeof(struct smb_acl);
1493 	for (i = 0; i < le16_to_cpu(pdacl->num_aces); i++) {
1494 		if (aces_size < offsetof(struct smb_ace, sid) +
1495 		    CIFS_SID_BASE_SIZE)
1496 			break;
1497 		ace_size = le16_to_cpu(ace->size);
1498 		if (ace_size > aces_size ||
1499 		    ace_size < offsetof(struct smb_ace, sid) +
1500 			       CIFS_SID_BASE_SIZE)
1501 			break;
1502 		aces_size -= ace_size;
1503 
1504 		if (ace->sid.num_subauth > SID_MAX_SUB_AUTHORITIES ||
1505 		    ace_size < offsetof(struct smb_ace, sid) + CIFS_SID_BASE_SIZE +
1506 			      sizeof(__le32) * ace->sid.num_subauth)
1507 			break;
1508 
1509 		if (!compare_sids(&sid, &ace->sid) ||
1510 		    !compare_sids(&sid_unix_NFS_mode, &ace->sid)) {
1511 			found = 1;
1512 			break;
1513 		}
1514 		if (!compare_sids(&sid_everyone, &ace->sid))
1515 			others_ace = ace;
1516 
1517 		ace = (struct smb_ace *)((char *)ace + le16_to_cpu(ace->size));
1518 	}
1519 
1520 	if (*pdaccess & FILE_MAXIMAL_ACCESS_LE && found) {
1521 		granted = READ_CONTROL | WRITE_DAC | FILE_READ_ATTRIBUTES |
1522 			DELETE;
1523 
1524 		granted |= le32_to_cpu(ace->access_req);
1525 
1526 		if (!pdacl->num_aces)
1527 			granted = GENERIC_ALL_FLAGS;
1528 	}
1529 
1530 	if (IS_ENABLED(CONFIG_FS_POSIX_ACL)) {
1531 		posix_acls = get_inode_acl(d_inode(path->dentry), ACL_TYPE_ACCESS);
1532 		if (!IS_ERR_OR_NULL(posix_acls) && !found) {
1533 			unsigned int id = -1;
1534 
1535 			pa_entry = posix_acls->a_entries;
1536 			for (i = 0; i < posix_acls->a_count; i++, pa_entry++) {
1537 				if (pa_entry->e_tag == ACL_USER)
1538 					id = posix_acl_uid_translate(idmap, pa_entry);
1539 				else if (pa_entry->e_tag == ACL_GROUP)
1540 					id = posix_acl_gid_translate(idmap, pa_entry);
1541 				else
1542 					continue;
1543 
1544 				if (id == uid) {
1545 					mode_to_access_flags(pa_entry->e_perm,
1546 							     0777,
1547 							     &access_bits);
1548 					if (!access_bits)
1549 						access_bits =
1550 							SET_MINIMUM_RIGHTS;
1551 					posix_acl_release(posix_acls);
1552 					goto check_access_bits;
1553 				}
1554 			}
1555 		}
1556 		if (!IS_ERR_OR_NULL(posix_acls))
1557 			posix_acl_release(posix_acls);
1558 	}
1559 
1560 	if (!found) {
1561 		if (others_ace) {
1562 			ace = others_ace;
1563 		} else {
1564 			ksmbd_debug(SMB, "Can't find corresponding sid\n");
1565 			rc = -EACCES;
1566 			goto err_out;
1567 		}
1568 	}
1569 
1570 	switch (ace->type) {
1571 	case ACCESS_ALLOWED_ACE_TYPE:
1572 		access_bits = le32_to_cpu(ace->access_req);
1573 		break;
1574 	case ACCESS_DENIED_ACE_TYPE:
1575 	case ACCESS_DENIED_CALLBACK_ACE_TYPE:
1576 		access_bits = le32_to_cpu(~ace->access_req);
1577 		break;
1578 	}
1579 
1580 check_access_bits:
1581 	if (granted &
1582 	    ~(access_bits | FILE_READ_ATTRIBUTES | READ_CONTROL | WRITE_DAC | DELETE)) {
1583 		ksmbd_debug(SMB, "Access denied with winACL, granted : %x, access_req : %x\n",
1584 			    granted, le32_to_cpu(ace->access_req));
1585 		rc = -EACCES;
1586 		goto err_out;
1587 	}
1588 
1589 	*pdaccess = cpu_to_le32(granted);
1590 err_out:
1591 	kfree(pntsd);
1592 	return rc;
1593 }
1594 
1595 int set_info_sec(struct ksmbd_conn *conn, struct ksmbd_tree_connect *tcon,
1596 		 const struct path *path, struct smb_ntsd *pntsd, int ntsd_len,
1597 		 bool type_check, bool get_write)
1598 {
1599 	int rc;
1600 	struct smb_fattr fattr = {{0}};
1601 	struct inode *inode = d_inode(path->dentry);
1602 	struct mnt_idmap *idmap = mnt_idmap(path->mnt);
1603 	struct iattr newattrs;
1604 
1605 	fattr.cf_uid = INVALID_UID;
1606 	fattr.cf_gid = INVALID_GID;
1607 	fattr.cf_mode = inode->i_mode;
1608 
1609 	rc = parse_sec_desc(idmap, pntsd, ntsd_len, &fattr);
1610 	if (rc)
1611 		goto out;
1612 
1613 	newattrs.ia_valid = ATTR_CTIME;
1614 	if (!uid_eq(fattr.cf_uid, INVALID_UID)) {
1615 		newattrs.ia_valid |= ATTR_UID;
1616 		newattrs.ia_uid = fattr.cf_uid;
1617 	}
1618 	if (!gid_eq(fattr.cf_gid, INVALID_GID)) {
1619 		newattrs.ia_valid |= ATTR_GID;
1620 		newattrs.ia_gid = fattr.cf_gid;
1621 	}
1622 	newattrs.ia_valid |= ATTR_MODE;
1623 	newattrs.ia_mode = (inode->i_mode & ~0777) | (fattr.cf_mode & 0777);
1624 
1625 	ksmbd_vfs_remove_acl_xattrs(idmap, path);
1626 	/* Update posix acls */
1627 	if (IS_ENABLED(CONFIG_FS_POSIX_ACL) && fattr.cf_dacls) {
1628 		rc = set_posix_acl(idmap, path->dentry,
1629 				   ACL_TYPE_ACCESS, fattr.cf_acls);
1630 		if (rc < 0)
1631 			ksmbd_debug(SMB,
1632 				    "Set posix acl(ACL_TYPE_ACCESS) failed, rc : %d\n",
1633 				    rc);
1634 		if (S_ISDIR(inode->i_mode) && fattr.cf_dacls) {
1635 			rc = set_posix_acl(idmap, path->dentry,
1636 					   ACL_TYPE_DEFAULT, fattr.cf_dacls);
1637 			if (rc)
1638 				ksmbd_debug(SMB,
1639 					    "Set posix acl(ACL_TYPE_DEFAULT) failed, rc : %d\n",
1640 					    rc);
1641 		}
1642 	}
1643 
1644 	inode_lock(inode);
1645 	rc = notify_change(idmap, path->dentry, &newattrs, NULL);
1646 	inode_unlock(inode);
1647 	if (rc)
1648 		goto out;
1649 
1650 	/* Check it only calling from SD BUFFER context */
1651 	if (type_check && !(le16_to_cpu(pntsd->type) & DACL_PRESENT))
1652 		goto out;
1653 
1654 	if (test_share_config_flag(tcon->share_conf, KSMBD_SHARE_FLAG_ACL_XATTR)) {
1655 		/* Update WinACL in xattr */
1656 		ksmbd_vfs_remove_sd_xattrs(idmap, path);
1657 		ksmbd_vfs_set_sd_xattr(conn, idmap, path, pntsd, ntsd_len,
1658 				get_write);
1659 	}
1660 
1661 out:
1662 	posix_acl_release(fattr.cf_acls);
1663 	posix_acl_release(fattr.cf_dacls);
1664 	return rc;
1665 }
1666 
1667 void ksmbd_init_domain(u32 *sub_auth)
1668 {
1669 	int i;
1670 
1671 	memcpy(&server_conf.domain_sid, &domain, sizeof(struct smb_sid));
1672 	for (i = 0; i < 3; ++i)
1673 		server_conf.domain_sid.sub_auth[i + 1] = cpu_to_le32(sub_auth[i]);
1674 }
1675