*/
#include "includes.h"
-#include "nsswitch/libwbclient/wbc_async.h"
+#include "wbc_async.h"
#include "torture/proto.h"
-#include "libcli/security/dom_sid.h"
+#include "libcli/security/security.h"
#include "tldap.h"
#include "tldap_util.h"
#include "../librpc/gen_ndr/svcctl.h"
#include "nsswitch/winbind_client.h"
#include "dbwrap.h"
#include "talloc_dict.h"
+#include "async_smb.h"
extern char *optarg;
extern int optind;
static bool use_multishare_conn = False;
static bool do_encrypt;
static const char *local_path = NULL;
+static int signing_state = Undefined;
bool torture_showall = False;
zero_sockaddr(&ss);
- if (!(c = cli_initialise())) {
+ if (!(c = cli_initialise_ex(signing_state))) {
printf("Failed initialize cli_struct to connect with %s\n", host);
return NULL;
}
return c;
}
+/****************************************************************************
+ Send a corrupt session request. See rfc1002.txt 4.3 and 4.3.2.
+****************************************************************************/
+
+static bool cli_bad_session_request(struct cli_state *cli,
+ struct nmb_name *calling, struct nmb_name *called)
+{
+ char *p;
+ int len = 4;
+ int namelen = 0;
+ char *tmp;
+
+ memcpy(&(cli->calling), calling, sizeof(*calling));
+ memcpy(&(cli->called ), called , sizeof(*called ));
+
+ /* put in the destination name */
+
+ tmp = name_mangle(talloc_tos(), cli->called.name,
+ cli->called.name_type);
+ if (tmp == NULL) {
+ return false;
+ }
+
+ p = cli->outbuf+len;
+ namelen = name_len((unsigned char *)tmp, talloc_get_size(tmp));
+ if (namelen > 0) {
+ memcpy(p, tmp, namelen);
+ len += namelen;
+ }
+ TALLOC_FREE(tmp);
+
+ /* Deliberately corrupt the name len (first byte) */
+ *p = 100;
+
+ /* and my name */
+
+ tmp = name_mangle(talloc_tos(), cli->calling.name,
+ cli->calling.name_type);
+ if (tmp == NULL) {
+ return false;
+ }
+
+ p = cli->outbuf+len;
+ namelen = name_len((unsigned char *)tmp, talloc_get_size(tmp));
+ if (namelen > 0) {
+ memcpy(p, tmp, namelen);
+ len += namelen;
+ }
+ TALLOC_FREE(tmp);
+ /* Deliberately corrupt the name len (first byte) */
+ *p = 100;
+
+ /* send a session request (RFC 1002) */
+ /* setup the packet length
+ * Remove four bytes from the length count, since the length
+ * field in the NBT Session Service header counts the number
+ * of bytes which follow. The cli_send_smb() function knows
+ * about this and accounts for those four bytes.
+ * CRH.
+ */
+ len -= 4;
+ _smb_setlen(cli->outbuf,len);
+ SCVAL(cli->outbuf,0,0x81);
+
+ cli_send_smb(cli);
+ DEBUG(5,("Sent session request\n"));
+
+ if (!cli_receive_smb(cli))
+ return False;
+
+ if (CVAL(cli->inbuf,0) != 0x82) {
+ /* This is the wrong place to put the error... JRA. */
+ cli->rap_error = CVAL(cli->inbuf,4);
+ return False;
+ }
+ return(True);
+}
+
+static struct cli_state *open_bad_nbt_connection(void)
+{
+ struct nmb_name called, calling;
+ struct sockaddr_storage ss;
+ struct cli_state *c;
+ NTSTATUS status;
+
+ make_nmb_name(&calling, myname, 0x0);
+ make_nmb_name(&called , host, 0x20);
+
+ zero_sockaddr(&ss);
+
+ if (!(c = cli_initialise_ex(signing_state))) {
+ printf("Failed initialize cli_struct to connect with %s\n", host);
+ return NULL;
+ }
+
+ c->port = 139;
+
+ status = cli_connect(c, host, &ss);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("Failed to connect with %s. Error %s\n", host, nt_errstr(status) );
+ return NULL;
+ }
+
+ c->timeout = 4000; /* set a short timeout (4 seconds) */
+
+ if (!cli_bad_session_request(c, &calling, &called)) {
+ printf("Failed to connect with %s. Error %s\n", host, nt_errstr(status) );
+ return NULL;
+ }
+
+ return c;
+}
+
+
/* Insert a NULL at the first separator of the given path and return a pointer
* to the remainder of the string.
*/
const char *hostname,
const char *sharename)
{
- bool retry;
int flags = 0;
NTSTATUS status;
hostname, NULL, port_to_use,
sharename, "?????",
username, workgroup,
- password, flags, Undefined, &retry);
+ password, flags, signing_state);
if (!NT_STATUS_IS_OK(status)) {
printf("failed to open share connection: //%s/%s port:%d - %s\n",
hostname, sharename, port_to_use, nt_errstr(status));
return test;
}
-static bool run_readwritelarge(int dummy)
+static bool run_readwritelarge_internal(int max_xmit_k)
{
static struct cli_state *cli1;
uint16_t fnum1;
cli_sockopt(cli1, sockops);
memset(buf,'\0',sizeof(buf));
- cli1->max_xmit = 128*1024;
+ cli1->max_xmit = max_xmit_k*1024;
- printf("starting readwritelarge\n");
+ if (signing_state == Required) {
+ /* Horrible cheat to force
+ multiple signed outstanding
+ packets against a Samba server.
+ */
+ cli1->is_samba = false;
+ }
+
+ printf("starting readwritelarge_internal\n");
cli_unlink(cli1, lockfname, aSYSTEM | aHIDDEN);
cli_write(cli1, fnum1, 0, buf, 0, sizeof(buf));
- if (!cli_qfileinfo(cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) {
+ if (!NT_STATUS_IS_OK(cli_qfileinfo_basic(
+ cli1, fnum1, NULL, &fsize, NULL, NULL,
+ NULL, NULL, NULL))) {
printf("qfileinfo failed (%s)\n", cli_errstr(cli1));
correct = False;
}
if (fsize == sizeof(buf))
- printf("readwritelarge test 1 succeeded (size = %lx)\n",
+ printf("readwritelarge_internal test 1 succeeded (size = %lx)\n",
(unsigned long)fsize);
else {
- printf("readwritelarge test 1 failed (size = %lx)\n",
+ printf("readwritelarge_internal test 1 failed (size = %lx)\n",
(unsigned long)fsize);
correct = False;
}
cli_smbwrite(cli1, fnum1, buf, 0, sizeof(buf));
- if (!cli_qfileinfo(cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) {
+ if (!NT_STATUS_IS_OK(cli_qfileinfo_basic(
+ cli1, fnum1, NULL, &fsize, NULL, NULL,
+ NULL, NULL, NULL))) {
printf("qfileinfo failed (%s)\n", cli_errstr(cli1));
correct = False;
}
if (fsize == sizeof(buf))
- printf("readwritelarge test 2 succeeded (size = %lx)\n",
+ printf("readwritelarge_internal test 2 succeeded (size = %lx)\n",
(unsigned long)fsize);
else {
- printf("readwritelarge test 2 failed (size = %lx)\n",
+ printf("readwritelarge_internal test 2 failed (size = %lx)\n",
(unsigned long)fsize);
correct = False;
}
printf("set allocation size to zero failed (%s)\n", cli_errstr(&cli1));
return False;
}
- if (!cli_qfileinfo(cli1, fnum1, NULL, &fsize, NULL, NULL, NULL, NULL, NULL)) {
+ if (!cli_qfileinfo_basic(cli1, fnum1, NULL, &fsize, NULL, NULL, NULL,
+ NULL, NULL)) {
printf("qfileinfo failed (%s)\n", cli_errstr(cli1));
correct = False;
}
return correct;
}
+static bool run_readwritelarge(int dummy)
+{
+ return run_readwritelarge_internal(128);
+}
+
+static bool run_readwritelarge_signtest(int dummy)
+{
+ bool ret;
+ signing_state = Required;
+ ret = run_readwritelarge_internal(2);
+ signing_state = Undefined;
+ return ret;
+}
+
int line_count = 0;
int nbio_id;
static bool run_tcon_devtype_test(int dummy)
{
static struct cli_state *cli1 = NULL;
- bool retry;
int flags = 0;
NTSTATUS status;
bool ret = True;
host, NULL, port_to_use,
NULL, NULL,
username, workgroup,
- password, flags, Undefined, &retry);
+ password, flags, signing_state);
if (!NT_STATUS_IS_OK(status)) {
printf("could not open connection\n");
return correct;
}
+/* send smb negprot commands, not reading the response */
+static bool run_bad_nbt_session(int dummy)
+{
+ static struct cli_state *cli;
+
+ printf("starting bad nbt session test\n");
+
+ if (!(cli = open_bad_nbt_connection())) {
+ return False;
+ }
+
+ cli_shutdown(cli);
+ printf("finished bad nbt session test\n");
+ return true;
+}
/* send random IPC commands */
static bool run_randomipc(int dummy)
cli_unlink(cli, fname, aSYSTEM | aHIDDEN);
cli_open(cli, fname,
O_RDWR | O_CREAT | O_TRUNC, DENY_NONE, &fnum);
- if (!cli_qfileinfo(cli, fnum, NULL, &size, &c_time_ts, &a_time_ts, &w_time_ts,
- &m_time_ts, NULL)) {
+ if (!NT_STATUS_IS_OK(cli_qfileinfo_basic(
+ cli, fnum, NULL, &size, &c_time_ts,
+ &a_time_ts, &w_time_ts,
+ &m_time_ts, NULL))) {
printf("ERROR: qfileinfo failed (%s)\n", cli_errstr(cli));
correct = False;
}
- if (!cli_qfilename(cli, fnum, pname, sizeof(pname))) {
+ if (!NT_STATUS_IS_OK(cli_qfilename(cli, fnum, pname, sizeof(pname)))) {
printf("ERROR: qfilename failed (%s)\n", cli_errstr(cli));
correct = False;
}
This checks new W2K calls.
*/
-static bool new_trans(struct cli_state *pcli, int fnum, int level)
+static NTSTATUS new_trans(struct cli_state *pcli, int fnum, int level)
{
- char *buf = NULL;
+ uint8_t *buf = NULL;
uint32 len;
- bool correct = True;
+ NTSTATUS status;
- if (!cli_qfileinfo_test(pcli, fnum, level, &buf, &len)) {
- printf("ERROR: qfileinfo (%d) failed (%s)\n", level, cli_errstr(pcli));
- correct = False;
+ status = cli_qfileinfo(talloc_tos(), pcli, fnum, level, 0,
+ pcli->max_xmit, &buf, &len);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("ERROR: qfileinfo (%d) failed (%s)\n", level,
+ nt_errstr(status));
} else {
printf("qfileinfo: level %d, len = %u\n", level, len);
dump_data(0, (uint8 *)buf, len);
printf("\n");
}
- SAFE_FREE(buf);
- return correct;
+ TALLOC_FREE(buf);
+ return status;
}
static bool run_w2ktest(int dummy)
goto fail;
}
-#if 0 /* JRATEST */
- {
- uint32 *accinfo = NULL;
- uint32 len;
- cli_qfileinfo_test(cli1, fnum1, SMB_FILE_ACCESS_INFORMATION, (char **)&accinfo, &len);
- if (accinfo)
- printf("access mode = 0x%lx\n", *accinfo);
- SAFE_FREE(accinfo);
- }
-#endif
-
if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
printf("[1] close failed (%s)\n", cli_errstr(cli1));
correct = False;
cli_unlink(cli1, fname, aSYSTEM | aHIDDEN);
-
- printf("testing ctemp\n");
+ printf("Do ctemp tests\n");
if (!NT_STATUS_IS_OK(cli_ctemp(cli1, talloc_tos(), "\\", &fnum1, &tmp_path))) {
printf("ctemp failed (%s)\n", cli_errstr(cli1));
return False;
if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
- printf("test 1 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
+ printf("TEST #1 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
return False;
}
if (!NT_STATUS_IS_OK(cli_ntcreate(cli2, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0, &fnum2))) {
- printf("test 1 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
+ printf("TEST #1 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
return False;
}
if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
- printf("test 1 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
+ printf("TEST #1 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
return False;
}
if (!NT_STATUS_IS_OK(cli_close(cli2, fnum2))) {
- printf("test 1 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
+ printf("TEST #1 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
return False;
}
if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
- printf("test 2 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
+ printf("TEST #2 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
return False;
}
if (!NT_STATUS_IS_OK(cli_ntcreate(cli2, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0, &fnum2))) {
- printf("test 2 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
+ printf("TEST #2 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
return False;
}
if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
- printf("test 1 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
+ printf("TEST #2 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
return False;
}
if (!NT_STATUS_IS_OK(cli_close(cli2, fnum2))) {
- printf("test 1 close 2 of %s failed (%s)\n", fname, cli_errstr(cli1));
+ printf("TEST #2 close 2 of %s failed (%s)\n", fname, cli_errstr(cli1));
return False;
}
if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
- printf("test 3 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
+ printf("TEST #3 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
return False;
}
if (!NT_STATUS_IS_OK(cli_ntcreate(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0, &fnum2))) {
- printf("test 3 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
+ printf("TEST #3 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
return False;
}
if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
- printf("test 3 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
+ printf("TEST #3 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
return False;
}
if (!NT_STATUS_IS_OK(cli_close(cli2, fnum2))) {
- printf("test 3 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
+ printf("TEST #3 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
return False;
}
if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
- printf("test 4 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
+ printf("TEST #4 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
return False;
}
if (NT_STATUS_IS_OK(cli_ntcreate(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_NONE, FILE_OPEN_IF, 0, 0, &fnum2))) {
- printf("test 4 open 2 of %s SUCCEEDED - should have failed (%s)\n", fname, cli_errstr(cli2));
+ printf("TEST #4 open 2 of %s SUCCEEDED - should have failed (%s)\n", fname, cli_errstr(cli2));
return False;
}
- printf("test 3 open 2 of %s gave %s (correct error should be %s)\n", fname, cli_errstr(cli2), "sharing violation");
+ printf("TEST #4 open 2 of %s gave %s (correct error should be %s)\n", fname, cli_errstr(cli2), "sharing violation");
if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
- printf("test 4 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
+ printf("TEST #4 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
return False;
}
if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_DELETE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
- printf("test 5 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
+ printf("TEST #5 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
return False;
}
if (!NT_STATUS_IS_OK(cli_ntcreate(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_DELETE, FILE_OPEN_IF, 0, 0, &fnum2))) {
- printf("test 5 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
+ printf("TEST #5 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
return False;
}
if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
- printf("test 5 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
+ printf("TEST #5 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
return False;
}
if (!NT_STATUS_IS_OK(cli_close(cli2, fnum2))) {
- printf("test 5 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
+ printf("TEST #5 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
return False;
}
if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
- printf("test 6 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
+ printf("TEST #6 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
return False;
}
if (!NT_STATUS_IS_OK(cli_ntcreate(cli2, fname, 0, FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ, FILE_OPEN_IF, 0, 0, &fnum2))) {
- printf("test 6 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
+ printf("TEST #6 open 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
return False;
}
if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
- printf("test 6 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
+ printf("TEST #6 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
return False;
}
if (!NT_STATUS_IS_OK(cli_close(cli2, fnum2))) {
- printf("test 6 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
+ printf("TEST #6 close 2 of %s failed (%s)\n", fname, cli_errstr(cli2));
return False;
}
if (!NT_STATUS_IS_OK(cli_ntcreate(cli1, fname, 0, FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_NONE, FILE_OVERWRITE_IF, 0, 0, &fnum1))) {
- printf("test 7 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
+ printf("TEST #7 open 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
return False;
}
if (NT_STATUS_IS_OK(cli_ntcreate(cli2, fname, 0, DELETE_ACCESS|FILE_READ_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ|FILE_SHARE_DELETE, FILE_OPEN_IF, 0, 0, &fnum2))) {
- printf("test 7 open 2 of %s SUCCEEDED - should have failed (%s)\n", fname, cli_errstr(cli2));
+ printf("TEST #7 open 2 of %s SUCCEEDED - should have failed (%s)\n", fname, cli_errstr(cli2));
return False;
}
- printf("test 7 open 2 of %s gave %s (correct error should be %s)\n", fname, cli_errstr(cli2), "sharing violation");
+ printf("TEST #7 open 2 of %s gave %s (correct error should be %s)\n", fname, cli_errstr(cli2), "sharing violation");
if (!NT_STATUS_IS_OK(cli_close(cli1, fnum1))) {
- printf("test 7 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
+ printf("TEST #7 close 1 of %s failed (%s)\n", fname, cli_errstr(cli1));
return False;
}
return correct;
}
-static void list_fn(const char *mnt, struct file_info *finfo,
+static NTSTATUS list_fn(const char *mnt, struct file_info *finfo,
const char *name, void *state)
{
int *matched = (int *)state;
if (matched != NULL) {
*matched += 1;
}
+ return NT_STATUS_OK;
}
/*
return correct;
}
-static void del_fn(const char *mnt, struct file_info *finfo, const char *mask,
+static NTSTATUS del_fn(const char *mnt, struct file_info *finfo, const char *mask,
void *state)
{
struct cli_state *pcli = (struct cli_state *)state;
slprintf(fname, sizeof(fname), "\\LISTDIR\\%s", finfo->name);
if (strcmp(finfo->name, ".") == 0 || strcmp(finfo->name, "..") == 0)
- return;
+ return NT_STATUS_OK;
if (finfo->mode & aDIR) {
if (!NT_STATUS_IS_OK(cli_rmdir(pcli, fname)))
if (!NT_STATUS_IS_OK(cli_unlink(pcli, fname, aSYSTEM | aHIDDEN)))
printf("del_fn: failed to unlink %s\n,", fname );
}
+ return NT_STATUS_OK;
}
slprintf(ea_name, sizeof(ea_name), "EA_%d", i);
memset(ea_val, (char)i+1, i+1);
- if (!cli_set_ea_fnum(cli, fnum, ea_name, ea_val, i+1)) {
- printf("ea_set of name %s failed - %s\n", ea_name, cli_errstr(cli));
+ status = cli_set_ea_fnum(cli, fnum, ea_name, ea_val, i+1);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("ea_set of name %s failed - %s\n", ea_name,
+ nt_errstr(status));
talloc_destroy(mem_ctx);
return False;
}
slprintf(ea_name, sizeof(ea_name), "EA_%d", i+10);
memset(ea_val, (char)i+1, i+1);
- if (!cli_set_ea_path(cli, fname, ea_name, ea_val, i+1)) {
- printf("ea_set of name %s failed - %s\n", ea_name, cli_errstr(cli));
+ status = cli_set_ea_path(cli, fname, ea_name, ea_val, i+1);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("ea_set of name %s failed - %s\n", ea_name,
+ nt_errstr(status));
talloc_destroy(mem_ctx);
return False;
}
for (i = 0; i < 20; i++) {
fstring ea_name;
slprintf(ea_name, sizeof(ea_name), "ea_%d", i);
- if (!cli_set_ea_path(cli, fname, ea_name, "", 0)) {
- printf("ea_set of name %s failed - %s\n", ea_name, cli_errstr(cli));
+ status = cli_set_ea_path(cli, fname, ea_name, "", 0);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("ea_set of name %s failed - %s\n", ea_name,
+ nt_errstr(status));
talloc_destroy(mem_ctx);
return False;
}
}
/* Try and delete a non existant EA. */
- if (!cli_set_ea_path(cli, fname, "foo", "", 0)) {
- printf("deleting non-existant EA 'foo' should succeed. %s\n", cli_errstr(cli));
+ status = cli_set_ea_path(cli, fname, "foo", "", 0);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("deleting non-existant EA 'foo' should succeed. %s\n",
+ nt_errstr(status));
correct = False;
}
cli->vuid = old_vuid;
/* Try an operation. */
- if (!NT_STATUS_IS_OK(cli_mkdir(cli, "\\uid_reg_test"))) {
- /* We expect bad uid. */
+ status = cli_mkdir(cli, "\\uid_reg_test");
+ if (NT_STATUS_IS_OK(status)) {
+ d_printf("(%s) cli_mkdir succeeded\n",
+ __location__);
+ correct = false;
+ goto out;
+ } else {
+ /* Should be bad uid. */
if (!check_error(__LINE__, cli, ERRSRV, ERRbaduid,
- NT_STATUS_NO_SUCH_USER)) {
- return False;
+ NT_STATUS_USER_SESSION_DELETED)) {
+ correct = false;
+ goto out;
}
}
status = cli_tdis(cli);
if (NT_STATUS_IS_OK(status)) {
- printf("First tdis with invalid vuid should succeed.\n");
+ d_printf("First tdis with invalid vuid should succeed.\n");
} else {
- printf("First tdis failed (%s)\n", nt_errstr(status));
+ d_printf("First tdis failed (%s)\n", nt_errstr(status));
+ correct = false;
+ goto out;
}
cli->vuid = old_vuid;
/* This should fail. */
status = cli_tdis(cli);
if (NT_STATUS_IS_OK(status)) {
- printf("Second tdis with invalid vuid should fail - succeeded instead !.\n");
+ d_printf("Second tdis with invalid vuid should fail - succeeded instead !.\n");
+ correct = false;
+ goto out;
} else {
/* Should be bad tid. */
if (!check_error(__LINE__, cli, ERRSRV, ERRinvnid,
NT_STATUS_NETWORK_NAME_DELETED)) {
- return False;
+ correct = false;
+ goto out;
}
}
static const char *illegal_chars = "*\\/?<>|\":";
static char force_shortname_chars[] = " +,.[];=\177";
-static void shortname_del_fn(const char *mnt, struct file_info *finfo,
+static NTSTATUS shortname_del_fn(const char *mnt, struct file_info *finfo,
const char *mask, void *state)
{
struct cli_state *pcli = (struct cli_state *)state;
fstring fname;
+ NTSTATUS status = NT_STATUS_OK;
+
slprintf(fname, sizeof(fname), "\\shortname\\%s", finfo->name);
if (strcmp(finfo->name, ".") == 0 || strcmp(finfo->name, "..") == 0)
- return;
+ return NT_STATUS_OK;
if (finfo->mode & aDIR) {
- if (!NT_STATUS_IS_OK(cli_rmdir(pcli, fname)))
+ status = cli_rmdir(pcli, fname);
+ if (!NT_STATUS_IS_OK(status)) {
printf("del_fn: failed to rmdir %s\n,", fname );
+ }
} else {
- if (!NT_STATUS_IS_OK(cli_unlink(pcli, fname, aSYSTEM | aHIDDEN)))
+ status = cli_unlink(pcli, fname, aSYSTEM | aHIDDEN);
+ if (!NT_STATUS_IS_OK(status)) {
printf("del_fn: failed to unlink %s\n,", fname );
+ }
}
+ return status;
}
struct sn_state {
bool val;
};
-static void shortname_list_fn(const char *mnt, struct file_info *finfo,
+static NTSTATUS shortname_list_fn(const char *mnt, struct file_info *finfo,
const char *name, void *state)
{
struct sn_state *s = (struct sn_state *)state;
s->val = true;
}
s->matched += 1;
+ return NT_STATUS_OK;
}
static bool run_shortname_test(int dummy)
printf("could not parse S-1-5-32-545\n");
return false;
}
- if (!sid_equal(&sid, &global_sid_Builtin_Users)) {
+ if (!dom_sid_equal(&sid, &global_sid_Builtin_Users)) {
printf("mis-parsed S-1-5-32-545 as %s\n",
sid_string_tos(&sid));
return false;
return true;
}
+static bool run_local_binary_to_sid(int dummy) {
+ struct dom_sid *sid = talloc(NULL, struct dom_sid);
+ static const char good_binary_sid[] = {
+ 0x1, /* revision number */
+ 15, /* num auths */
+ 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, /* id_auth */
+ 0x1, 0x1, 0x1, 0x1, /* auth[0] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[1] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[2] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[3] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[4] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[5] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[6] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[7] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[8] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[9] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[10] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[11] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[12] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[13] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[14] */
+ };
+
+ static const char long_binary_sid[] = {
+ 0x1, /* revision number */
+ 15, /* num auths */
+ 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, /* id_auth */
+ 0x1, 0x1, 0x1, 0x1, /* auth[0] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[1] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[2] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[3] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[4] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[5] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[6] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[7] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[8] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[9] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[10] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[11] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[12] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[13] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[14] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[15] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[16] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[17] */
+ };
+
+ static const char long_binary_sid2[] = {
+ 0x1, /* revision number */
+ 32, /* num auths */
+ 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, /* id_auth */
+ 0x1, 0x1, 0x1, 0x1, /* auth[0] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[1] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[2] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[3] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[4] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[5] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[6] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[7] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[8] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[9] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[10] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[11] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[12] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[13] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[14] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[15] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[16] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[17] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[18] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[19] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[20] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[21] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[22] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[23] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[24] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[25] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[26] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[27] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[28] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[29] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[30] */
+ 0x1, 0x1, 0x1, 0x1, /* auth[31] */
+ };
+
+ if (!sid_parse(good_binary_sid, sizeof(good_binary_sid), sid)) {
+ return false;
+ }
+ if (sid_parse(long_binary_sid2, sizeof(long_binary_sid2), sid)) {
+ return false;
+ }
+ if (sid_parse(long_binary_sid, sizeof(long_binary_sid), sid)) {
+ return false;
+ }
+ return true;
+}
+
/* Split a path name into filename and stream name components. Canonicalise
* such that an implicit $DATA token is always explicit.
*
return true;
error:
- d_fprintf(stderr, "test_stream(%s, %s, %s, %s)\n",
+ d_fprintf(stderr, "Do test_stream(%s, %s, %s, %s)\n",
fname, expected_base ? expected_base : "<NULL>",
expected_stream ? expected_stream : "<NULL>",
nt_errstr(expected_status));
{"RW1", run_readwritetest, 0},
{"RW2", run_readwritemulti, FLAG_MULTIPROC},
{"RW3", run_readwritelarge, 0},
+ {"RW-SIGNING", run_readwritelarge_signtest, 0},
{"OPEN", run_opentest, 0},
{"POSIX", run_simple_posix_open_test, 0},
{"POSIX-APPEND", run_posix_append, 0},
+ {"ASYNC-ECHO", run_async_echo, 0},
{ "UID-REGRESSION-TEST", run_uid_regression_test, 0},
{ "SHORTNAME-TEST", run_shortname_test, 0},
#if 1
{ "TLDAP", run_tldap },
{ "STREAMERROR", run_streamerror },
{ "NOTIFY-BENCH", run_notify_bench },
+ { "BAD-NBT-SESSION", run_bad_nbt_session },
{ "LOCAL-SUBSTITUTE", run_local_substitute, 0},
{ "LOCAL-GENCACHE", run_local_gencache, 0},
{ "LOCAL-TALLOC-DICT", run_local_talloc_dict, 0},
{ "LOCAL-STREAM-NAME", run_local_stream_name, 0},
{ "LOCAL-WBCLIENT", run_local_wbclient, 0},
{ "LOCAL-string_to_sid", run_local_string_to_sid, 0},
+ { "LOCAL-binary_to_sid", run_local_binary_to_sid, 0},
{ "LOCAL-DBTRANS", run_local_dbtrans, 0},
{ "LOCAL-TEVENT-SELECT", run_local_tevent_select, 0},
{NULL, NULL, 0}};
TALLOC_CTX *frame = talloc_stackframe();
int seed = time(NULL);
- dbf = x_stdout;
-
#ifdef HAVE_SETBUFFER
setbuffer(stdout, NULL, 0);
#endif
- load_case_tables();
+ setup_logging("smbtorture", DEBUG_STDOUT);
- setup_logging("smbtorture", true);
+ load_case_tables();
if (is_default_dyn_CONFIGFILE()) {
if(getenv("SMB_CONF_PATH")) {
torture_numops = atoi(optarg);
break;
case 'd':
- DEBUGLEVEL = atoi(optarg);
+ lp_set_cmdline("log level", optarg);
break;
case 'O':
sockops = optarg;