LCOV - code coverage report
Current view: top level - libcli/smb - smb2cli_echo.c (source / functions) Hit Total Coverage
Test: coverage report for fix-15632 9995c5c2 Lines: 33 48 68.8 %
Date: 2024-04-13 12:30:31 Functions: 4 4 100.0 %

          Line data    Source code
       1             : /*
       2             :    Unix SMB/CIFS implementation.
       3             :    smb2 lib
       4             :    Copyright (C) Stefan Metzmacher 2012
       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 "system/network.h"
      22             : #include "lib/util/tevent_ntstatus.h"
      23             : #include "smb_common.h"
      24             : #include "smbXcli_base.h"
      25             : 
      26             : struct smb2cli_echo_state {
      27             :         uint8_t fixed[0x4];
      28             : };
      29             : 
      30             : static void smb2cli_echo_done(struct tevent_req *subreq);
      31             : 
      32         347 : struct tevent_req *smb2cli_echo_send(TALLOC_CTX *mem_ctx,
      33             :                                      struct tevent_context *ev,
      34             :                                      struct smbXcli_conn *conn,
      35             :                                      uint32_t timeout_msec)
      36             : {
      37           0 :         struct tevent_req *req, *subreq;
      38           0 :         struct smb2cli_echo_state *state;
      39           0 :         uint8_t *fixed;
      40             : 
      41         347 :         req = tevent_req_create(mem_ctx, &state,
      42             :                                 struct smb2cli_echo_state);
      43         347 :         if (req == NULL) {
      44           0 :                 return NULL;
      45             :         }
      46         347 :         fixed = state->fixed;
      47         347 :         SSVAL(fixed, 0, 4);
      48         347 :         SSVAL(fixed, 2, 0);
      49             : 
      50         347 :         subreq = smb2cli_req_send(state, ev, conn, SMB2_OP_KEEPALIVE,
      51             :                                   0, 0, /* flags */
      52             :                                   timeout_msec,
      53             :                                   NULL, /* tcon */
      54             :                                   NULL, /* session */
      55         347 :                                   state->fixed, sizeof(state->fixed),
      56             :                                   NULL, 0, /* dyn* */
      57             :                                   0); /* max_dyn_len */
      58         347 :         if (tevent_req_nomem(subreq, req)) {
      59           0 :                 return tevent_req_post(req, ev);
      60             :         }
      61         347 :         tevent_req_set_callback(subreq, smb2cli_echo_done, req);
      62         347 :         return req;
      63             : }
      64             : 
      65         347 : static void smb2cli_echo_done(struct tevent_req *subreq)
      66             : {
      67           0 :         struct tevent_req *req =
      68         347 :                 tevent_req_callback_data(subreq,
      69             :                 struct tevent_req);
      70           0 :         NTSTATUS status;
      71           0 :         static const struct smb2cli_req_expected_response expected[] = {
      72             :         {
      73             :                 .status = NT_STATUS_OK,
      74             :                 .body_size = 0x04
      75             :         }
      76             :         };
      77             : 
      78         347 :         status = smb2cli_req_recv(subreq, NULL, NULL,
      79             :                                   expected, ARRAY_SIZE(expected));
      80         347 :         TALLOC_FREE(subreq);
      81         347 :         if (tevent_req_nterror(req, status)) {
      82           2 :                 return;
      83             :         }
      84         345 :         tevent_req_done(req);
      85             : }
      86             : 
      87         347 : NTSTATUS smb2cli_echo_recv(struct tevent_req *req)
      88             : {
      89         347 :         return tevent_req_simple_recv_ntstatus(req);
      90             : }
      91             : 
      92         124 : NTSTATUS smb2cli_echo(struct smbXcli_conn *conn,
      93             :                       uint32_t timeout_msec)
      94             : {
      95         124 :         TALLOC_CTX *frame = talloc_stackframe();
      96           0 :         struct tevent_context *ev;
      97           0 :         struct tevent_req *req;
      98         124 :         NTSTATUS status = NT_STATUS_NO_MEMORY;
      99             : 
     100         124 :         if (smbXcli_conn_has_async_calls(conn)) {
     101             :                 /*
     102             :                  * Can't use sync call while an async call is in flight
     103             :                  */
     104           0 :                 status = NT_STATUS_INVALID_PARAMETER;
     105           0 :                 goto fail;
     106             :         }
     107         124 :         ev = samba_tevent_context_init(frame);
     108         124 :         if (ev == NULL) {
     109           0 :                 goto fail;
     110             :         }
     111         124 :         req = smb2cli_echo_send(frame, ev, conn, timeout_msec);
     112         124 :         if (req == NULL) {
     113           0 :                 goto fail;
     114             :         }
     115         124 :         if (!tevent_req_poll_ntstatus(req, ev, &status)) {
     116           0 :                 goto fail;
     117             :         }
     118         124 :         status = smb2cli_echo_recv(req);
     119         124 :  fail:
     120         124 :         TALLOC_FREE(frame);
     121         124 :         return status;
     122             : }

Generated by: LCOV version 1.14