Commit e37a02c7 authored by Aurelien Aptel's avatar Aurelien Aptel Committed by Steve French
Browse files

cifs: modefromsid: write mode ACE first



DACL should start with mode ACE first but we are putting it at the
end. reorder them to put it first.

Signed-off-by: default avatarAurelien Aptel <aaptel@suse.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 352f2c9a
Loading
Loading
Loading
Loading
+19 −17
Original line number Diff line number Diff line
@@ -809,30 +809,21 @@ static int set_chmod_dacl(struct cifs_acl *pndacl, struct cifs_sid *pownersid,
			struct cifs_sid *pgrpsid, __u64 nmode, bool modefromsid)
{
	u16 size = 0;
	u32 num_aces = 0;
	struct cifs_acl *pnndacl;

	pnndacl = (struct cifs_acl *)((char *)pndacl + sizeof(struct cifs_acl));

	size += fill_ace_for_sid((struct cifs_ace *) ((char *)pnndacl + size),
					pownersid, nmode, S_IRWXU);
	size += fill_ace_for_sid((struct cifs_ace *)((char *)pnndacl + size),
					pgrpsid, nmode, S_IRWXG);
	size += fill_ace_for_sid((struct cifs_ace *)((char *)pnndacl + size),
					 &sid_everyone, nmode, S_IRWXO);

	/* TBD: Move this ACE to the top of ACE list instead of bottom */
	if (modefromsid) {
		struct cifs_ace *pntace =
			(struct cifs_ace *)((char *)pnndacl + size);
		int i;

		pntace->type = ACCESS_DENIED;
		pntace->type = ACCESS_ALLOWED;
		pntace->flags = 0x0;
		pntace->access_req = 0;
		pntace->sid.num_subauth = 3;
		pntace->sid.revision = 1;
		/* size = 1 + 1 + 2 + 4 + 1 + 1 + 6 + (psid->num_subauth * 4) */
		pntace->size = cpu_to_le16(28);
		size += 28;
		for (i = 0; i < NUM_AUTHS; i++)
			pntace->sid.authority[i] =
				sid_unix_NFS_mode.authority[i];
@@ -840,12 +831,23 @@ static int set_chmod_dacl(struct cifs_acl *pndacl, struct cifs_sid *pownersid,
		pntace->sid.sub_auth[1] = sid_unix_NFS_mode.sub_auth[1];
		pntace->sid.sub_auth[2] = cpu_to_le32(nmode & 07777);

		pndacl->num_aces = cpu_to_le32(4);
		/* size = 1 + 1 + 2 + 4 + 1 + 1 + 6 + (psid->num_subauth*4) */
		pntace->size = cpu_to_le16(28);
		size += 28;
		num_aces++;
	}

	size += fill_ace_for_sid((struct cifs_ace *) ((char *)pnndacl + size),
					 &sid_unix_NFS_mode, nmode, S_IRWXO);
	} else
		pndacl->num_aces = cpu_to_le32(3);
					pownersid, nmode, S_IRWXU);
	num_aces++;
	size += fill_ace_for_sid((struct cifs_ace *)((char *)pnndacl + size),
					pgrpsid, nmode, S_IRWXG);
	num_aces++;
	size += fill_ace_for_sid((struct cifs_ace *)((char *)pnndacl + size),
					 &sid_everyone, nmode, S_IRWXO);
	num_aces++;

	pndacl->num_aces = cpu_to_le32(num_aces);
	pndacl->size = cpu_to_le16(size + sizeof(struct cifs_acl));

	return 0;