root/source4/torture/basic/attr.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. torture_openattrtest

   1 /* 
   2    Unix SMB/CIFS implementation.
   3 
   4    openattr tester
   5 
   6    Copyright (C) Andrew Tridgell 2003
   7    
   8    This program is free software; you can redistribute it and/or modify
   9    it under the terms of the GNU General Public License as published by
  10    the Free Software Foundation; either version 3 of the License, or
  11    (at your option) any later version.
  12    
  13    This program is distributed in the hope that it will be useful,
  14    but WITHOUT ANY WARRANTY; without even the implied warranty of
  15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16    GNU General Public License for more details.
  17    
  18    You should have received a copy of the GNU General Public License
  19    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  20 */
  21 
  22 #include "includes.h"
  23 #include "torture/torture.h"
  24 #include "libcli/libcli.h"
  25 #include "torture/util.h"
  26 
  27 extern int torture_failures;
  28 
  29 #define CHECK_MAX_FAILURES(label) do { if (++failures >= torture_failures) goto label; } while (0)
  30 
  31 
  32 static const uint32_t open_attrs_table[] = {
  33                 FILE_ATTRIBUTE_NORMAL,
  34                 FILE_ATTRIBUTE_ARCHIVE,
  35                 FILE_ATTRIBUTE_READONLY,
  36                 FILE_ATTRIBUTE_HIDDEN,
  37                 FILE_ATTRIBUTE_SYSTEM,
  38 
  39                 FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY,
  40                 FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN,
  41                 FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM,
  42                 FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN,
  43                 FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM,
  44                 FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM,
  45 
  46                 FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN,
  47                 FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM,
  48                 FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM,
  49                 FILE_ATTRIBUTE_HIDDEN,FILE_ATTRIBUTE_SYSTEM,
  50 };
  51 
  52 struct trunc_open_results {
  53         uint_t num;
  54         uint32_t init_attr;
  55         uint32_t trunc_attr;
  56         uint32_t result_attr;
  57 };
  58 
  59 static const struct trunc_open_results attr_results[] = {
  60         { 0, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_ARCHIVE },
  61         { 1, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_ARCHIVE },
  62         { 2, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY },
  63         { 16, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_ARCHIVE },
  64         { 17, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_ARCHIVE },
  65         { 18, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY },
  66         { 51, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
  67         { 54, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
  68         { 56, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN },
  69         { 68, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
  70         { 71, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
  71         { 73, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM },
  72         { 99, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_HIDDEN,FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
  73         { 102, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
  74         { 104, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN },
  75         { 116, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
  76         { 119,  FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM,  FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
  77         { 121, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM },
  78         { 170, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN },
  79         { 173, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM },
  80         { 227, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
  81         { 230, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN },
  82         { 232, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN },
  83         { 244, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
  84         { 247, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_SYSTEM },
  85         { 249, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM }
  86 };
  87 
  88 
  89 bool torture_openattrtest(struct torture_context *tctx, 
     /* [<][>][^][v][top][bottom][index][help] */
  90                           struct smbcli_state *cli1)
  91 {
  92         const char *fname = "\\openattr.file";
  93         int fnum1;
  94         uint16_t attr;
  95         uint_t i, j, k, l;
  96         int failures = 0;
  97 
  98         for (k = 0, i = 0; i < sizeof(open_attrs_table)/sizeof(uint32_t); i++) {
  99                 smbcli_setatr(cli1->tree, fname, 0, 0);
 100                 smbcli_unlink(cli1->tree, fname);
 101                 fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, 
 102                                               SEC_FILE_WRITE_DATA, 
 103                                               open_attrs_table[i],
 104                                               NTCREATEX_SHARE_ACCESS_NONE, NTCREATEX_DISP_OVERWRITE_IF, 0, 0);
 105                 
 106                 torture_assert(tctx, fnum1 != -1, talloc_asprintf(tctx, "open %d (1) of %s failed (%s)", i, 
 107                                            fname, smbcli_errstr(cli1->tree)));
 108 
 109                 torture_assert_ntstatus_ok(tctx, 
 110                                                         smbcli_close(cli1->tree, fnum1),
 111                                                         talloc_asprintf(tctx, "close %d (1) of %s failed (%s)", i, fname, 
 112                                                         smbcli_errstr(cli1->tree)));
 113 
 114                 for (j = 0; j < ARRAY_SIZE(open_attrs_table); j++) {
 115                         fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, 
 116                                                       SEC_FILE_READ_DATA|
 117                                                       SEC_FILE_WRITE_DATA, 
 118                                                       open_attrs_table[j],
 119                                                       NTCREATEX_SHARE_ACCESS_NONE, 
 120                                                       NTCREATEX_DISP_OVERWRITE, 0, 0);
 121 
 122                         if (fnum1 == -1) {
 123                                 for (l = 0; l < ARRAY_SIZE(attr_results); l++) {
 124                                         if (attr_results[l].num == k) {
 125                                                 torture_comment(tctx, "[%d] trunc open 0x%x -> 0x%x of %s failed - should have succeeded !(%s)\n",
 126                                                                 k, open_attrs_table[i],
 127                                                                 open_attrs_table[j],
 128                                                                 fname, smbcli_errstr(cli1->tree));
 129                                                 CHECK_MAX_FAILURES(error_exit);
 130                                         }
 131                                 }
 132                                 torture_assert_ntstatus_equal(tctx, 
 133                                         smbcli_nt_error(cli1->tree), NT_STATUS_ACCESS_DENIED, 
 134                                         talloc_asprintf(tctx, "[%d] trunc open 0x%x -> 0x%x failed with wrong error code %s",
 135                                                         k, open_attrs_table[i], open_attrs_table[j],
 136                                                         smbcli_errstr(cli1->tree)));
 137                                         CHECK_MAX_FAILURES(error_exit);
 138 #if 0
 139                                 torture_comment(tctx, "[%d] trunc open 0x%x -> 0x%x failed\n", k, open_attrs_table[i], open_attrs_table[j]);
 140 #endif
 141                                 k++;
 142                                 continue;
 143                         }
 144 
 145                         torture_assert_ntstatus_ok(tctx, 
 146                                                                            smbcli_close(cli1->tree, fnum1),
 147                                                                         talloc_asprintf(tctx, "close %d (2) of %s failed (%s)", j, 
 148                                                                         fname, smbcli_errstr(cli1->tree)));
 149 
 150                         torture_assert_ntstatus_ok(tctx, 
 151                                                 smbcli_getatr(cli1->tree, fname, &attr, NULL, NULL),
 152                                                 talloc_asprintf(tctx, "getatr(2) failed (%s)", smbcli_errstr(cli1->tree)));
 153 
 154 #if 0
 155                         torture_comment(tctx, "[%d] getatr check [0x%x] trunc [0x%x] got attr 0x%x\n",
 156                                         k,  open_attrs_table[i],  open_attrs_table[j], attr );
 157 #endif
 158 
 159                         for (l = 0; l < ARRAY_SIZE(attr_results); l++) {
 160                                 if (attr_results[l].num == k) {
 161                                         if (attr != attr_results[l].result_attr ||
 162                                             open_attrs_table[i] != attr_results[l].init_attr ||
 163                                             open_attrs_table[j] != attr_results[l].trunc_attr) {
 164                                                 torture_comment(tctx, "[%d] getatr check failed. [0x%x] trunc [0x%x] got attr 0x%x, should be 0x%x\n",
 165                                                        k, open_attrs_table[i],
 166                                                        open_attrs_table[j],
 167                                                        (uint_t)attr,
 168                                                        attr_results[l].result_attr);
 169                                                 CHECK_MAX_FAILURES(error_exit);
 170                                         }
 171                                         break;
 172                                 }
 173                         }
 174                         k++;
 175                 }
 176         }
 177 error_exit:
 178         smbcli_setatr(cli1->tree, fname, 0, 0);
 179         smbcli_unlink(cli1->tree, fname);
 180 
 181         return true;
 182 }
 183 

/* [<][>][^][v][top][bottom][index][help] */