summaryrefslogtreecommitdiff
path: root/source3/smbd/smb2_tcon.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/smbd/smb2_tcon.c')
-rw-r--r--source3/smbd/smb2_tcon.c38
1 files changed, 32 insertions, 6 deletions
diff --git a/source3/smbd/smb2_tcon.c b/source3/smbd/smb2_tcon.c
index 4f305e01d5..d99c218222 100644
--- a/source3/smbd/smb2_tcon.c
+++ b/source3/smbd/smb2_tcon.c
@@ -23,7 +23,11 @@
#include "../source4/libcli/smb2/smb2_constants.h"
static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
- const char *share,
+ const char *in_path,
+ uint8_t *out_share_type,
+ uint32_t *out_share_flags,
+ uint32_t *out_capabilities,
+ uint32_t *out_maximal_access,
uint32_t *out_tree_id);
NTSTATUS smbd_smb2_request_process_tcon(struct smbd_smb2_request *req)
@@ -39,6 +43,10 @@ NTSTATUS smbd_smb2_request_process_tcon(struct smbd_smb2_request *req)
DATA_BLOB in_path_buffer;
char *in_path_string;
size_t in_path_string_size;
+ uint8_t out_share_type;
+ uint32_t out_share_flags;
+ uint32_t out_capabilities;
+ uint32_t out_maximal_access;
uint32_t out_tree_id;
NTSTATUS status;
bool ok;
@@ -77,7 +85,12 @@ NTSTATUS smbd_smb2_request_process_tcon(struct smbd_smb2_request *req)
return smbd_smb2_request_error(req, NT_STATUS_ILLEGAL_CHARACTER);
}
- status = smbd_smb2_tree_connect(req, in_path_string, &out_tree_id);
+ status = smbd_smb2_tree_connect(req, in_path_string,
+ &out_share_type,
+ &out_share_flags,
+ &out_capabilities,
+ &out_maximal_access,
+ &out_tree_id);
if (!NT_STATUS_IS_OK(status)) {
return smbd_smb2_request_error(req, status);
}
@@ -92,11 +105,15 @@ NTSTATUS smbd_smb2_request_process_tcon(struct smbd_smb2_request *req)
SIVAL(outhdr, SMB2_HDR_TID, out_tree_id);
SSVAL(outbody.data, 0x00, 0x10); /* struct size */
- SCVAL(outbody.data, 0x02, 0); /* share type */
+ SCVAL(outbody.data, 0x02,
+ out_share_type); /* share type */
SCVAL(outbody.data, 0x03, 0); /* reserved */
- SIVAL(outbody.data, 0x04, 0); /* share flags */
- SIVAL(outbody.data, 0x08, 0); /* capabilities */
- SIVAL(outbody.data, 0x0C, 0); /* maximal access */
+ SIVAL(outbody.data, 0x04,
+ out_share_flags); /* share flags */
+ SIVAL(outbody.data, 0x08,
+ out_capabilities); /* capabilities */
+ SIVAL(outbody.data, 0x0C,
+ out_maximal_access); /* maximal access */
return smbd_smb2_request_done(req, outbody, NULL);
}
@@ -121,6 +138,10 @@ static int smbd_smb2_tcon_destructor(struct smbd_smb2_tcon *tcon)
static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
const char *in_path,
+ uint8_t *out_share_type,
+ uint32_t *out_share_flags,
+ uint32_t *out_capabilities,
+ uint32_t *out_maximal_access,
uint32_t *out_tree_id)
{
const char *share = in_path;
@@ -183,6 +204,11 @@ static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
}
tcon->compat_conn->cnum = tcon->tid;
+ *out_share_type = 0x01;
+ *out_share_flags = SMB2_SHAREFLAG_ALL;
+ *out_capabilities = 0;
+ *out_maximal_access = FILE_GENERIC_ALL;
+
*out_tree_id = tcon->tid;
return NT_STATUS_OK;
}