summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorGordon Ross <gwr@nexenta.com>2015-09-18 22:12:35 -0400
committerGordon Ross <gwr@nexenta.com>2019-05-21 08:07:54 -0400
commit593e4726be8e43f7def1376a7c6b9fb2f448d01e (patch)
tree381100a58d7d174d596942860e272b1b42110768 /usr/src
parent1ad5cbf20bd03988a4202b25e798834123eb3c26 (diff)
downloadillumos-gate-593e4726be8e43f7def1376a7c6b9fb2f448d01e.tar.gz
10972 SMB1 tree connect missing some features
Reviewed by: Bayard Bell <bayard.bell@nexenta.com> Reviewed by: Kevin Crowe <kevin.crowe@nexenta.com> Reviewed by: Matt Barden <matt.barden@nexenta.com> Reviewed by: Evan Layton <evan.layton@nexenta.com> Approved by: Dan McDonald <danmcd@joyent.com>
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_tree_connect.c40
-rw-r--r--usr/src/uts/common/smbsrv/smb.h17
2 files changed, 49 insertions, 8 deletions
diff --git a/usr/src/uts/common/fs/smbsrv/smb_tree_connect.c b/usr/src/uts/common/fs/smbsrv/smb_tree_connect.c
index f1bb880c43..94d8be4978 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_tree_connect.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_tree_connect.c
@@ -20,7 +20,7 @@
*/
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
*/
#include <smbsrv/smb_kproto.h>
@@ -307,17 +307,27 @@ smb_sdrc_t
smb_com_tree_connect_andx(smb_request_t *sr)
{
smb_arg_tcon_t *tcon = &sr->sr_tcon;
+ smb_tree_t *tree;
char *service;
uint32_t status;
int rc;
+ if (tcon->flags & SMB_TCONX_DISCONECT_TID) {
+ tree = smb_session_lookup_tree(sr->session, sr->smb_tid);
+ if (tree != NULL) {
+ smb_session_cancel_requests(sr->session, tree, sr);
+ smb_tree_disconnect(tree, B_TRUE);
+ }
+ }
+
status = smb_tree_connect(sr);
if (status) {
smb_tcon_puterror(sr, status);
return (SDRC_ERROR);
}
+ tree = sr->tid_tree;
- switch (sr->tid_tree->t_res_type & STYPE_MASK) {
+ switch (tree->t_res_type & STYPE_MASK) {
case STYPE_IPC:
service = "IPC";
break;
@@ -330,23 +340,37 @@ smb_com_tree_connect_andx(smb_request_t *sr)
}
if (sr->session->dialect < NT_LM_0_12) {
- rc = smbsr_encode_result(sr, 2, VAR_BCC, "bb.wwss",
+ rc = smbsr_encode_result(sr, 2, VAR_BCC, "bb.ww%ss",
(char)2, /* wct */
sr->andx_com,
VAR_BCC,
VAR_BCC,
+ sr,
service,
- sr->tid_tree->t_typename);
- } else {
- rc = smbsr_encode_result(sr, 3, VAR_BCC, "bb.wwws%u",
+ tree->t_typename);
+ } else if ((tcon->flags & SMB_TCONX_EXTENDED_RESPONSE) == 0) {
+ rc = smbsr_encode_result(sr, 3, VAR_BCC, "bb.www%su",
(char)3, /* wct */
sr->andx_com,
(short)64,
tcon->optional_support,
VAR_BCC,
- service,
sr,
- sr->tid_tree->t_typename);
+ service,
+ tree->t_typename);
+
+ } else {
+ rc = smbsr_encode_result(sr, 7, VAR_BCC, "bb.wwllw%su",
+ (char)7, /* wct (b) */
+ sr->andx_com, /* AndXcmd (b) */
+ (short)72, /* AndXoff (w) */
+ tcon->optional_support, /* (w) */
+ tree->t_access, /* (l) */
+ 0, /* guest_access (l) */
+ VAR_BCC, /* (w) */
+ sr, /* (%) */
+ service, /* (s) */
+ tree->t_typename); /* (u) */
}
return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
diff --git a/usr/src/uts/common/smbsrv/smb.h b/usr/src/uts/common/smbsrv/smb.h
index 65e2708569..e7d0707d8b 100644
--- a/usr/src/uts/common/smbsrv/smb.h
+++ b/usr/src/uts/common/smbsrv/smb.h
@@ -417,6 +417,23 @@ typedef uint32_t smb_utime_t;
#define DIALECT_SMB2XXX 13 /* SMB 2.??? (switch to SMB2) */
/*
+ * SMB_TREE_CONNECT_ANDX request flags
+ *
+ * The tree specified by TID in the SMB header
+ * should be disconnected - disconnect errors
+ * should be ignored.
+ */
+#define SMB_TCONX_DISCONECT_TID 0x0001
+/*
+ * Client request for signing key protection.
+ */
+#define SMB_TCONX_EXTENDED_SIGNATURES 0x0004
+/*
+ * Client request for extended information.
+ */
+#define SMB_TCONX_EXTENDED_RESPONSE 0x0008
+
+/*
* SMB_TREE_CONNECT_ANDX OptionalSupport flags
*
* SMB_SUPPORT_SEARCH_BITS The server supports SearchAttributes.