s3: smbtorture3: Add test_smb1_nttrans_create() DFS test to run_smb1_dfs_operations().
authorJeremy Allison <jra@samba.org>
Wed, 7 Sep 2022 19:03:08 +0000 (12:03 -0700)
committerJeremy Allison <jra@samba.org>
Wed, 14 Sep 2022 17:33:37 +0000 (17:33 +0000)
Passes against Windows.

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Noel Power <npower@samba.org>
source3/torture/test_smb1_dfs.c

index 7a9a40fd461c74b8fe90c1eafc2cb56dc90795c0..90442ba91e194865ef4b04c50f311075356226fb 100644 (file)
@@ -2766,6 +2766,129 @@ static bool test_smb1_ntcreatex(struct cli_state *cli)
        return retval;
 }
 
+static NTSTATUS smb1_nttrans_create(struct cli_state *cli,
+                                   const char *path)
+{
+       uint8_t *param = NULL;
+       size_t converted_len = 0;
+       uint8_t *rparam = NULL;
+       uint32_t num_rparam = 0;
+       uint16_t fnum = (uint16_t)-1;
+       NTSTATUS status;
+
+       param = talloc_zero_array(talloc_tos(), uint8_t, 53);
+       if (param == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       param = trans2_bytes_push_str(param,
+                                     smbXcli_conn_use_unicode(cli->conn),
+                                     path,
+                                     strlen(path),
+                                     &converted_len);
+       if (param == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       PUSH_LE_U32(param, 8, SEC_STD_SYNCHRONIZE|
+                               SEC_STD_DELETE |
+                               SEC_FILE_READ_DATA|
+                               SEC_FILE_READ_ATTRIBUTE); /* DesiredAccess */
+       PUSH_LE_U32(param, 20, FILE_ATTRIBUTE_NORMAL);
+       PUSH_LE_U32(param, 24, FILE_SHARE_READ|
+                               FILE_SHARE_WRITE|
+                               FILE_SHARE_DELETE); /* ShareAccess */
+       PUSH_LE_U32(param, 28, FILE_CREATE);
+       PUSH_LE_U32(param, 44, converted_len);
+       PUSH_LE_U32(param, 48, 0x02); /* ImpersonationLevel */
+
+       status = cli_trans(talloc_tos(),
+                          cli,
+                          SMBnttrans, /* trans cmd */
+                          NULL, /* pipe_name */
+                          0, /* fid */
+                          NT_TRANSACT_CREATE, /* function */
+                          0, /* flags */
+                          NULL, /* setup */
+                          0, /* num_setup */
+                          0, /* max_setup */
+                          param, /* param */
+                          talloc_get_size(param), /* num_param */
+                          128, /* max_param */
+                          NULL, /* data */
+                          0, /* num_data */
+                          0, /* max_data */
+                          NULL, /* recv_flags2 */
+                          NULL, /* rsetup */
+                          0, /* min_rsetup */
+                          NULL, /* num_rsetup */
+                          &rparam, /* rparam */
+                          69, /* min_rparam */
+                          &num_rparam, /* num_rparam */
+                          NULL, /* rdata */
+                          0, /* min_rdata */
+                          NULL); /* num_rdata */
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+       fnum = PULL_LE_U16(param, 2);
+       /* Close "file" handle. */
+       (void)smb1cli_close(cli->conn,
+                           cli->timeout,
+                           cli->smb1.pid,
+                           cli->smb1.tcon,
+                           cli->smb1.session,
+                           fnum,
+                           0); /* last_modified */
+       return NT_STATUS_OK;
+}
+
+static bool test_smb1_nttrans_create(struct cli_state *cli)
+{
+       NTSTATUS status;
+       bool retval = false;
+
+       /* Start clean. */
+       (void)smb1_dfs_delete(cli, "\\BAD\\BAD\\nttransfile");
+
+       status = smb1_nttrans_create(cli, "nttransfile");
+       if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) {
+               printf("%s:%d SMB1trans NT_TRANSACT_CREATE of %s should get "
+                       "NT_STATUS_OBJECT_NAME_COLLISION, got %s\n",
+                       __FILE__,
+                       __LINE__,
+                       "nttransfile",
+                       nt_errstr(status));
+               goto err;
+       }
+       status = smb1_nttrans_create(cli, "\\BAD\\nttransfile");
+       if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) {
+               printf("%s:%d SMB1trans NT_TRANSACT_CREATE of %s should get "
+                       "NT_STATUS_OBJECT_NAME_COLLISION, got %s\n",
+                       __FILE__,
+                       __LINE__,
+                       "\\BAD\\nttransfile",
+                       nt_errstr(status));
+               goto err;
+       }
+       status = smb1_nttrans_create(cli, "\\BAD\\BAD\\nttransfile");
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("%s:%d SMB1trans NT_TRANSACT_CREATE on %s returned %s\n",
+                       __FILE__,
+                       __LINE__,
+                       "\\BAD\\BAD\\nttransfile",
+                       nt_errstr(status));
+               goto err;
+       }
+
+       retval = true;
+
+  err:
+
+       (void)smb1_dfs_delete(cli, "\\BAD\\BAD\\nttransfile");
+       return retval;
+}
+
 /*
  * "Raw" test of different SMB1 operations to a DFS share.
  * We must (mostly) use the lower level smb1cli_XXXX() interfaces,
@@ -2828,6 +2951,11 @@ bool run_smb1_dfs_operations(int dummy)
                goto err;
        }
 
+       ok = test_smb1_nttrans_create(cli);
+       if (!ok) {
+               goto err;
+       }
+
        retval = true;
 
   err: