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 /* 227b59d02dSjb150015 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23da6c28aaSamw * Use is subject to license terms. 24da6c28aaSamw */ 25da6c28aaSamw 26c8ec8eeaSjose borrego #include <smbsrv/smb_incl.h> 27c8ec8eeaSjose borrego 28da6c28aaSamw 29da6c28aaSamw /* 30c8ec8eeaSjose borrego * SmbTreeConnect: Map a share to a tree and obtain a tree-id (TID). 31da6c28aaSamw * 32da6c28aaSamw * Client Request Description 33da6c28aaSamw * ================================== ================================= 34da6c28aaSamw * 35da6c28aaSamw * UCHAR WordCount; Count of parameter words = 0 36da6c28aaSamw * USHORT ByteCount; Count of data bytes; min = 4 37da6c28aaSamw * UCHAR BufferFormat1; 0x04 38da6c28aaSamw * STRING Path[]; Server name and share name 39da6c28aaSamw * UCHAR BufferFormat2; 0x04 40da6c28aaSamw * STRING Password[]; Password 41da6c28aaSamw * UCHAR BufferFormat3; 0x04 42da6c28aaSamw * STRING Service[]; Service name 43da6c28aaSamw * 44da6c28aaSamw * The CIFS server responds with: 45da6c28aaSamw * 46da6c28aaSamw * Server Response Description 47da6c28aaSamw * ================================ ================================= 48da6c28aaSamw * 49da6c28aaSamw * UCHAR WordCount; Count of parameter words = 2 50da6c28aaSamw * USHORT MaxBufferSize; Max size message the server handles 51da6c28aaSamw * USHORT Tid; Tree ID 52da6c28aaSamw * USHORT ByteCount; Count of data bytes = 0 53da6c28aaSamw * 54da6c28aaSamw * If the negotiated dialect is MICROSOFT NETWORKS 1.03 or earlier, 557b59d02dSjb150015 * MaxBufferSize in the response message indicates the maximum size 567b59d02dSjb150015 * message that the server can handle. The client should not generate 577b59d02dSjb150015 * messages, nor expect to receive responses, larger than this. This 587b59d02dSjb150015 * must be constant for a given server. For newer dialects, this field 597b59d02dSjb150015 * is ignored. 607b59d02dSjb150015 */ 617b59d02dSjb150015 smb_sdrc_t 62faa1795aSjb150015 smb_pre_tree_connect(smb_request_t *sr) 63da6c28aaSamw { 647b59d02dSjb150015 int rc; 657b59d02dSjb150015 66da6c28aaSamw /* 677b59d02dSjb150015 * Perhaps this should be "%A.sA" now that unicode is enabled. 68da6c28aaSamw */ 697b59d02dSjb150015 rc = smbsr_decode_data(sr, "%AAA", sr, &sr->arg.tcon.path, 707b59d02dSjb150015 &sr->arg.tcon.password, &sr->arg.tcon.service); 71da6c28aaSamw 72da6c28aaSamw sr->arg.tcon.flags = 0; 73*8d7e4166Sjose borrego sr->arg.tcon.optional_support = 0; 74da6c28aaSamw 75faa1795aSjb150015 DTRACE_SMB_2(op__TreeConnect__start, smb_request_t *, sr, 76faa1795aSjb150015 struct tcon *, &sr->arg.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 * 135*8d7e4166Sjose borrego * Flags (prefix with TREE_CONNECT_ANDX_): 136*8d7e4166Sjose borrego * ========================== ======================================== 137*8d7e4166Sjose borrego * 0x0001 DISCONECT_TID The tree specified by TID in the SMB header 138*8d7e4166Sjose borrego * should be disconnected - disconnect errors 139*8d7e4166Sjose borrego * should be ignored. 140*8d7e4166Sjose borrego * 141*8d7e4166Sjose borrego * 0x0004 EXTENDED_SIGNATURES Client request for signing key protection. 142*8d7e4166Sjose borrego * 143*8d7e4166Sjose borrego * 0x0008 EXTENDED_RESPONSE Client request for extended information. 144*8d7e4166Sjose borrego * 145*8d7e4166Sjose borrego * Path follows UNC style syntax (\\server\share) and indicates the name 146*8d7e4166Sjose 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 * 201*8d7e4166Sjose borrego * OptionalSupport: 202*8d7e4166Sjose borrego * ============================== ========================== 203*8d7e4166Sjose borrego * 0x0001 SMB_SUPPORT_SEARCH_BITS The server supports the use of Search 204*8d7e4166Sjose borrego * Attributes in client requests. 205*8d7e4166Sjose borrego * 0x0002 SMB_SHARE_IS_IN_DFS The share is managed by DFS. 206*8d7e4166Sjose borrego * 0x000C SMB_CSC_MASK Offline-caching mask - see CSC flags. 207*8d7e4166Sjose borrego * 0x0010 SMB_UNIQUE_FILE_NAME The server uses long names and does not 208*8d7e4166Sjose borrego * support short names. Indicator for 209*8d7e4166Sjose borrego * clients directory/name-space caching. 210*8d7e4166Sjose borrego * 0x0020 SMB_EXTENDED_SIGNATURES The server will use signing key protection. 211c8ec8eeaSjose borrego * 212*8d7e4166Sjose borrego * Client-side caching (offline files): 213*8d7e4166Sjose borrego * ============================== ========================== 214*8d7e4166Sjose borrego * 0x0000 SMB_CSC_CACHE_MANUAL_REINT Clients may cache files for offline use 215*8d7e4166Sjose borrego * but automatic file-by-file reintegration 216*8d7e4166Sjose borrego * is not allowed. 217*8d7e4166Sjose borrego * 0x0004 SMB_CSC_CACHE_AUTO_REINT Automatic file-by-file reintegration is 218*8d7e4166Sjose borrego * allowed. 219*8d7e4166Sjose borrego * 0x0008 SMB_CSC_CACHE_VDO File opens do not need to be flowed. 220*8d7e4166Sjose 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 { 246c8ec8eeaSjose borrego uint8_t *pwbuf = NULL; 247c8ec8eeaSjose borrego uint16_t pwlen = 0; 248c8ec8eeaSjose borrego int rc; 249c8ec8eeaSjose borrego 250c8ec8eeaSjose borrego rc = smbsr_decode_vwv(sr, "b.www", &sr->andx_com, &sr->andx_off, 251c8ec8eeaSjose borrego &sr->arg.tcon.flags, &pwlen); 252c8ec8eeaSjose borrego if (rc == 0) { 253c8ec8eeaSjose borrego if (pwlen != 0) { 254c8ec8eeaSjose borrego pwbuf = (uint8_t *)smbsr_malloc(&sr->request_storage, 255c8ec8eeaSjose borrego pwlen); 256c8ec8eeaSjose borrego bzero(pwbuf, pwlen); 257c8ec8eeaSjose borrego } 258c8ec8eeaSjose borrego 259c8ec8eeaSjose borrego rc = smbsr_decode_data(sr, "%#cus", sr, pwlen, pwbuf, 260c8ec8eeaSjose borrego &sr->arg.tcon.path, &sr->arg.tcon.service); 261c8ec8eeaSjose borrego 262c8ec8eeaSjose borrego sr->arg.tcon.pwdlen = pwlen; 263c8ec8eeaSjose borrego sr->arg.tcon.password = (char *)pwbuf; 264c8ec8eeaSjose borrego } 265c8ec8eeaSjose borrego 266*8d7e4166Sjose borrego sr->arg.tcon.optional_support = 0; 267*8d7e4166Sjose borrego 268c8ec8eeaSjose borrego DTRACE_SMB_2(op__TreeConnectX__start, smb_request_t *, sr, 269c8ec8eeaSjose borrego struct tcon *, &sr->arg.tcon); 270c8ec8eeaSjose borrego 271c8ec8eeaSjose borrego return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR); 272c8ec8eeaSjose borrego } 273c8ec8eeaSjose borrego 274c8ec8eeaSjose borrego void 275c8ec8eeaSjose borrego smb_post_tree_connect_andx(smb_request_t *sr) 276c8ec8eeaSjose borrego { 277c8ec8eeaSjose borrego DTRACE_SMB_1(op__TreeConnectX__done, smb_request_t *, sr); 278c8ec8eeaSjose borrego } 279c8ec8eeaSjose borrego 280c8ec8eeaSjose borrego smb_sdrc_t 281c8ec8eeaSjose borrego smb_com_tree_connect_andx(smb_request_t *sr) 282c8ec8eeaSjose borrego { 283c8ec8eeaSjose borrego smb_tree_t *tree; 284c8ec8eeaSjose borrego char *service; 285c8ec8eeaSjose borrego int rc; 286c8ec8eeaSjose borrego 287c8ec8eeaSjose borrego if ((tree = smb_tree_connect(sr)) == NULL) 288c8ec8eeaSjose borrego return (SDRC_ERROR); 289c8ec8eeaSjose borrego 290c8ec8eeaSjose borrego sr->smb_tid = tree->t_tid; 291c8ec8eeaSjose borrego sr->tid_tree = tree; 292c8ec8eeaSjose borrego 293c8ec8eeaSjose borrego if (STYPE_ISIPC(tree->t_res_type)) 294c8ec8eeaSjose borrego service = "IPC"; 295c8ec8eeaSjose borrego else 296c8ec8eeaSjose borrego service = "A:"; 297c8ec8eeaSjose borrego 298c8ec8eeaSjose borrego if (sr->session->dialect < NT_LM_0_12) { 299c8ec8eeaSjose borrego rc = smbsr_encode_result(sr, 2, VAR_BCC, "bb.wwss", 300c8ec8eeaSjose borrego (char)2, /* wct */ 301c8ec8eeaSjose borrego sr->andx_com, 302c8ec8eeaSjose borrego VAR_BCC, 303c8ec8eeaSjose borrego VAR_BCC, 304c8ec8eeaSjose borrego service, 305c8ec8eeaSjose borrego sr->tid_tree->t_typename); 306c8ec8eeaSjose borrego } else { 307c8ec8eeaSjose borrego rc = smbsr_encode_result(sr, 3, VAR_BCC, "bb.wwws%u", 308c8ec8eeaSjose borrego (char)3, /* wct */ 309c8ec8eeaSjose borrego sr->andx_com, 310c8ec8eeaSjose borrego (short)64, 311*8d7e4166Sjose borrego sr->arg.tcon.optional_support, 312c8ec8eeaSjose borrego VAR_BCC, 313c8ec8eeaSjose borrego service, 314c8ec8eeaSjose borrego sr, 315c8ec8eeaSjose borrego sr->tid_tree->t_typename); 316c8ec8eeaSjose borrego } 317c8ec8eeaSjose borrego 318c8ec8eeaSjose borrego return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR); 319c8ec8eeaSjose borrego } 320c8ec8eeaSjose borrego 321c8ec8eeaSjose borrego /* 322c8ec8eeaSjose borrego * SmbTreeDisconnect: Disconnect a tree. 323c8ec8eeaSjose borrego * 324c8ec8eeaSjose borrego * Note: SDDF_SUPPRESS_UID is set for this operation, which means the sr 325c8ec8eeaSjose borrego * uid_user field will not be valid on entry to these functions. Do not 326c8ec8eeaSjose borrego * use it until it is set up in smb_com_tree_disconnect() or the system 327c8ec8eeaSjose borrego * will panic. 328c8ec8eeaSjose borrego * 329c8ec8eeaSjose borrego * Note: there are scenarios in which the client does not send a tree 330c8ec8eeaSjose borrego * disconnect request, for example, when ERRbaduid is returned from 331c8ec8eeaSjose borrego * SmbReadX after a user has logged off. Any open files will remain 332c8ec8eeaSjose borrego * around until the session is destroyed. 333c8ec8eeaSjose borrego * 334c8ec8eeaSjose borrego * Client Request Description 335c8ec8eeaSjose borrego * ================================== ================================= 336c8ec8eeaSjose borrego * 337c8ec8eeaSjose borrego * UCHAR WordCount; Count of parameter words = 0 338c8ec8eeaSjose borrego * USHORT ByteCount; Count of data bytes = 0 339c8ec8eeaSjose borrego * 340c8ec8eeaSjose borrego * The resource sharing connection identified by Tid in the SMB header is 341c8ec8eeaSjose borrego * logically disconnected from the server. Tid is invalidated; it will not 342c8ec8eeaSjose borrego * be recognized if used by the client for subsequent requests. All locks, 343c8ec8eeaSjose borrego * open files, etc. created on behalf of Tid are released. 344c8ec8eeaSjose borrego * 345c8ec8eeaSjose borrego * Server Response Description 346c8ec8eeaSjose borrego * ================================== ================================= 347c8ec8eeaSjose borrego * 348c8ec8eeaSjose borrego * UCHAR WordCount; Count of parameter words = 0 349c8ec8eeaSjose borrego * USHORT ByteCount; Count of data bytes = 0 350c8ec8eeaSjose borrego * 351c8ec8eeaSjose borrego * Errors: 352c8ec8eeaSjose borrego * ERRSRV/ERRinvnid 353c8ec8eeaSjose borrego * ERRSRV/ERRbaduid 354c8ec8eeaSjose borrego */ 355c8ec8eeaSjose borrego smb_sdrc_t 356c8ec8eeaSjose borrego smb_pre_tree_disconnect(smb_request_t *sr) 357c8ec8eeaSjose borrego { 358c8ec8eeaSjose borrego DTRACE_SMB_1(op__TreeDisconnect__start, smb_request_t *, sr); 359c8ec8eeaSjose borrego return (SDRC_SUCCESS); 360c8ec8eeaSjose borrego } 361c8ec8eeaSjose borrego 362c8ec8eeaSjose borrego void 363c8ec8eeaSjose borrego smb_post_tree_disconnect(smb_request_t *sr) 364c8ec8eeaSjose borrego { 365c8ec8eeaSjose borrego DTRACE_SMB_1(op__TreeDisconnect__done, smb_request_t *, sr); 366c8ec8eeaSjose borrego } 367c8ec8eeaSjose borrego 368c8ec8eeaSjose borrego /* 369c8ec8eeaSjose borrego * SmbTreeDisconnect requires a valid UID as well as a valid TID. Some 370c8ec8eeaSjose borrego * clients logoff a user and then try to disconnect the trees connected 371c8ec8eeaSjose borrego * by the user who has just been logged off, which would normally fail 372c8ec8eeaSjose borrego * in the dispatch code with ERRbaduid but, unfortunately, ERRbaduid 373c8ec8eeaSjose borrego * causes a problem for some of those clients. Windows returns ERRinvnid. 374c8ec8eeaSjose borrego * 375c8ec8eeaSjose borrego * To prevent ERRbaduid being returned, the UID and TID are looked up here 376c8ec8eeaSjose borrego * rather than prior to dispatching SmbTreeDisconnect requests. If either 377c8ec8eeaSjose borrego * the UID or the TID is invalid, ERRinvnid is returned. 378c8ec8eeaSjose borrego */ 379c8ec8eeaSjose borrego smb_sdrc_t 380c8ec8eeaSjose borrego smb_com_tree_disconnect(smb_request_t *sr) 381c8ec8eeaSjose borrego { 382b89a8333Snatalie li - Sun Microsystems - Irvine United States sr->uid_user = smb_user_lookup_by_uid(sr->session, sr->smb_uid); 383c8ec8eeaSjose borrego if (sr->uid_user != NULL) 384c8ec8eeaSjose borrego sr->tid_tree = smb_user_lookup_tree(sr->uid_user, 385c8ec8eeaSjose borrego sr->smb_tid); 386c8ec8eeaSjose borrego 387c8ec8eeaSjose borrego if (sr->uid_user == NULL || sr->tid_tree == NULL) { 388c8ec8eeaSjose borrego smbsr_error(sr, NT_STATUS_INVALID_HANDLE, ERRDOS, ERRinvnid); 389c8ec8eeaSjose borrego return (SDRC_ERROR); 390c8ec8eeaSjose borrego } 391c8ec8eeaSjose borrego 392b89a8333Snatalie li - Sun Microsystems - Irvine United States sr->user_cr = smb_user_getcred(sr->uid_user); 393b89a8333Snatalie li - Sun Microsystems - Irvine United States 394c8ec8eeaSjose borrego smb_session_cancel_requests(sr->session, sr->tid_tree, sr); 395c8ec8eeaSjose borrego smb_tree_disconnect(sr->tid_tree); 396c8ec8eeaSjose borrego 397c8ec8eeaSjose borrego if (smbsr_encode_empty_result(sr)) 398c8ec8eeaSjose borrego return (SDRC_ERROR); 399c8ec8eeaSjose borrego 400c8ec8eeaSjose borrego return (SDRC_SUCCESS); 401c8ec8eeaSjose borrego } 402