diff options
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. |