LCOV - code coverage report
Current view: top level - source4/torture/smb2 - smb2.c (source / functions) Hit Total Coverage
Test: coverage report for v4-17-test 1498b464 Lines: 108 111 97.3 %
Date: 2024-06-13 04:01:37 Functions: 5 5 100.0 %

          Line data    Source code
       1             : /*
       2             :    Unix SMB/CIFS implementation.
       3             :    SMB torture tester
       4             :    Copyright (C) Jelmer Vernooij 2006
       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 "libcli/smb2/smb2.h"
      22             : 
      23             : #include "torture/smbtorture.h"
      24             : #include "torture/smb2/proto.h"
      25             : #include "../lib/util/dlinklist.h"
      26             : 
      27         316 : static bool wrap_simple_1smb2_test(struct torture_context *torture_ctx,
      28             :                                    struct torture_tcase *tcase,
      29             :                                    struct torture_test *test)
      30             : {
      31             :         bool (*fn) (struct torture_context *, struct smb2_tree *);
      32             :         bool ret;
      33             :         struct smb2_tree *tree1;
      34         316 :         TALLOC_CTX *mem_ctx = talloc_new(torture_ctx);
      35             : 
      36         316 :         if (!torture_smb2_connection(torture_ctx, &tree1)) {
      37           0 :                 torture_fail(torture_ctx,
      38             :                             "Establishing SMB2 connection failed\n");
      39             :                 return false;
      40             :         }
      41             : 
      42             :         /*
      43             :          * This is a trick:
      44             :          * The test might close the connection. If we steal the tree context
      45             :          * before that and free the parent instead of tree directly, we avoid
      46             :          * a double free error.
      47             :          */
      48         316 :         talloc_steal(mem_ctx, tree1);
      49             : 
      50         316 :         fn = test->fn;
      51             : 
      52         316 :         ret = fn(torture_ctx, tree1);
      53             : 
      54         316 :         talloc_free(mem_ctx);
      55             : 
      56         316 :         return ret;
      57             : }
      58             : 
      59      458864 : struct torture_test *torture_suite_add_1smb2_test(struct torture_suite *suite,
      60             :                                                   const char *name,
      61             :                                                   bool (*run)(struct torture_context *,
      62             :                                                               struct smb2_tree *))
      63             : {
      64             :         struct torture_test *test;
      65             :         struct torture_tcase *tcase;
      66             : 
      67      458864 :         tcase = torture_suite_add_tcase(suite, name);
      68             : 
      69      458864 :         test = talloc(tcase, struct torture_test);
      70             : 
      71      458864 :         test->name = talloc_strdup(test, name);
      72      458864 :         test->description = NULL;
      73      458864 :         test->run = wrap_simple_1smb2_test;
      74      458864 :         test->fn = run;
      75      458864 :         test->dangerous = false;
      76             : 
      77      458864 :         DLIST_ADD_END(tcase->tests, test);
      78             : 
      79      458864 :         return test;
      80             : }
      81             : 
      82             : 
      83          79 : static bool wrap_simple_2smb2_test(struct torture_context *torture_ctx,
      84             :                                    struct torture_tcase *tcase,
      85             :                                    struct torture_test *test)
      86             : {
      87             :         bool (*fn) (struct torture_context *, struct smb2_tree *, struct smb2_tree *);
      88          79 :         bool ret = false;
      89             : 
      90             :         struct smb2_tree *tree1;
      91             :         struct smb2_tree *tree2;
      92          79 :         TALLOC_CTX *mem_ctx = talloc_new(torture_ctx);
      93             : 
      94          79 :         if (!torture_smb2_connection(torture_ctx, &tree1)) {
      95           0 :                 torture_fail(torture_ctx,
      96             :                     "Establishing SMB2 connection failed\n");
      97             :                 goto done;
      98             :         }
      99             : 
     100          79 :         talloc_steal(mem_ctx, tree1);
     101             : 
     102          79 :         if (!torture_smb2_connection(torture_ctx, &tree2)) {
     103           0 :                 torture_fail(torture_ctx,
     104             :                     "Establishing SMB2 connection failed\n");
     105             :                 goto done;
     106             :         }
     107             : 
     108          79 :         talloc_steal(mem_ctx, tree2);
     109             : 
     110          79 :         fn = test->fn;
     111             : 
     112          79 :         ret = fn(torture_ctx, tree1, tree2);
     113             : 
     114          79 : done:
     115             :         /* the test may already have closed some of the connections */
     116          79 :         talloc_free(mem_ctx);
     117             : 
     118          79 :         return ret;
     119             : }
     120             : 
     121             : 
     122       98328 : struct torture_test *torture_suite_add_2smb2_test(struct torture_suite *suite,
     123             :                                                   const char *name,
     124             :                                                   bool (*run)(struct torture_context *,
     125             :                                                               struct smb2_tree *,
     126             :                                                               struct smb2_tree *))
     127             : {
     128             :         struct torture_test *test;
     129             :         struct torture_tcase *tcase;
     130             : 
     131       98328 :         tcase = torture_suite_add_tcase(suite, name);
     132             : 
     133       98328 :         test = talloc(tcase, struct torture_test);
     134             : 
     135       98328 :         test->name = talloc_strdup(test, name);
     136       98328 :         test->description = NULL;
     137       98328 :         test->run = wrap_simple_2smb2_test;
     138       98328 :         test->fn = run;
     139       98328 :         test->dangerous = false;
     140             : 
     141       98328 :         DLIST_ADD_END(tcase->tests, test);
     142             : 
     143       98328 :         return test;
     144             : }
     145             : 
     146         964 : NTSTATUS torture_smb2_init(TALLOC_CTX *ctx)
     147             : {
     148         964 :         struct torture_suite *suite = torture_suite_create(ctx, "smb2");
     149         964 :         torture_suite_add_simple_test(suite, "connect", torture_smb2_connect);
     150         964 :         torture_suite_add_suite(suite, torture_smb2_scan_init(suite));
     151         964 :         torture_suite_add_suite(suite, torture_smb2_getinfo_init(suite));
     152         964 :         torture_suite_add_simple_test(suite, "setinfo", torture_smb2_setinfo);
     153         964 :         torture_suite_add_suite(suite, torture_smb2_lock_init(suite));
     154         964 :         torture_suite_add_suite(suite, torture_smb2_read_init(suite));
     155         964 :         torture_suite_add_suite(suite, torture_smb2_aio_delay_init(suite));
     156         964 :         torture_suite_add_suite(suite, torture_smb2_bench_init(suite));
     157         964 :         torture_suite_add_suite(suite, torture_smb2_create_init(suite));
     158         964 :         torture_suite_add_suite(suite, torture_smb2_twrp_init(suite));
     159         964 :         torture_suite_add_suite(suite, torture_smb2_fileid_init(suite));
     160         964 :         torture_suite_add_suite(suite, torture_smb2_acls_init(suite));
     161         964 :         torture_suite_add_suite(suite, torture_smb2_acls_non_canonical_init(suite));
     162         964 :         torture_suite_add_suite(suite, torture_smb2_notify_init(suite));
     163         964 :         torture_suite_add_suite(suite, torture_smb2_notify_inotify_init(suite));
     164         964 :         torture_suite_add_suite(suite,
     165             :                 torture_smb2_notify_disabled_init(suite));
     166         964 :         torture_suite_add_suite(suite, torture_smb2_durable_open_init(suite));
     167         964 :         torture_suite_add_suite(suite,
     168             :                 torture_smb2_durable_open_disconnect_init(suite));
     169         964 :         torture_suite_add_suite(suite,
     170             :                 torture_smb2_durable_v2_open_init(suite));
     171         964 :         torture_suite_add_suite(suite,
     172             :                 torture_smb2_durable_v2_delay_init(suite));
     173         964 :         torture_suite_add_suite(suite, torture_smb2_dir_init(suite));
     174         964 :         torture_suite_add_suite(suite, torture_smb2_lease_init(suite));
     175         964 :         torture_suite_add_suite(suite, torture_smb2_compound_init(suite));
     176         964 :         torture_suite_add_suite(suite, torture_smb2_compound_find_init(suite));
     177         964 :         torture_suite_add_suite(suite, torture_smb2_compound_async_init(suite));
     178         964 :         torture_suite_add_suite(suite, torture_smb2_oplocks_init(suite));
     179         964 :         torture_suite_add_suite(suite, torture_smb2_kernel_oplocks_init(suite));
     180         964 :         torture_suite_add_suite(suite, torture_smb2_streams_init(suite));
     181         964 :         torture_suite_add_suite(suite, torture_smb2_ioctl_init(suite));
     182         964 :         torture_suite_add_simple_test(suite, "set-sparse-ioctl",
     183             :                                       test_ioctl_set_sparse);
     184         964 :         torture_suite_add_simple_test(suite, "zero-data-ioctl",
     185             :                                       test_ioctl_zero_data);
     186         964 :         torture_suite_add_simple_test(suite, "ioctl-on-stream",
     187             :                                       test_ioctl_alternate_data_stream);
     188         964 :         torture_suite_add_suite(suite, torture_smb2_rename_init(suite));
     189         964 :         torture_suite_add_suite(suite, torture_smb2_sharemode_init(suite));
     190         964 :         torture_suite_add_1smb2_test(suite, "hold-oplock", test_smb2_hold_oplock);
     191         964 :         torture_suite_add_suite(suite, torture_smb2_session_init(suite));
     192         964 :         torture_suite_add_suite(suite, torture_smb2_session_req_sign_init(suite));
     193         964 :         torture_suite_add_suite(suite, torture_smb2_replay_init(suite));
     194         964 :         torture_suite_add_simple_test(suite, "dosmode", torture_smb2_dosmode);
     195         964 :         torture_suite_add_simple_test(suite, "async_dosmode", torture_smb2_async_dosmode);
     196         964 :         torture_suite_add_simple_test(suite, "maxfid", torture_smb2_maxfid);
     197         964 :         torture_suite_add_simple_test(suite, "hold-sharemode",
     198             :                                       torture_smb2_hold_sharemode);
     199         964 :         torture_suite_add_simple_test(suite, "check-sharemode",
     200             :                                       torture_smb2_check_sharemode);
     201         964 :         torture_suite_add_suite(suite, torture_smb2_crediting_init(suite));
     202             : 
     203         964 :         torture_suite_add_suite(suite, torture_smb2_doc_init(suite));
     204         964 :         torture_suite_add_suite(suite, torture_smb2_multichannel_init(suite));
     205         964 :         torture_suite_add_suite(suite, torture_smb2_samba3misc_init(suite));
     206         964 :         torture_suite_add_suite(suite, torture_smb2_timestamps_init(suite));
     207         964 :         torture_suite_add_suite(suite, torture_smb2_timestamp_resolution_init(suite));
     208         964 :         torture_suite_add_1smb2_test(suite, "openattr", torture_smb2_openattrtest);
     209         964 :         torture_suite_add_1smb2_test(suite, "winattr", torture_smb2_winattrtest);
     210         964 :         torture_suite_add_1smb2_test(suite, "sdread", torture_smb2_sdreadtest);
     211         964 :         torture_suite_add_suite(suite, torture_smb2_readwrite_init(suite));
     212         964 :         torture_suite_add_1smb2_test(suite, "maximum_allowed", torture_smb2_maximum_allowed);
     213         964 :         torture_suite_add_1smb2_test(suite, "mangle", torture_smb2_mangle);
     214         964 :         torture_suite_add_1smb2_test(suite, "tcon", run_tcon_test);
     215         964 :         torture_suite_add_1smb2_test(suite, "mkdir", torture_smb2_mkdir);
     216             : 
     217         964 :         torture_suite_add_suite(suite, torture_smb2_charset(suite));
     218         964 :         torture_suite_add_1smb2_test(suite, "secleak", torture_smb2_sec_leak);
     219         964 :         torture_suite_add_1smb2_test(suite, "session-id", run_sessidtest);
     220         964 :         torture_suite_add_suite(suite, torture_smb2_deny_init(suite));
     221         964 :         torture_suite_add_suite(suite, torture_smb2_ea(suite));
     222         964 :         torture_suite_add_suite(suite, torture_smb2_create_no_streams_init(suite));
     223             : 
     224         964 :         suite->description = talloc_strdup(suite, "SMB2-specific tests");
     225             : 
     226         964 :         torture_register_suite(ctx, suite);
     227             : 
     228         964 :         return NT_STATUS_OK;
     229             : }

Generated by: LCOV version 1.13