LCOV - code coverage report
Current view: top level - source3/smbd - smb2_glue.c (source / functions) Hit Total Coverage
Test: coverage report for master 70ed9daf Lines: 48 49 98.0 %
Date: 2024-01-11 09:59:51 Functions: 3 3 100.0 %

          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     1315319 : struct smb_request *smbd_smb2_fake_smb_request(struct smbd_smb2_request *req,
      30             :                                                struct files_struct *fsp)
      31             : {
      32        8865 :         struct smb_request *smbreq;
      33     1315319 :         const uint8_t *inhdr = SMBD_SMB2_IN_HDR_PTR(req);
      34             : 
      35     1315319 :         if (req->smb1req) {
      36         480 :                 smbreq = req->smb1req;
      37             :         } else {
      38     1314839 :                 smbreq = talloc_zero(req, struct smb_request);
      39     1314839 :                 if (smbreq == NULL) {
      40           0 :                         return NULL;
      41             :                 }
      42             :         }
      43             : 
      44     1315319 :         smbreq->request_time = req->request_time;
      45     1315319 :         if (req->session != NULL) {
      46     1314991 :                 smbreq->vuid = req->session->global->session_wire_id;
      47             :         }
      48     1315319 :         if (req->tcon != NULL) {
      49     1312181 :                 smbreq->tid = req->tcon->compat->cnum;
      50     1312181 :                 smbreq->conn = req->tcon->compat;
      51             :         }
      52     1315319 :         smbreq->sconn = req->sconn;
      53     1315319 :         smbreq->xconn = req->xconn;
      54     1315319 :         smbreq->session = req->session;
      55     1315319 :         smbreq->smbpid = (uint16_t)IVAL(inhdr, SMB2_HDR_PID);
      56     1315319 :         smbreq->flags2 = FLAGS2_UNICODE_STRINGS |
      57             :                          FLAGS2_32_BIT_ERROR_CODES |
      58             :                          FLAGS2_LONG_PATH_COMPONENTS |
      59             :                          FLAGS2_IS_LONG_NAME;
      60             : 
      61             :         /* Only set FLAGS2_DFS_PATHNAMES if it's really a DFS share */
      62     2627500 :         if (smbreq->conn != NULL &&
      63     2624362 :             lp_host_msdfs() &&
      64     1312181 :             lp_msdfs_root(SNUM(smbreq->conn))) {
      65       24476 :                 if (IVAL(inhdr, SMB2_HDR_FLAGS) & SMB2_HDR_FLAG_DFS) {
      66       12584 :                         smbreq->flags2 |= FLAGS2_DFS_PATHNAMES;
      67             :                 }
      68             :         }
      69     1315319 :         smbreq->mid = BVAL(inhdr, SMB2_HDR_MESSAGE_ID);
      70     1315319 :         smbreq->chain_fsp = req->compat_chain_fsp;
      71     1315319 :         if (fsp != NULL) {
      72      820620 :                 smbreq->posix_pathnames =
      73      820620 :                         (fsp->fsp_name->flags & SMB_FILENAME_POSIX_PATH);
      74             :         }
      75     1315319 :         smbreq->smb2req = req;
      76     1315319 :         req->smb1req = smbreq;
      77             : 
      78     1315319 :         return smbreq;
      79             : }
      80             : 
      81             : /*********************************************************
      82             :  Are there unread bytes for recvfile ?
      83             : *********************************************************/
      84             : 
      85      141127 : size_t smbd_smb2_unread_bytes(struct smbd_smb2_request *req)
      86             : {
      87      141127 :         if (req->smb1req) {
      88      133660 :                 return req->smb1req->unread_bytes;
      89             :         }
      90        7091 :         return 0;
      91             : }
      92             : 
      93             : /*********************************************************
      94             :  Called from file_free() to remove any chained fsp pointers.
      95             : *********************************************************/
      96             : 
      97     6854010 : void remove_smb2_chained_fsp(files_struct *fsp)
      98             : {
      99     6854010 :         struct smbd_server_connection *sconn = fsp->conn->sconn;
     100     6854010 :         struct smbXsrv_connection *xconn = NULL;
     101             : 
     102     6854010 :         if (sconn->client != NULL) {
     103     6717368 :                 xconn = sconn->client->connections;
     104             :         }
     105             : 
     106    13589562 :         for (; xconn != NULL; xconn = xconn->next) {
     107       34901 :                 struct smbd_smb2_request *smb2req;
     108             : 
     109    11869162 :                 for (smb2req = xconn->smb2.requests; smb2req; smb2req = smb2req->next) {
     110     5133610 :                         if (smb2req->compat_chain_fsp == fsp) {
     111      367342 :                                 smb2req->compat_chain_fsp = NULL;
     112             :                         }
     113     5133610 :                         if (smb2req->smb1req && smb2req->smb1req->chain_fsp == fsp) {
     114          24 :                                 smb2req->smb1req->chain_fsp = NULL;
     115             :                         }
     116             :                 }
     117             :         }
     118     6854010 : }

Generated by: LCOV version 1.14