Line data Source code
1 : /* 2 : Unix SMB/CIFS implementation. 3 : Core SMB2 server 4 : 5 : Copyright (C) Stefan Metzmacher 2009 6 : 7 : This program is free software; you can redistribute it and/or modify 8 : it under the terms of the GNU General Public License as published by 9 : the Free Software Foundation; either version 3 of the License, or 10 : (at your option) any later version. 11 : 12 : This program is distributed in the hope that it will be useful, 13 : but WITHOUT ANY WARRANTY; without even the implied warranty of 14 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 : GNU General Public License for more details. 16 : 17 : You should have received a copy of the GNU General Public License 18 : along with this program. If not, see <http://www.gnu.org/licenses/>. 19 : */ 20 : 21 : #include "includes.h" 22 : #include "smbd/smbd.h" 23 : #include "smbd/globals.h" 24 : #include "../libcli/smb/smb_common.h" 25 : 26 : #undef DBGC_CLASS 27 : #define DBGC_CLASS DBGC_SMB2 28 : 29 136164 : struct smb_request *smbd_smb2_fake_smb_request(struct smbd_smb2_request *req) 30 : { 31 : struct smb_request *smbreq; 32 136164 : const uint8_t *inhdr = SMBD_SMB2_IN_HDR_PTR(req); 33 : 34 136164 : if (req->smb1req) { 35 0 : smbreq = req->smb1req; 36 : } else { 37 136164 : smbreq = talloc_zero(req, struct smb_request); 38 136164 : if (smbreq == NULL) { 39 0 : return NULL; 40 : } 41 : } 42 : 43 136164 : smbreq->request_time = req->request_time; 44 136164 : if (req->session != NULL) { 45 136164 : smbreq->vuid = req->session->global->session_wire_id; 46 : } 47 136164 : if (req->tcon != NULL) { 48 133848 : smbreq->tid = req->tcon->compat->cnum; 49 133848 : smbreq->conn = req->tcon->compat; 50 : } 51 136164 : smbreq->sconn = req->sconn; 52 136164 : smbreq->xconn = req->xconn; 53 136164 : smbreq->session = req->session; 54 136164 : smbreq->smbpid = (uint16_t)IVAL(inhdr, SMB2_HDR_PID); 55 136164 : smbreq->flags2 = FLAGS2_UNICODE_STRINGS | 56 : FLAGS2_32_BIT_ERROR_CODES | 57 : FLAGS2_LONG_PATH_COMPONENTS | 58 : FLAGS2_IS_LONG_NAME; 59 : 60 136164 : if (IVAL(inhdr, SMB2_HDR_FLAGS) & SMB2_HDR_FLAG_DFS) { 61 1048 : smbreq->flags2 |= FLAGS2_DFS_PATHNAMES; 62 : } 63 136164 : smbreq->mid = BVAL(inhdr, SMB2_HDR_MESSAGE_ID); 64 136164 : smbreq->chain_fsp = req->compat_chain_fsp; 65 136164 : smbreq->smb2req = req; 66 136164 : req->smb1req = smbreq; 67 : 68 136164 : return smbreq; 69 : } 70 : 71 : /********************************************************* 72 : Are there unread bytes for recvfile ? 73 : *********************************************************/ 74 : 75 5449 : size_t smbd_smb2_unread_bytes(struct smbd_smb2_request *req) 76 : { 77 5449 : if (req->smb1req) { 78 4865 : return req->smb1req->unread_bytes; 79 : } 80 584 : return 0; 81 : } 82 : 83 : /********************************************************* 84 : Called from file_free() to remove any chained fsp pointers. 85 : *********************************************************/ 86 : 87 164633 : void remove_smb2_chained_fsp(files_struct *fsp) 88 : { 89 164633 : struct smbd_server_connection *sconn = fsp->conn->sconn; 90 164633 : struct smbXsrv_connection *xconn = NULL; 91 : 92 164633 : if (sconn->client != NULL) { 93 141139 : xconn = sconn->client->connections; 94 : } 95 : 96 306306 : for (; xconn != NULL; xconn = xconn->next) { 97 : struct smbd_smb2_request *smb2req; 98 : 99 258917 : for (smb2req = xconn->smb2.requests; smb2req; smb2req = smb2req->next) { 100 117244 : if (smb2req->compat_chain_fsp == fsp) { 101 16393 : smb2req->compat_chain_fsp = NULL; 102 : } 103 117244 : if (smb2req->smb1req && smb2req->smb1req->chain_fsp == fsp) { 104 12 : smb2req->smb1req->chain_fsp = NULL; 105 : } 106 : } 107 : } 108 164633 : }