xref: /illumos-gate/usr/src/uts/common/fs/smbsrv/smb_tree_connect.c (revision 148c5f43199ca0b43fc8e3b643aab11cd66ea327)
1da6c28aaSamw /*
2da6c28aaSamw  * CDDL HEADER START
3da6c28aaSamw  *
4da6c28aaSamw  * The contents of this file are subject to the terms of the
5da6c28aaSamw  * Common Development and Distribution License (the "License").
6da6c28aaSamw  * You may not use this file except in compliance with the License.
7da6c28aaSamw  *
8da6c28aaSamw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9da6c28aaSamw  * or http://www.opensolaris.org/os/licensing.
10da6c28aaSamw  * See the License for the specific language governing permissions
11da6c28aaSamw  * and limitations under the License.
12da6c28aaSamw  *
13da6c28aaSamw  * When distributing Covered Code, include this CDDL HEADER in each
14da6c28aaSamw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15da6c28aaSamw  * If applicable, add the following below this CDDL HEADER, with the
16da6c28aaSamw  * fields enclosed by brackets "[]" replaced with your own identifying
17da6c28aaSamw  * information: Portions Copyright [yyyy] [name of copyright owner]
18da6c28aaSamw  *
19da6c28aaSamw  * CDDL HEADER END
20da6c28aaSamw  */
21da6c28aaSamw /*
22*148c5f43SAlan Wright  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
23da6c28aaSamw  */
24da6c28aaSamw 
25bbf6f00cSJordan Brown #include <smbsrv/smb_kproto.h>
26c8ec8eeaSjose borrego 
27da6c28aaSamw 
28da6c28aaSamw /*
29c8ec8eeaSjose borrego  * SmbTreeConnect: Map a share to a tree and obtain a tree-id (TID).
30da6c28aaSamw  *
31da6c28aaSamw  * Client Request                     Description
32da6c28aaSamw  * ================================== =================================
33da6c28aaSamw  *
34da6c28aaSamw  * UCHAR WordCount;                   Count of parameter words = 0
35da6c28aaSamw  * USHORT ByteCount;                  Count of data bytes;    min = 4
36da6c28aaSamw  * UCHAR BufferFormat1;               0x04
37da6c28aaSamw  * STRING Path[];                     Server name and share name
38da6c28aaSamw  * UCHAR BufferFormat2;               0x04
39da6c28aaSamw  * STRING Password[];                 Password
40da6c28aaSamw  * UCHAR BufferFormat3;               0x04
41da6c28aaSamw  * STRING Service[];                  Service name
42da6c28aaSamw  *
43da6c28aaSamw  * The CIFS server responds with:
44da6c28aaSamw  *
45da6c28aaSamw  * Server Response                  Description
46da6c28aaSamw  * ================================ =================================
47da6c28aaSamw  *
48da6c28aaSamw  * UCHAR WordCount;                 Count of parameter words = 2
49da6c28aaSamw  * USHORT MaxBufferSize;            Max size message the server handles
50da6c28aaSamw  * USHORT Tid;                      Tree ID
51da6c28aaSamw  * USHORT ByteCount;                Count of data bytes = 0
52da6c28aaSamw  *
53da6c28aaSamw  * If the negotiated dialect is MICROSOFT NETWORKS 1.03 or earlier,
547b59d02dSjb150015  * MaxBufferSize in the response message indicates the maximum size
557b59d02dSjb150015  * message that the server can handle.  The client should not generate
567b59d02dSjb150015  * messages, nor expect to receive responses, larger than this.  This
577b59d02dSjb150015  * must be constant for a given server. For newer dialects, this field
587b59d02dSjb150015  * is ignored.
597b59d02dSjb150015  */
607b59d02dSjb150015 smb_sdrc_t
61faa1795aSjb150015 smb_pre_tree_connect(smb_request_t *sr)
62da6c28aaSamw {
63*148c5f43SAlan Wright 	smb_arg_tcon_t	*tcon = &sr->sr_tcon;
647b59d02dSjb150015 	int		rc;
657b59d02dSjb150015 
66da6c28aaSamw 	/*
677b59d02dSjb150015 	 * Perhaps this should be "%A.sA" now that unicode is enabled.
68da6c28aaSamw 	 */
69*148c5f43SAlan Wright 	rc = smbsr_decode_data(sr, "%AAA", sr, &tcon->path,
70*148c5f43SAlan Wright 	    &tcon->password, &tcon->service);
71da6c28aaSamw 
72*148c5f43SAlan Wright 	tcon->flags = 0;
73*148c5f43SAlan Wright 	tcon->optional_support = 0;
74da6c28aaSamw 
75faa1795aSjb150015 	DTRACE_SMB_2(op__TreeConnect__start, smb_request_t *, sr,
76*148c5f43SAlan Wright 	    smb_arg_tcon_t *, tcon);
77faa1795aSjb150015 
78faa1795aSjb150015 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
79faa1795aSjb150015 }
80faa1795aSjb150015 
81faa1795aSjb150015 void
82faa1795aSjb150015 smb_post_tree_connect(smb_request_t *sr)
83faa1795aSjb150015 {
84faa1795aSjb150015 	DTRACE_SMB_1(op__TreeConnect__done, smb_request_t *, sr);
85faa1795aSjb150015 }
86faa1795aSjb150015 
87faa1795aSjb150015 smb_sdrc_t
88faa1795aSjb150015 smb_com_tree_connect(smb_request_t *sr)
89faa1795aSjb150015 {
90c8ec8eeaSjose borrego 	smb_tree_t *tree;
91faa1795aSjb150015 	int rc;
92faa1795aSjb150015 
93c8ec8eeaSjose borrego 	if ((tree = smb_tree_connect(sr)) == NULL)
94faa1795aSjb150015 		return (SDRC_ERROR);
95da6c28aaSamw 
96c8ec8eeaSjose borrego 	sr->smb_tid = tree->t_tid;
97c8ec8eeaSjose borrego 	sr->tid_tree = tree;
98c8ec8eeaSjose borrego 
997b59d02dSjb150015 	rc = smbsr_encode_result(sr, 2, 0, "bwww",
100da6c28aaSamw 	    2,				/* wct */
101da6c28aaSamw 	    (WORD)smb_maxbufsize,	/* MaxBufferSize */
102da6c28aaSamw 	    sr->smb_tid,		/* TID */
103da6c28aaSamw 	    0);				/* bcc */
104da6c28aaSamw 
105faa1795aSjb150015 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
106da6c28aaSamw }
107c8ec8eeaSjose borrego 
108c8ec8eeaSjose borrego /*
109c8ec8eeaSjose borrego  * SmbTreeConnectX: Map a share to a tree and obtain a tree-id (TID).
110c8ec8eeaSjose borrego  *
111c8ec8eeaSjose borrego  * Client Request                     Description
112c8ec8eeaSjose borrego  * =================================  =================================
113c8ec8eeaSjose borrego  *
114c8ec8eeaSjose borrego  * UCHAR WordCount;                   Count of parameter words = 4
115c8ec8eeaSjose borrego  * UCHAR AndXCommand;                 Secondary (X) command; 0xFF = none
116c8ec8eeaSjose borrego  * UCHAR AndXReserved;                Reserved (must be 0)
117c8ec8eeaSjose borrego  * USHORT AndXOffset;                 Offset to next command WordCount
118c8ec8eeaSjose borrego  * USHORT Flags;                      Additional information
119c8ec8eeaSjose borrego  *                                    bit 0 set = disconnect Tid
120c8ec8eeaSjose borrego  * USHORT PasswordLength;             Length of Password[]
121c8ec8eeaSjose borrego  * USHORT ByteCount;                  Count of data bytes;    min = 3
122c8ec8eeaSjose borrego  * UCHAR Password[];                  Password
123c8ec8eeaSjose borrego  * STRING Path[];                     Server name and share name
124c8ec8eeaSjose borrego  * STRING Service[];                  Service name
125c8ec8eeaSjose borrego  *
126c8ec8eeaSjose borrego  * If the negotiated dialect is LANMAN1.0 or later, then it is a protocol
127c8ec8eeaSjose borrego  * violation for the client to send this message prior to a successful
128c8ec8eeaSjose borrego  * SMB_COM_SESSION_SETUP_ANDX, and the server ignores Password.
129c8ec8eeaSjose borrego  *
130c8ec8eeaSjose borrego  * If the negotiated dialect is prior to LANMAN1.0 and the client has not
131c8ec8eeaSjose borrego  * sent a successful SMB_COM_SESSION_SETUP_ANDX request when the tree
132c8ec8eeaSjose borrego  * connect arrives, a user level security mode server must nevertheless
133c8ec8eeaSjose borrego  * validate the client's credentials.
134c8ec8eeaSjose borrego  *
1358d7e4166Sjose borrego  * Flags (prefix with TREE_CONNECT_ANDX_):
1368d7e4166Sjose borrego  * ==========================  ========================================
1378d7e4166Sjose borrego  * 0x0001 DISCONECT_TID        The tree specified by TID in the SMB header
1388d7e4166Sjose borrego  *                             should be disconnected - disconnect errors
1398d7e4166Sjose borrego  *                             should be ignored.
1408d7e4166Sjose borrego  *
1418d7e4166Sjose borrego  * 0x0004 EXTENDED_SIGNATURES  Client request for signing key protection.
1428d7e4166Sjose borrego  *
1438d7e4166Sjose borrego  * 0x0008 EXTENDED_RESPONSE    Client request for extended information.
1448d7e4166Sjose borrego  *
1458d7e4166Sjose borrego  * Path follows UNC style syntax (\\server\share) and indicates the name
1468d7e4166Sjose borrego  * of the resource to which the client wishes to connect.
147c8ec8eeaSjose borrego  *
148c8ec8eeaSjose borrego  * Because Password may be an authentication response, it is a variable
149c8ec8eeaSjose borrego  * length field with the length specified by PasswordLength.   If
150c8ec8eeaSjose borrego  * authentication is not being used, Password should be a null terminated
151c8ec8eeaSjose borrego  * ASCII string with PasswordLength set to the string size including the
152c8ec8eeaSjose borrego  * terminating null.
153c8ec8eeaSjose borrego  *
154c8ec8eeaSjose borrego  * The server can enforce whatever policy it desires to govern share
155c8ec8eeaSjose borrego  * access.  Administrative privilege is required for administrative
156c8ec8eeaSjose borrego  * shares (C$, etc.).
157c8ec8eeaSjose borrego  *
158c8ec8eeaSjose borrego  * The Service component indicates the type of resource the client
159c8ec8eeaSjose borrego  * intends to access.  Valid values are:
160c8ec8eeaSjose borrego  *
161c8ec8eeaSjose borrego  * Service   Description               Earliest Dialect Allowed
162c8ec8eeaSjose borrego  * ========  ========================  ================================
163c8ec8eeaSjose borrego  *
164c8ec8eeaSjose borrego  * A:        disk share                PC NETWORK PROGRAM 1.0
165c8ec8eeaSjose borrego  * LPT1:     printer                   PC NETWORK PROGRAM 1.0
166c8ec8eeaSjose borrego  * IPC       named pipe                MICROSOFT NETWORKS 3.0
167c8ec8eeaSjose borrego  * COMM      communications device     MICROSOFT NETWORKS 3.0
168c8ec8eeaSjose borrego  * ?????     any type of device        MICROSOFT NETWORKS 3.0
169c8ec8eeaSjose borrego  *
170c8ec8eeaSjose borrego  * If the negotiated dialect is earlier than DOS LANMAN2.1, the response to
171c8ec8eeaSjose borrego  * this SMB is:
172c8ec8eeaSjose borrego  *
173c8ec8eeaSjose borrego  * Server Response                  Description
174c8ec8eeaSjose borrego  * ================================ ===================================
175c8ec8eeaSjose borrego  *
176c8ec8eeaSjose borrego  * UCHAR WordCount;                 Count of parameter words = 2
177c8ec8eeaSjose borrego  * UCHAR AndXCommand;               Secondary (X) command;  0xFF = none
178c8ec8eeaSjose borrego  * UCHAR AndXReserved;              Reserved (must be 0)
179c8ec8eeaSjose borrego  * USHORT AndXOffset;               Offset to next command WordCount
180c8ec8eeaSjose borrego  * USHORT ByteCount;                Count of data bytes;    min = 3
181c8ec8eeaSjose borrego  *
182c8ec8eeaSjose borrego  * If the negotiated is DOS LANMAN2.1 or later, the response to this SMB
183c8ec8eeaSjose borrego  * is:
184c8ec8eeaSjose borrego  *
185c8ec8eeaSjose borrego  * Server Response                  Description
186c8ec8eeaSjose borrego  * ================================ ===================================
187c8ec8eeaSjose borrego  *
188c8ec8eeaSjose borrego  * UCHAR WordCount;                 Count of parameter words = 3
189c8ec8eeaSjose borrego  * UCHAR AndXCommand;               Secondary (X) command;  0xFF = none
190c8ec8eeaSjose borrego  * UCHAR AndXReserved;              Reserved (must be 0)
191c8ec8eeaSjose borrego  * USHORT AndXOffset;               Offset to next command WordCount
192c8ec8eeaSjose borrego  * USHORT OptionalSupport;          Optional support bits
193c8ec8eeaSjose borrego  * USHORT ByteCount;                Count of data bytes;    min = 3
194c8ec8eeaSjose borrego  * UCHAR Service[];                 Service type connected to.  Always
195c8ec8eeaSjose borrego  *                                   ANSII.
196c8ec8eeaSjose borrego  * STRING NativeFileSystem[];       Native file system for this tree
197c8ec8eeaSjose borrego  *
198c8ec8eeaSjose borrego  * NativeFileSystem is the name of the filesystem; values to be expected
199c8ec8eeaSjose borrego  * include FAT, NTFS, etc.
200c8ec8eeaSjose borrego  *
2018d7e4166Sjose borrego  * OptionalSupport:
2028d7e4166Sjose borrego  * ==============================  ==========================
2038d7e4166Sjose borrego  * 0x0001 SMB_SUPPORT_SEARCH_BITS  The server supports the use of Search
2048d7e4166Sjose borrego  *                                 Attributes in client requests.
2058d7e4166Sjose borrego  * 0x0002 SMB_SHARE_IS_IN_DFS      The share is managed by DFS.
2068d7e4166Sjose borrego  * 0x000C SMB_CSC_MASK             Offline-caching mask - see CSC flags.
2078d7e4166Sjose borrego  * 0x0010 SMB_UNIQUE_FILE_NAME     The server uses long names and does not
2088d7e4166Sjose borrego  *                                 support short names.  Indicator for
2098d7e4166Sjose borrego  *                                 clients directory/name-space caching.
2108d7e4166Sjose borrego  * 0x0020 SMB_EXTENDED_SIGNATURES  The server will use signing key protection.
211c8ec8eeaSjose borrego  *
2128d7e4166Sjose borrego  * Client-side caching (offline files):
2138d7e4166Sjose borrego  * ==============================  ==========================
2148d7e4166Sjose borrego  * 0x0000 SMB_CSC_CACHE_MANUAL_REINT Clients may cache files for offline use
2158d7e4166Sjose borrego  *                                 but automatic file-by-file reintegration
2168d7e4166Sjose borrego  *                                 is not allowed.
2178d7e4166Sjose borrego  * 0x0004 SMB_CSC_CACHE_AUTO_REINT Automatic file-by-file reintegration is
2188d7e4166Sjose borrego  *                                 allowed.
2198d7e4166Sjose borrego  * 0x0008 SMB_CSC_CACHE_VDO        File opens do not need to be flowed.
2208d7e4166Sjose borrego  * 0x000C SMB_CSC_CACHE_NONE       CSC is disabled for this share.
221c8ec8eeaSjose borrego  *
222c8ec8eeaSjose borrego  * Some servers negotiate "DOS LANMAN2.1" dialect or later and still send
223c8ec8eeaSjose borrego  * the "downlevel" (i.e. wordcount==2) response.  Valid AndX following
224c8ec8eeaSjose borrego  * commands are
225c8ec8eeaSjose borrego  *
226c8ec8eeaSjose borrego  * SMB_COM_OPEN              SMB_COM_OPEN_ANDX          SMB_COM_CREATE
227c8ec8eeaSjose borrego  * SMB_COM_CREATE_NEW        SMB_COM_CREATE_DIRECTORY   SMB_COM_DELETE
228c8ec8eeaSjose borrego  * SMB_COM_DELETE_DIRECTORY  SMB_COM_FIND               SMB_COM_COPY
229c8ec8eeaSjose borrego  * SMB_COM_FIND_UNIQUE       SMB_COM_RENAME
230c8ec8eeaSjose borrego  * SMB_COM_CHECK_DIRECTORY   SMB_COM_QUERY_INFORMATION
231c8ec8eeaSjose borrego  * SMB_COM_GET_PRINT_QUEUE   SMB_COM_OPEN_PRINT_FILE
232c8ec8eeaSjose borrego  * SMB_COM_TRANSACTION       SMB_COM_NO_ANDX_CMD
233c8ec8eeaSjose borrego  * SMB_COM_SET_INFORMATION   SMB_COM_NT_RENAME
234c8ec8eeaSjose borrego  *
235c8ec8eeaSjose borrego  * Errors:
236c8ec8eeaSjose borrego  * ERRDOS/ERRnomem
237c8ec8eeaSjose borrego  * ERRDOS/ERRbadpath
238c8ec8eeaSjose borrego  * ERRDOS/ERRinvdevice
239c8ec8eeaSjose borrego  * ERRSRV/ERRaccess
240c8ec8eeaSjose borrego  * ERRSRV/ERRbadpw
241c8ec8eeaSjose borrego  * ERRSRV/ERRinvnetname
242c8ec8eeaSjose borrego  */
243c8ec8eeaSjose borrego smb_sdrc_t
244c8ec8eeaSjose borrego smb_pre_tree_connect_andx(smb_request_t *sr)
245c8ec8eeaSjose borrego {
246*148c5f43SAlan Wright 	smb_arg_tcon_t	*tcon = &sr->sr_tcon;
247c8ec8eeaSjose borrego 	uint8_t		*pwbuf = NULL;
248c8ec8eeaSjose borrego 	uint16_t	pwlen = 0;
249c8ec8eeaSjose borrego 	int		rc;
250c8ec8eeaSjose borrego 
251c8ec8eeaSjose borrego 	rc = smbsr_decode_vwv(sr, "b.www", &sr->andx_com, &sr->andx_off,
252*148c5f43SAlan Wright 	    &tcon->flags, &pwlen);
253c8ec8eeaSjose borrego 	if (rc == 0) {
2549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (pwlen != 0)
2559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			pwbuf = smb_srm_zalloc(sr, pwlen);
256c8ec8eeaSjose borrego 
257c8ec8eeaSjose borrego 		rc = smbsr_decode_data(sr, "%#cus", sr, pwlen, pwbuf,
258*148c5f43SAlan Wright 		    &tcon->path, &tcon->service);
259c8ec8eeaSjose borrego 
260*148c5f43SAlan Wright 		tcon->pwdlen = pwlen;
261*148c5f43SAlan Wright 		tcon->password = (char *)pwbuf;
262c8ec8eeaSjose borrego 	}
263c8ec8eeaSjose borrego 
264*148c5f43SAlan Wright 	tcon->optional_support = 0;
2658d7e4166Sjose borrego 
266c8ec8eeaSjose borrego 	DTRACE_SMB_2(op__TreeConnectX__start, smb_request_t *, sr,
267*148c5f43SAlan Wright 	    smb_arg_tcon_t *, tcon);
268c8ec8eeaSjose borrego 
269c8ec8eeaSjose borrego 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
270c8ec8eeaSjose borrego }
271c8ec8eeaSjose borrego 
272c8ec8eeaSjose borrego void
273c8ec8eeaSjose borrego smb_post_tree_connect_andx(smb_request_t *sr)
274c8ec8eeaSjose borrego {
275c8ec8eeaSjose borrego 	DTRACE_SMB_1(op__TreeConnectX__done, smb_request_t *, sr);
276c8ec8eeaSjose borrego }
277c8ec8eeaSjose borrego 
278c8ec8eeaSjose borrego smb_sdrc_t
279c8ec8eeaSjose borrego smb_com_tree_connect_andx(smb_request_t *sr)
280c8ec8eeaSjose borrego {
281*148c5f43SAlan Wright 	smb_arg_tcon_t	*tcon = &sr->sr_tcon;
282c8ec8eeaSjose borrego 	smb_tree_t	*tree;
283c8ec8eeaSjose borrego 	char		*service;
284c8ec8eeaSjose borrego 	int		rc;
285c8ec8eeaSjose borrego 
286c8ec8eeaSjose borrego 	if ((tree = smb_tree_connect(sr)) == NULL)
287c8ec8eeaSjose borrego 		return (SDRC_ERROR);
288c8ec8eeaSjose borrego 
289c8ec8eeaSjose borrego 	sr->smb_tid = tree->t_tid;
290c8ec8eeaSjose borrego 	sr->tid_tree = tree;
291c8ec8eeaSjose borrego 
292*148c5f43SAlan Wright 	switch (tree->t_res_type & STYPE_MASK) {
293*148c5f43SAlan Wright 	case STYPE_IPC:
294c8ec8eeaSjose borrego 		service = "IPC";
295*148c5f43SAlan Wright 		break;
296*148c5f43SAlan Wright 	case STYPE_PRINTQ:
297*148c5f43SAlan Wright 		service = "LPT1:";
298*148c5f43SAlan Wright 		break;
299*148c5f43SAlan Wright 	case STYPE_DISKTREE:
300*148c5f43SAlan Wright 	default:
301c8ec8eeaSjose borrego 		service = "A:";
302*148c5f43SAlan Wright 	}
303c8ec8eeaSjose borrego 
304c8ec8eeaSjose borrego 	if (sr->session->dialect < NT_LM_0_12) {
305c8ec8eeaSjose borrego 		rc = smbsr_encode_result(sr, 2, VAR_BCC, "bb.wwss",
306c8ec8eeaSjose borrego 		    (char)2,		/* wct */
307c8ec8eeaSjose borrego 		    sr->andx_com,
308c8ec8eeaSjose borrego 		    VAR_BCC,
309c8ec8eeaSjose borrego 		    VAR_BCC,
310c8ec8eeaSjose borrego 		    service,
311c8ec8eeaSjose borrego 		    sr->tid_tree->t_typename);
312c8ec8eeaSjose borrego 	} else {
313c8ec8eeaSjose borrego 		rc = smbsr_encode_result(sr, 3, VAR_BCC, "bb.wwws%u",
314c8ec8eeaSjose borrego 		    (char)3,		/* wct */
315c8ec8eeaSjose borrego 		    sr->andx_com,
316c8ec8eeaSjose borrego 		    (short)64,
317*148c5f43SAlan Wright 		    tcon->optional_support,
318c8ec8eeaSjose borrego 		    VAR_BCC,
319c8ec8eeaSjose borrego 		    service,
320c8ec8eeaSjose borrego 		    sr,
321c8ec8eeaSjose borrego 		    sr->tid_tree->t_typename);
322c8ec8eeaSjose borrego 	}
323c8ec8eeaSjose borrego 
324c8ec8eeaSjose borrego 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
325c8ec8eeaSjose borrego }
326c8ec8eeaSjose borrego 
327c8ec8eeaSjose borrego /*
328c8ec8eeaSjose borrego  * SmbTreeDisconnect: Disconnect a tree.
329c8ec8eeaSjose borrego  *
330c8ec8eeaSjose borrego  * Note: SDDF_SUPPRESS_UID is set for this operation, which means the sr
331c8ec8eeaSjose borrego  * uid_user field will not be valid on entry to these functions.  Do not
332c8ec8eeaSjose borrego  * use it until it is set up in smb_com_tree_disconnect() or the system
333c8ec8eeaSjose borrego  * will panic.
334c8ec8eeaSjose borrego  *
335c8ec8eeaSjose borrego  * Note: there are scenarios in which the client does not send a tree
336c8ec8eeaSjose borrego  * disconnect request, for example, when ERRbaduid is returned from
337c8ec8eeaSjose borrego  * SmbReadX after a user has logged off.  Any open files will remain
338c8ec8eeaSjose borrego  * around until the session is destroyed.
339c8ec8eeaSjose borrego  *
340c8ec8eeaSjose borrego  * Client Request                     Description
341c8ec8eeaSjose borrego  * ================================== =================================
342c8ec8eeaSjose borrego  *
343c8ec8eeaSjose borrego  * UCHAR WordCount;                   Count of parameter words = 0
344c8ec8eeaSjose borrego  * USHORT ByteCount;                  Count of data bytes = 0
345c8ec8eeaSjose borrego  *
346c8ec8eeaSjose borrego  * The resource sharing connection identified by Tid in the SMB header is
347c8ec8eeaSjose borrego  * logically disconnected from the server. Tid is invalidated; it will not
348c8ec8eeaSjose borrego  * be recognized if used by the client for subsequent requests. All locks,
349c8ec8eeaSjose borrego  * open files, etc. created on behalf of Tid are released.
350c8ec8eeaSjose borrego  *
351c8ec8eeaSjose borrego  * Server Response                    Description
352c8ec8eeaSjose borrego  * ================================== =================================
353c8ec8eeaSjose borrego  *
354c8ec8eeaSjose borrego  * UCHAR WordCount;                   Count of parameter words = 0
355c8ec8eeaSjose borrego  * USHORT ByteCount;                  Count of data bytes = 0
356c8ec8eeaSjose borrego  *
357c8ec8eeaSjose borrego  * Errors:
358c8ec8eeaSjose borrego  * ERRSRV/ERRinvnid
359c8ec8eeaSjose borrego  * ERRSRV/ERRbaduid
360c8ec8eeaSjose borrego  */
361c8ec8eeaSjose borrego smb_sdrc_t
362c8ec8eeaSjose borrego smb_pre_tree_disconnect(smb_request_t *sr)
363c8ec8eeaSjose borrego {
364*148c5f43SAlan Wright 	sr->uid_user = smb_session_lookup_uid(sr->session, sr->smb_uid);
365*148c5f43SAlan Wright 	if (sr->uid_user != NULL)
366*148c5f43SAlan Wright 		sr->tid_tree = smb_user_lookup_tree(sr->uid_user, sr->smb_tid);
367*148c5f43SAlan Wright 
368c8ec8eeaSjose borrego 	DTRACE_SMB_1(op__TreeDisconnect__start, smb_request_t *, sr);
369c8ec8eeaSjose borrego 	return (SDRC_SUCCESS);
370c8ec8eeaSjose borrego }
371c8ec8eeaSjose borrego 
372c8ec8eeaSjose borrego void
373c8ec8eeaSjose borrego smb_post_tree_disconnect(smb_request_t *sr)
374c8ec8eeaSjose borrego {
375c8ec8eeaSjose borrego 	DTRACE_SMB_1(op__TreeDisconnect__done, smb_request_t *, sr);
376c8ec8eeaSjose borrego }
377c8ec8eeaSjose borrego 
378c8ec8eeaSjose borrego /*
379c8ec8eeaSjose borrego  * SmbTreeDisconnect requires a valid UID as well as a valid TID.  Some
380c8ec8eeaSjose borrego  * clients logoff a user and then try to disconnect the trees connected
381c8ec8eeaSjose borrego  * by the user who has just been logged off, which would normally fail
382c8ec8eeaSjose borrego  * in the dispatch code with ERRbaduid but, unfortunately, ERRbaduid
383c8ec8eeaSjose borrego  * causes a problem for some of those clients.  Windows returns ERRinvnid.
384c8ec8eeaSjose borrego  *
385c8ec8eeaSjose borrego  * To prevent ERRbaduid being returned, the UID and TID are looked up here
386c8ec8eeaSjose borrego  * rather than prior to dispatching SmbTreeDisconnect requests.  If either
387c8ec8eeaSjose borrego  * the UID or the TID is invalid, ERRinvnid is returned.
388c8ec8eeaSjose borrego  */
389c8ec8eeaSjose borrego smb_sdrc_t
390c8ec8eeaSjose borrego smb_com_tree_disconnect(smb_request_t *sr)
391c8ec8eeaSjose borrego {
392c8ec8eeaSjose borrego 	if (sr->uid_user == NULL || sr->tid_tree == NULL) {
393c8ec8eeaSjose borrego 		smbsr_error(sr, NT_STATUS_INVALID_HANDLE, ERRDOS, ERRinvnid);
394c8ec8eeaSjose borrego 		return (SDRC_ERROR);
395c8ec8eeaSjose borrego 	}
396c8ec8eeaSjose borrego 
397b89a8333Snatalie li - Sun Microsystems - Irvine United States 	sr->user_cr = smb_user_getcred(sr->uid_user);
398b89a8333Snatalie li - Sun Microsystems - Irvine United States 
399c8ec8eeaSjose borrego 	smb_session_cancel_requests(sr->session, sr->tid_tree, sr);
40029bd2886SAlan Wright 	smb_tree_disconnect(sr->tid_tree, B_TRUE);
401c8ec8eeaSjose borrego 
402c8ec8eeaSjose borrego 	if (smbsr_encode_empty_result(sr))
403c8ec8eeaSjose borrego 		return (SDRC_ERROR);
404c8ec8eeaSjose borrego 
405c8ec8eeaSjose borrego 	return (SDRC_SUCCESS);
406c8ec8eeaSjose borrego }
407