da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER START
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The contents of this file are subject to the terms of the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Common Development and Distribution License (the "License").
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You may not use this file except in compliance with the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * or http://www.opensolaris.org/os/licensing.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * See the License for the specific language governing permissions
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and limitations under the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * When distributing Covered Code, include this CDDL HEADER in each
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If applicable, add the following below this CDDL HEADER, with the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * fields enclosed by brackets "[]" replaced with your own identifying
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * information: Portions Copyright [yyyy] [name of copyright owner]
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER END
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown#include <smbsrv/smb_kproto.h>
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh#include <smbsrv/smb_share.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic void
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb_tcon_puterror(smb_request_t *sr, uint32_t status)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross switch (status) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case NT_STATUS_BAD_NETWORK_NAME:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /* Intentional status=0 */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbsr_error(sr, 0, ERRSRV, ERRinvnetname);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case NT_STATUS_ACCESS_DENIED:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbsr_error(sr, status, ERRSRV, ERRaccess);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case NT_STATUS_BAD_DEVICE_TYPE:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbsr_error(sr, status, ERRDOS, ERROR_BAD_DEV_TYPE);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross default:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case NT_STATUS_INTERNAL_ERROR:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /* Intentional status=0 */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbsr_error(sr, 0, ERRSRV, ERRsrverror);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * SmbTreeConnect: Map a share to a tree and obtain a tree-id (TID).
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Client Request Description
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * ================================== =================================
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * UCHAR WordCount; Count of parameter words = 0
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * USHORT ByteCount; Count of data bytes; min = 4
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * UCHAR BufferFormat1; 0x04
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * STRING Path[]; Server name and share name
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * UCHAR BufferFormat2; 0x04
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * STRING Password[]; Password
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * UCHAR BufferFormat3; 0x04
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * STRING Service[]; Service name
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The CIFS server responds with:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Server Response Description
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * ================================ =================================
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * UCHAR WordCount; Count of parameter words = 2
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * USHORT MaxBufferSize; Max size message the server handles
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * USHORT Tid; Tree ID
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * USHORT ByteCount; Count of data bytes = 0
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * If the negotiated dialect is MICROSOFT NETWORKS 1.03 or earlier,
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * MaxBufferSize in the response message indicates the maximum size
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * message that the server can handle. The client should not generate
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * messages, nor expect to receive responses, larger than this. This
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * must be constant for a given server. For newer dialects, this field
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * is ignored.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb */
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_sdrc_t
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbsmb_pre_tree_connect(smb_request_t *sr)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_arg_tcon_t *tcon = &sr->sr_tcon;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int rc;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Perhaps this should be "%A.sA" now that unicode is enabled.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = smbsr_decode_data(sr, "%AAA", sr, &tcon->path,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright &tcon->password, &tcon->service);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright tcon->flags = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright tcon->optional_support = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb DTRACE_SMB_2(op__TreeConnect__start, smb_request_t *, sr,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_arg_tcon_t *, tcon);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb}
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbvoid
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbsmb_post_tree_connect(smb_request_t *sr)
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb{
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb DTRACE_SMB_1(op__TreeConnect__done, smb_request_t *, sr);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb}
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbsmb_sdrc_t
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbsmb_com_tree_connect(smb_request_t *sr)
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t status;
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb int rc;
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_tree_connect(sr);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (status) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_tcon_puterror(sr, status);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (SDRC_ERROR);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = smbsr_encode_result(sr, 2, 0, "bwww",
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw 2, /* wct */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (WORD)smb_maxbufsize, /* MaxBufferSize */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sr->smb_tid, /* TID */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw 0); /* bcc */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego/*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * SmbTreeConnectX: Map a share to a tree and obtain a tree-id (TID).
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Client Request Description
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * ================================= =================================
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * UCHAR WordCount; Count of parameter words = 4
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * UCHAR AndXCommand; Secondary (X) command; 0xFF = none
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * UCHAR AndXReserved; Reserved (must be 0)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * USHORT AndXOffset; Offset to next command WordCount
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * USHORT Flags; Additional information
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * bit 0 set = disconnect Tid
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * USHORT PasswordLength; Length of Password[]
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * USHORT ByteCount; Count of data bytes; min = 3
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * UCHAR Password[]; Password
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * STRING Path[]; Server name and share name
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * STRING Service[]; Service name
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * If the negotiated dialect is LANMAN1.0 or later, then it is a protocol
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * violation for the client to send this message prior to a successful
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * SMB_COM_SESSION_SETUP_ANDX, and the server ignores Password.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * If the negotiated dialect is prior to LANMAN1.0 and the client has not
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * sent a successful SMB_COM_SESSION_SETUP_ANDX request when the tree
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * connect arrives, a user level security mode server must nevertheless
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * validate the client's credentials.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Flags (prefix with TREE_CONNECT_ANDX_):
8d7e41661dc4633488e93b13363137523ce59977jose borrego * ========================== ========================================
8d7e41661dc4633488e93b13363137523ce59977jose borrego * 0x0001 DISCONECT_TID The tree specified by TID in the SMB header
8d7e41661dc4633488e93b13363137523ce59977jose borrego * should be disconnected - disconnect errors
8d7e41661dc4633488e93b13363137523ce59977jose borrego * should be ignored.
8d7e41661dc4633488e93b13363137523ce59977jose borrego *
8d7e41661dc4633488e93b13363137523ce59977jose borrego * 0x0004 EXTENDED_SIGNATURES Client request for signing key protection.
8d7e41661dc4633488e93b13363137523ce59977jose borrego *
8d7e41661dc4633488e93b13363137523ce59977jose borrego * 0x0008 EXTENDED_RESPONSE Client request for extended information.
8d7e41661dc4633488e93b13363137523ce59977jose borrego *
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Path follows UNC style syntax (\\server\share) and indicates the name
8d7e41661dc4633488e93b13363137523ce59977jose borrego * of the resource to which the client wishes to connect.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Because Password may be an authentication response, it is a variable
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * length field with the length specified by PasswordLength. If
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * authentication is not being used, Password should be a null terminated
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * ASCII string with PasswordLength set to the string size including the
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * terminating null.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * The server can enforce whatever policy it desires to govern share
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * access. Administrative privilege is required for administrative
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * shares (C$, etc.).
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * The Service component indicates the type of resource the client
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * intends to access. Valid values are:
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Service Description Earliest Dialect Allowed
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * ======== ======================== ================================
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * A: disk share PC NETWORK PROGRAM 1.0
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * LPT1: printer PC NETWORK PROGRAM 1.0
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * IPC named pipe MICROSOFT NETWORKS 3.0
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * COMM communications device MICROSOFT NETWORKS 3.0
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * ????? any type of device MICROSOFT NETWORKS 3.0
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * If the negotiated dialect is earlier than DOS LANMAN2.1, the response to
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * this SMB is:
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Server Response Description
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * ================================ ===================================
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * UCHAR WordCount; Count of parameter words = 2
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * UCHAR AndXCommand; Secondary (X) command; 0xFF = none
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * UCHAR AndXReserved; Reserved (must be 0)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * USHORT AndXOffset; Offset to next command WordCount
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * USHORT ByteCount; Count of data bytes; min = 3
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * If the negotiated is DOS LANMAN2.1 or later, the response to this SMB
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * is:
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Server Response Description
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * ================================ ===================================
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * UCHAR WordCount; Count of parameter words = 3
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * UCHAR AndXCommand; Secondary (X) command; 0xFF = none
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * UCHAR AndXReserved; Reserved (must be 0)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * USHORT AndXOffset; Offset to next command WordCount
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * USHORT OptionalSupport; Optional support bits
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * USHORT ByteCount; Count of data bytes; min = 3
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * UCHAR Service[]; Service type connected to. Always
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * ANSII.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * STRING NativeFileSystem[]; Native file system for this tree
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * NativeFileSystem is the name of the filesystem; values to be expected
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * include FAT, NTFS, etc.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
8d7e41661dc4633488e93b13363137523ce59977jose borrego * OptionalSupport:
8d7e41661dc4633488e93b13363137523ce59977jose borrego * ============================== ==========================
8d7e41661dc4633488e93b13363137523ce59977jose borrego * 0x0001 SMB_SUPPORT_SEARCH_BITS The server supports the use of Search
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Attributes in client requests.
8d7e41661dc4633488e93b13363137523ce59977jose borrego * 0x0002 SMB_SHARE_IS_IN_DFS The share is managed by DFS.
8d7e41661dc4633488e93b13363137523ce59977jose borrego * 0x000C SMB_CSC_MASK Offline-caching mask - see CSC flags.
8d7e41661dc4633488e93b13363137523ce59977jose borrego * 0x0010 SMB_UNIQUE_FILE_NAME The server uses long names and does not
8d7e41661dc4633488e93b13363137523ce59977jose borrego * support short names. Indicator for
8d7e41661dc4633488e93b13363137523ce59977jose borrego * clients directory/name-space caching.
8d7e41661dc4633488e93b13363137523ce59977jose borrego * 0x0020 SMB_EXTENDED_SIGNATURES The server will use signing key protection.
8d7e41661dc4633488e93b13363137523ce59977jose borrego *
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Client-side caching (offline files):
8d7e41661dc4633488e93b13363137523ce59977jose borrego * ============================== ==========================
8d7e41661dc4633488e93b13363137523ce59977jose borrego * 0x0000 SMB_CSC_CACHE_MANUAL_REINT Clients may cache files for offline use
8d7e41661dc4633488e93b13363137523ce59977jose borrego * but automatic file-by-file reintegration
8d7e41661dc4633488e93b13363137523ce59977jose borrego * is not allowed.
8d7e41661dc4633488e93b13363137523ce59977jose borrego * 0x0004 SMB_CSC_CACHE_AUTO_REINT Automatic file-by-file reintegration is
8d7e41661dc4633488e93b13363137523ce59977jose borrego * allowed.
8d7e41661dc4633488e93b13363137523ce59977jose borrego * 0x0008 SMB_CSC_CACHE_VDO File opens do not need to be flowed.
8d7e41661dc4633488e93b13363137523ce59977jose borrego * 0x000C SMB_CSC_CACHE_NONE CSC is disabled for this share.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Some servers negotiate "DOS LANMAN2.1" dialect or later and still send
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * the "downlevel" (i.e. wordcount==2) response. Valid AndX following
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * commands are
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * SMB_COM_OPEN SMB_COM_OPEN_ANDX SMB_COM_CREATE
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * SMB_COM_CREATE_NEW SMB_COM_CREATE_DIRECTORY SMB_COM_DELETE
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * SMB_COM_DELETE_DIRECTORY SMB_COM_FIND SMB_COM_COPY
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * SMB_COM_FIND_UNIQUE SMB_COM_RENAME
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * SMB_COM_CHECK_DIRECTORY SMB_COM_QUERY_INFORMATION
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * SMB_COM_GET_PRINT_QUEUE SMB_COM_OPEN_PRINT_FILE
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * SMB_COM_TRANSACTION SMB_COM_NO_ANDX_CMD
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * SMB_COM_SET_INFORMATION SMB_COM_NT_RENAME
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Errors:
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * ERRDOS/ERRnomem
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * ERRDOS/ERRbadpath
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * ERRDOS/ERRinvdevice
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * ERRSRV/ERRaccess
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * ERRSRV/ERRbadpw
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * ERRSRV/ERRinvnetname
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregosmb_sdrc_t
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregosmb_pre_tree_connect_andx(smb_request_t *sr)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_arg_tcon_t *tcon = &sr->sr_tcon;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint8_t *pwbuf = NULL;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint16_t pwlen = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int rc;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego rc = smbsr_decode_vwv(sr, "b.www", &sr->andx_com, &sr->andx_off,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright &tcon->flags, &pwlen);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (rc == 0) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (pwlen != 0)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States pwbuf = smb_srm_zalloc(sr, pwlen);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego rc = smbsr_decode_data(sr, "%#cus", sr, pwlen, pwbuf,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright &tcon->path, &tcon->service);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright tcon->pwdlen = pwlen;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright tcon->password = (char *)pwbuf;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright tcon->optional_support = 0;
8d7e41661dc4633488e93b13363137523ce59977jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego DTRACE_SMB_2(op__TreeConnectX__start, smb_request_t *, sr,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_arg_tcon_t *, tcon);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego}
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregovoid
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregosmb_post_tree_connect_andx(smb_request_t *sr)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego{
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego DTRACE_SMB_1(op__TreeConnectX__done, smb_request_t *, sr);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego}
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregosmb_sdrc_t
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregosmb_com_tree_connect_andx(smb_request_t *sr)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_arg_tcon_t *tcon = &sr->sr_tcon;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright char *service;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t status;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int rc;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_tree_connect(sr);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (status) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_tcon_puterror(sr, status);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (SDRC_ERROR);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross switch (sr->tid_tree->t_res_type & STYPE_MASK) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright case STYPE_IPC:
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego service = "IPC";
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright case STYPE_PRINTQ:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright service = "LPT1:";
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright case STYPE_DISKTREE:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright default:
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego service = "A:";
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (sr->session->dialect < NT_LM_0_12) {
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego rc = smbsr_encode_result(sr, 2, VAR_BCC, "bb.wwss",
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego (char)2, /* wct */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego sr->andx_com,
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego VAR_BCC,
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego VAR_BCC,
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego service,
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego sr->tid_tree->t_typename);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego } else {
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego rc = smbsr_encode_result(sr, 3, VAR_BCC, "bb.wwws%u",
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego (char)3, /* wct */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego sr->andx_com,
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego (short)64,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright tcon->optional_support,
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego VAR_BCC,
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego service,
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego sr,
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego sr->tid_tree->t_typename);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego}
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego/*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * SmbTreeDisconnect: Disconnect a tree.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Note: SDDF_SUPPRESS_UID is set for this operation, which means the sr
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * uid_user field will not be valid on entry to these functions. Do not
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * use it until it is set up in smb_com_tree_disconnect() or the system
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * will panic.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Note: there are scenarios in which the client does not send a tree
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * disconnect request, for example, when ERRbaduid is returned from
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * SmbReadX after a user has logged off. Any open files will remain
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * around until the session is destroyed.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Client Request Description
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * ================================== =================================
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * UCHAR WordCount; Count of parameter words = 0
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * USHORT ByteCount; Count of data bytes = 0
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * The resource sharing connection identified by Tid in the SMB header is
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * logically disconnected from the server. Tid is invalidated; it will not
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * be recognized if used by the client for subsequent requests. All locks,
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * open files, etc. created on behalf of Tid are released.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Server Response Description
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * ================================== =================================
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * UCHAR WordCount; Count of parameter words = 0
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * USHORT ByteCount; Count of data bytes = 0
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Errors:
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * ERRSRV/ERRinvnid
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * ERRSRV/ERRbaduid
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregosmb_sdrc_t
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregosmb_pre_tree_disconnect(smb_request_t *sr)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright sr->uid_user = smb_session_lookup_uid(sr->session, sr->smb_uid);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser sr->tid_tree = smb_session_lookup_tree(sr->session, sr->smb_tid);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego DTRACE_SMB_1(op__TreeDisconnect__start, smb_request_t *, sr);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (SDRC_SUCCESS);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego}
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregovoid
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregosmb_post_tree_disconnect(smb_request_t *sr)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego{
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego DTRACE_SMB_1(op__TreeDisconnect__done, smb_request_t *, sr);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego}
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego/*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * SmbTreeDisconnect requires a valid UID as well as a valid TID. Some
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * clients logoff a user and then try to disconnect the trees connected
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * by the user who has just been logged off, which would normally fail
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * in the dispatch code with ERRbaduid but, unfortunately, ERRbaduid
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * causes a problem for some of those clients. Windows returns ERRinvnid.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * To prevent ERRbaduid being returned, the UID and TID are looked up here
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * rather than prior to dispatching SmbTreeDisconnect requests. If either
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * the UID or the TID is invalid, ERRinvnid is returned.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregosmb_sdrc_t
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregosmb_com_tree_disconnect(smb_request_t *sr)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego{
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (sr->uid_user == NULL || sr->tid_tree == NULL) {
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego smbsr_error(sr, NT_STATUS_INVALID_HANDLE, ERRDOS, ERRinvnid);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (SDRC_ERROR);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United States sr->user_cr = smb_user_getcred(sr->uid_user);
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United States
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego smb_session_cancel_requests(sr->session, sr->tid_tree, sr);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright smb_tree_disconnect(sr->tid_tree, B_TRUE);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (smbsr_encode_empty_result(sr))
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (SDRC_ERROR);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (SDRC_SUCCESS);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego}