diff options
author | Gordon Ross <gwr@nexenta.com> | 2015-09-18 22:12:35 -0400 |
---|---|---|
committer | Gordon Ross <gwr@nexenta.com> | 2019-05-21 08:07:54 -0400 |
commit | 593e4726be8e43f7def1376a7c6b9fb2f448d01e (patch) | |
tree | 381100a58d7d174d596942860e272b1b42110768 /usr/src | |
parent | 1ad5cbf20bd03988a4202b25e798834123eb3c26 (diff) | |
download | illumos-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.c | 40 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/smb.h | 17 |
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. |