Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 42c493c1 authored by Shirish Pargaonkar's avatar Shirish Pargaonkar Committed by Steve French
Browse files

cifs: prototype declaration and definition for smb 2 - 3 and cifsacl mount options



Add definition and declaration of function to get cifs acls when
mounting with smb version 2 onwards to 3.

Extend/Alter query info function to allocate and return
security descriptors within the response.

Not yet handling the error case when the size of security descriptors
in response to query exceeds SMB2_MAX_BUFFER_SIZE.

Signed-off-by: default avatarShirish Pargaonkar <shirishpargaonkar@gmail.com>
Reviewed-by: default avatarPavel Shilovsky <pshilov@microsoft.com>
Signed-off-by: default avatarSteve French <smfrench@gmail.com>
parent d38de3c6
Loading
Loading
Loading
Loading
+41 −11
Original line number Original line Diff line number Diff line
@@ -2081,8 +2081,9 @@ validate_and_copy_buf(unsigned int offset, unsigned int buffer_length,


static int
static int
query_info(const unsigned int xid, struct cifs_tcon *tcon,
query_info(const unsigned int xid, struct cifs_tcon *tcon,
	   u64 persistent_fid, u64 volatile_fid, u8 info_class,
	   u64 persistent_fid, u64 volatile_fid, u8 info_class, u8 info_type,
	   size_t output_len, size_t min_len, void *data)
	   u32 additional_info, size_t output_len, size_t min_len, void **data,
		u32 *dlen)
{
{
	struct smb2_query_info_req *req;
	struct smb2_query_info_req *req;
	struct smb2_query_info_rsp *rsp = NULL;
	struct smb2_query_info_rsp *rsp = NULL;
@@ -2108,10 +2109,11 @@ query_info(const unsigned int xid, struct cifs_tcon *tcon,
	if (encryption_required(tcon))
	if (encryption_required(tcon))
		flags |= CIFS_TRANSFORM_REQ;
		flags |= CIFS_TRANSFORM_REQ;


	req->InfoType = SMB2_O_INFO_FILE;
	req->InfoType = info_type;
	req->FileInfoClass = info_class;
	req->FileInfoClass = info_class;
	req->PersistentFileId = persistent_fid;
	req->PersistentFileId = persistent_fid;
	req->VolatileFileId = volatile_fid;
	req->VolatileFileId = volatile_fid;
	req->AdditionalInformation = cpu_to_le32(additional_info);
	/* 4 for rfc1002 length field and 1 for Buffer */
	/* 4 for rfc1002 length field and 1 for Buffer */
	req->InputBufferOffset =
	req->InputBufferOffset =
		cpu_to_le16(sizeof(struct smb2_query_info_req) - 1 - 4);
		cpu_to_le16(sizeof(struct smb2_query_info_req) - 1 - 4);
@@ -2130,24 +2132,51 @@ query_info(const unsigned int xid, struct cifs_tcon *tcon,
		goto qinf_exit;
		goto qinf_exit;
	}
	}


	if (dlen) {
		*dlen = le32_to_cpu(rsp->OutputBufferLength);
		if (!*data) {
			*data = kmalloc(*dlen, GFP_KERNEL);
			if (!*data) {
				cifs_dbg(VFS,
					"Error %d allocating memory for acl\n",
					rc);
				*dlen = 0;
				goto qinf_exit;
			}
		}
	}

	rc = validate_and_copy_buf(le16_to_cpu(rsp->OutputBufferOffset),
	rc = validate_and_copy_buf(le16_to_cpu(rsp->OutputBufferOffset),
				   le32_to_cpu(rsp->OutputBufferLength),
				   le32_to_cpu(rsp->OutputBufferLength),
				   &rsp->hdr, min_len, data);
				   &rsp->hdr, min_len, *data);


qinf_exit:
qinf_exit:
	free_rsp_buf(resp_buftype, rsp);
	free_rsp_buf(resp_buftype, rsp);
	return rc;
	return rc;
}
}


int SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon,
	u64 persistent_fid, u64 volatile_fid, struct smb2_file_all_info *data)
{
	return query_info(xid, tcon, persistent_fid, volatile_fid,
			  FILE_ALL_INFORMATION, SMB2_O_INFO_FILE, 0,
			  sizeof(struct smb2_file_all_info) + PATH_MAX * 2,
			  sizeof(struct smb2_file_all_info), (void **)&data,
			  NULL);
}

int
int
SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon,
SMB2_query_acl(const unsigned int xid, struct cifs_tcon *tcon,
		u64 persistent_fid, u64 volatile_fid,
		u64 persistent_fid, u64 volatile_fid,
		struct smb2_file_all_info *data)
		void **data, u32 *plen)
{
{
	__u32 additional_info = OWNER_SECINFO | GROUP_SECINFO | DACL_SECINFO;
	*plen = 0;

	return query_info(xid, tcon, persistent_fid, volatile_fid,
	return query_info(xid, tcon, persistent_fid, volatile_fid,
			  FILE_ALL_INFORMATION,
			  0, SMB2_O_INFO_SECURITY, additional_info,
			  sizeof(struct smb2_file_all_info) + PATH_MAX * 2,
			  SMB2_MAX_BUFFER_SIZE,
			  sizeof(struct smb2_file_all_info), data);
			  sizeof(struct smb2_file_all_info), data, plen);
}
}


int
int
@@ -2155,9 +2184,10 @@ SMB2_get_srv_num(const unsigned int xid, struct cifs_tcon *tcon,
		 u64 persistent_fid, u64 volatile_fid, __le64 *uniqueid)
		 u64 persistent_fid, u64 volatile_fid, __le64 *uniqueid)
{
{
	return query_info(xid, tcon, persistent_fid, volatile_fid,
	return query_info(xid, tcon, persistent_fid, volatile_fid,
			  FILE_INTERNAL_INFORMATION,
			  FILE_INTERNAL_INFORMATION, SMB2_O_INFO_FILE, 0,
			  sizeof(struct smb2_file_internal_info),
			  sizeof(struct smb2_file_internal_info),
			  sizeof(struct smb2_file_internal_info),
			  sizeof(struct smb2_file_internal_info), uniqueid);
			  (void **)&uniqueid, NULL);
}
}


/*
/*
+3 −0
Original line number Original line Diff line number Diff line
@@ -135,6 +135,9 @@ extern int SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon,
extern int SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon,
extern int SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon,
			   u64 persistent_file_id, u64 volatile_file_id,
			   u64 persistent_file_id, u64 volatile_file_id,
			   struct smb2_file_all_info *data);
			   struct smb2_file_all_info *data);
extern int SMB2_query_acl(const unsigned int xid, struct cifs_tcon *tcon,
			   u64 persistent_file_id, u64 volatile_file_id,
			   void **data, unsigned int *plen);
extern int SMB2_get_srv_num(const unsigned int xid, struct cifs_tcon *tcon,
extern int SMB2_get_srv_num(const unsigned int xid, struct cifs_tcon *tcon,
			    u64 persistent_fid, u64 volatile_fid,
			    u64 persistent_fid, u64 volatile_fid,
			    __le64 *uniqueid);
			    __le64 *uniqueid);