LCOV - code coverage report
Current view: top level - source3/smbd - fd_handle.c (source / functions) Hit Total Coverage
Test: coverage report for master 2f515e9b Lines: 44 47 93.6 %
Date: 2024-04-21 15:09:00 Functions: 15 15 100.0 %

          Line data    Source code
       1             : /*
       2             :    Unix SMB/CIFS implementation.
       3             :    fd_handle structure handling
       4             :    Copyright (C) Ralph Boehme 2020
       5             : 
       6             :    This program is free software; you can redistribute it and/or modify
       7             :    it under the terms of the GNU General Public License as published by
       8             :    the Free Software Foundation; either version 3 of the License, or
       9             :    (at your option) any later version.
      10             : 
      11             :    This program is distributed in the hope that it will be useful,
      12             :    but WITHOUT ANY WARRANTY; without even the implied warranty of
      13             :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14             :    GNU General Public License for more details.
      15             : 
      16             :    You should have received a copy of the GNU General Public License
      17             :    along with this program.  If not, see <http://www.gnu.org/licenses/>.
      18             : */
      19             : 
      20             : #include "includes.h"
      21             : #include "fd_handle.h"
      22             : 
      23             : struct fd_handle {
      24             :         size_t ref_count;
      25             :         int fd;
      26             :         uint64_t position_information;
      27             :         off_t pos;
      28             :         /*
      29             :          * NT Create options, but we only look at
      30             :          * NTCREATEX_FLAG_DENY_DOS and
      31             :          * NTCREATEX_FLAG_DENY_FCB.
      32             :          */
      33             :         uint32_t private_options;
      34             :         uint64_t gen_id;
      35             : };
      36             : 
      37     6355302 : static int fd_handle_destructor(struct fd_handle *fh)
      38             : {
      39     6355302 :         SMB_ASSERT((fh->fd == -1) || (fh->fd == AT_FDCWD));
      40     6355302 :         return 0;
      41             : }
      42             : 
      43     6355356 : struct fd_handle *fd_handle_create(TALLOC_CTX *mem_ctx)
      44             : {
      45     6355356 :         struct fd_handle *fh = NULL;
      46             : 
      47     6355356 :         fh = talloc_zero(mem_ctx, struct fd_handle);
      48     6355356 :         if (fh == NULL) {
      49           0 :                 return NULL;
      50             :         }
      51     6355356 :         fh->fd = -1;
      52             : 
      53     6355356 :         talloc_set_destructor(fh, fd_handle_destructor);
      54             : 
      55     6355356 :         return fh;
      56             : }
      57             : 
      58    10726534 : size_t fh_get_refcount(struct fd_handle *fh)
      59             : {
      60    10726534 :         return fh->ref_count;
      61             : }
      62             : 
      63     6284424 : void fh_set_refcount(struct fd_handle *fh, size_t ref_count)
      64             : {
      65     6284424 :         fh->ref_count = ref_count;
      66     6284424 : }
      67             : 
      68       26830 : uint64_t fh_get_position_information(struct fd_handle *fh)
      69             : {
      70       26830 :         return fh->position_information;
      71             : }
      72             : 
      73       16219 : void fh_set_position_information(struct fd_handle *fh, uint64_t posinfo)
      74             : {
      75       16219 :         fh->position_information = posinfo;
      76       16219 : }
      77             : 
      78       17147 : off_t fh_get_pos(struct fd_handle *fh)
      79             : {
      80       17147 :         return fh->pos;
      81             : }
      82             : 
      83      155575 : void fh_set_pos(struct fd_handle *fh, off_t pos)
      84             : {
      85      155575 :         fh->pos = pos;
      86      155575 : }
      87             : 
      88      443976 : uint32_t fh_get_private_options(struct fd_handle *fh)
      89             : {
      90      443976 :         return fh->private_options;
      91             : }
      92             : 
      93      490616 : void fh_set_private_options(struct fd_handle *fh, uint32_t private_options)
      94             : {
      95      490616 :         fh->private_options = private_options;
      96      490616 : }
      97             : 
      98     1670465 : uint64_t fh_get_gen_id(struct fd_handle *fh)
      99             : {
     100     1670465 :         return fh->gen_id;
     101             : }
     102             : 
     103     6134432 : void fh_set_gen_id(struct fd_handle *fh, uint64_t gen_id)
     104             : {
     105     6134432 :         fh->gen_id = gen_id;
     106     6134432 : }
     107             : 
     108             : /****************************************************************************
     109             :  Helper functions for working with fsp->fh->fd
     110             : ****************************************************************************/
     111             : 
     112     1670733 : int fsp_get_io_fd(const struct files_struct *fsp)
     113             : {
     114     1670733 :         if (fsp->fsp_flags.is_pathref) {
     115           0 :                 DBG_ERR("fsp [%s] is a path referencing fsp\n",
     116             :                         fsp_str_dbg(fsp));
     117             : #ifdef DEVELOPER
     118           0 :                 smb_panic("fsp is a pathref");
     119             : #endif
     120             :                 return -1;
     121             :         }
     122             : 
     123     1670733 :         return fsp->fh->fd;
     124             : }
     125             : 
     126    57876673 : int fsp_get_pathref_fd(const struct files_struct *fsp)
     127             : {
     128    57876673 :         return fsp->fh->fd;
     129             : }
     130             : 
     131    20006953 : void fsp_set_fd(struct files_struct *fsp, int fd)
     132             : {
     133             :         /*
     134             :          * Deliberately allow setting an fd if the existing fd is the
     135             :          * same. This happens if a VFS module assigns the fd to
     136             :          * fsp->fh->fd in its openat VFS function. The canonical place
     137             :          * where the assignment is done is in fd_open(), but some VFS
     138             :          * modules do it anyway.
     139             :          */
     140             : 
     141    20006953 :         SMB_ASSERT(fsp->fh->fd == -1 ||
     142             :                    fsp->fh->fd == fd ||
     143             :                    fd == -1 ||
     144             :                    fd == AT_FDCWD);
     145             : 
     146    20006953 :         fsp->fh->fd = fd;
     147    20006953 : }

Generated by: LCOV version 1.14