bool run_smb2_basic(int dummy) { struct cli_state *cli; NTSTATUS status; uint64_t fid_persistent, fid_volatile; const char *hello = "Hello, world\n"; uint8_t *result; uint32_t nread; uint8_t *dir_data; uint32_t dir_data_length; printf("Starting SMB2-BASIC\n"); if (!torture_init_connection(&cli)) { return false; } cli->smb2.pid = 0xFEFF; status = smb2cli_negprot(cli); if (!NT_STATUS_IS_OK(status)) { printf("smb2cli_negprot returned %s\n", nt_errstr(status)); return false; } status = smb2cli_sesssetup_ntlmssp(cli, username, workgroup, password); if (!NT_STATUS_IS_OK(status)) { printf("smb2cli_sesssetup returned %s\n", nt_errstr(status)); return false; } status = smb2cli_tcon(cli, share); if (!NT_STATUS_IS_OK(status)) { printf("smb2cli_tcon returned %s\n", nt_errstr(status)); return false; } status = smb2cli_create(cli, "smb2-basic.txt", SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */ SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */ SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */ FILE_ATTRIBUTE_NORMAL, /* file_attributes, */ FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */ FILE_CREATE, /* create_disposition, */ FILE_DELETE_ON_CLOSE, /* create_options, */ NULL, /* smb2_create_blobs *blobs */ &fid_persistent, &fid_volatile); if (!NT_STATUS_IS_OK(status)) { printf("smb2cli_create returned %s\n", nt_errstr(status)); return false; } status = smb2cli_write(cli, strlen(hello), 0, fid_persistent, fid_volatile, 0, 0, (const uint8_t *)hello); if (!NT_STATUS_IS_OK(status)) { printf("smb2cli_write returned %s\n", nt_errstr(status)); return false; } status = smb2cli_flush(cli, fid_persistent, fid_volatile); if (!NT_STATUS_IS_OK(status)) { printf("smb2cli_flush returned %s\n", nt_errstr(status)); return false; } status = smb2cli_read(cli, 0x10000, 0, fid_persistent, fid_volatile, 2, 0, talloc_tos(), &result, &nread); if (!NT_STATUS_IS_OK(status)) { printf("smb2cli_read returned %s\n", nt_errstr(status)); return false; } if (nread != strlen(hello)) { printf("smb2cli_read returned %d bytes, expected %d\n", (int)nread, (int)strlen(hello)); return false; } if (memcmp(hello, result, nread) != 0) { printf("smb2cli_read returned '%s', expected '%s'\n", result, hello); return false; } status = smb2cli_close(cli, 0, fid_persistent, fid_volatile); if (!NT_STATUS_IS_OK(status)) { printf("smb2cli_close returned %s\n", nt_errstr(status)); return false; } status = smb2cli_create(cli, "", SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */ SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */ SEC_STD_SYNCHRONIZE| SEC_DIR_LIST| SEC_DIR_READ_ATTRIBUTE, /* desired_access, */ 0, /* file_attributes, */ FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */ FILE_OPEN, /* create_disposition, */ FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE, /* create_options, */ NULL, /* smb2_create_blobs *blobs */ &fid_persistent, &fid_volatile); if (!NT_STATUS_IS_OK(status)) { printf("smb2cli_create returned %s\n", nt_errstr(status)); return false; } status = smb2cli_query_directory( cli, 1, 0, 0, fid_persistent, fid_volatile, "*", 0xffff, talloc_tos(), &dir_data, &dir_data_length); if (!NT_STATUS_IS_OK(status)) { printf("smb2cli_query_directory returned %s\n", nt_errstr(status)); return false; } status = smb2cli_close(cli, 0, fid_persistent, fid_volatile); if (!NT_STATUS_IS_OK(status)) { printf("smb2cli_close returned %s\n", nt_errstr(status)); return false; } return true; }
static int tstream_smbXcli_np_destructor(struct tstream_smbXcli_np *cli_nps) { NTSTATUS status; if (cli_nps->conn_ref != NULL) { cli_nps->conn_ref->cli_nps = NULL; TALLOC_FREE(cli_nps->conn_ref); } if (cli_nps->session_ref != NULL) { cli_nps->session_ref->cli_nps = NULL; TALLOC_FREE(cli_nps->session_ref); } if (cli_nps->tcon_ref != NULL) { cli_nps->tcon_ref->cli_nps = NULL; TALLOC_FREE(cli_nps->tcon_ref); } if (!smbXcli_conn_is_connected(cli_nps->conn)) { return 0; } /* * TODO: do not use a sync call with a destructor!!! * * This only happens, if a caller does talloc_free(), * while the everything was still ok. * * If we get an unexpected failure within a normal * operation, we already do an async cli_close_send()/_recv(). * * Once we've fixed all callers to call * tstream_disconnect_send()/_recv(), this will * never be called. */ if (cli_nps->is_smb1) { status = smb1cli_close(cli_nps->conn, cli_nps->timeout, cli_nps->pid, cli_nps->tcon, cli_nps->session, cli_nps->fnum, UINT32_MAX); } else { status = smb2cli_close(cli_nps->conn, cli_nps->timeout, cli_nps->session, cli_nps->tcon, 0, /* flags */ cli_nps->fid_persistent, cli_nps->fid_volatile); } if (!NT_STATUS_IS_OK(status)) { DEBUG(1, ("tstream_smbXcli_np_destructor: cli_close " "failed on pipe %s. Error was %s\n", cli_nps->npipe, nt_errstr(status))); } /* * We can't do much on failure */ return 0; }