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