summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2003-03-29 23:30:53 +0000
committerAndrew Tridgell <tridge@samba.org>2003-03-29 23:30:53 +0000
commit19a384a54c678e9e064a79abeb1cfa39f9201896 (patch)
treebc979e00c45d8e01550a48a1a621edee44f1428f
parent054e5daf7c362b55310d9159ac90732f6ee5f7e0 (diff)
downloadsamba-19a384a54c678e9e064a79abeb1cfa39f9201896.tar.gz
samba-19a384a54c678e9e064a79abeb1cfa39f9201896.tar.bz2
samba-19a384a54c678e9e064a79abeb1cfa39f9201896.zip
updated the TCON test so that win2000 passes. Samba now fails this
test. It is an interesting test because it shows that win2000 completely ignores the TID and VUID fields in a SMBwriteX. In Samba it is hard to do this as we check the VUID and TID fields before we call the SMB specific reply functions. The test also shows that the list of open files must be global to the socket, not specific to a tcon. (This used to be commit be98069c4e5bbfbe3ce66c20f796c2d2324e7511)
-rw-r--r--source3/torture/torture.c95
1 files changed, 63 insertions, 32 deletions
diff --git a/source3/torture/torture.c b/source3/torture/torture.c
index 6ab5bf6dbb..7bf4f10af0 100644
--- a/source3/torture/torture.c
+++ b/source3/torture/torture.c
@@ -902,77 +902,108 @@ static BOOL run_locktest1(int dummy)
}
/*
- checks for correct tconX support
+ this checks to see if a secondary tconx can use open files from an
+ earlier tconx
*/
static BOOL run_tcon_test(int dummy)
{
- static struct cli_state *cli1;
+ static struct cli_state *cli;
const char *fname = "\\tcontest.tmp";
int fnum1;
- uint16 cnum;
+ uint16 cnum1, cnum2, cnum3;
+ uint16 vuid1, vuid2;
char buf[4];
+ BOOL ret = True;
- if (!torture_open_connection(&cli1)) {
+ if (!torture_open_connection(&cli)) {
return False;
}
- cli_sockopt(cli1, sockops);
+ cli_sockopt(cli, sockops);
printf("starting tcontest\n");
- cli_unlink(cli1, fname);
+ cli_unlink(cli, fname);
- fnum1 = cli_open(cli1, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
- if (fnum1 == -1)
- {
- printf("open of %s failed (%s)\n", fname, cli_errstr(cli1));
+ fnum1 = cli_open(cli, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
+ if (fnum1 == -1) {
+ printf("open of %s failed (%s)\n", fname, cli_errstr(cli));
return False;
}
- cnum = cli1->cnum;
+ cnum1 = cli->cnum;
+ vuid1 = cli->vuid;
- if (cli_write(cli1, fnum1, 0, buf, 130, 4) != 4)
- {
- printf("write failed (%s)", cli_errstr(cli1));
+ if (cli_write(cli, fnum1, 0, buf, 130, 4) != 4) {
+ printf("initial write failed (%s)", cli_errstr(cli));
return False;
}
- if (!cli_send_tconX(cli1, share, "?????",
+ if (!cli_send_tconX(cli, share, "?????",
password, strlen(password)+1)) {
printf("%s refused 2nd tree connect (%s)\n", host,
- cli_errstr(cli1));
- cli_shutdown(cli1);
+ cli_errstr(cli));
+ cli_shutdown(cli);
return False;
}
- if (cli_write(cli1, fnum1, 0, buf, 130, 4) == 4)
- {
- printf("write succeeded (%s)", cli_errstr(cli1));
- return False;
+ cnum2 = cli->cnum;
+ cnum3 = MAX(cnum1, cnum2) + 1; /* any invalid number */
+ vuid2 = cli->vuid + 1;
+
+ /* try a write with the wrong tid */
+ cli->cnum = cnum2;
+
+ if (cli_write(cli, fnum1, 0, buf, 130, 4) == 4) {
+ printf("server allows write with wrong TID\n");
+ } else {
+ printf("* server fails write with wrong TID : %s\n", cli_errstr(cli));
+ ret = False;
}
- if (cli_close(cli1, fnum1)) {
- printf("close2 succeeded (%s)\n", cli_errstr(cli1));
- return False;
+
+ /* try a write with an invalid tid */
+ cli->cnum = cnum3;
+
+ if (cli_write(cli, fnum1, 0, buf, 130, 4) == 4) {
+ printf("server allows write with invalid TID\n");
+ } else {
+ printf("* server fails write with invalid TID : %s\n", cli_errstr(cli));
+ ret = False;
+ }
+
+ /* try a write with an invalid vuid */
+ cli->vuid = vuid2;
+ cli->cnum = cnum1;
+
+ if (cli_write(cli, fnum1, 0, buf, 130, 4) == 4) {
+ printf("server allows write with invalid VUID\n");
+ } else {
+ printf("* server fails write with invalid VUID : %s\n", cli_errstr(cli));
+ ret = False;
}
- if (!cli_tdis(cli1)) {
- printf("tdis failed (%s)\n", cli_errstr(cli1));
+ cli->cnum = cnum1;
+ cli->vuid = vuid1;
+
+ if (!cli_close(cli, fnum1)) {
+ printf("close failed (%s)\n", cli_errstr(cli));
return False;
}
- cli1->cnum = cnum;
+ cli->cnum = cnum2;
- if (!cli_close(cli1, fnum1)) {
- printf("close2 failed (%s)\n", cli_errstr(cli1));
+ if (!cli_tdis(cli)) {
+ printf("secondary tdis failed (%s)\n", cli_errstr(cli));
return False;
}
- if (!torture_close_connection(cli1)) {
+ cli->cnum = cnum1;
+
+ if (!torture_close_connection(cli)) {
return False;
}
- printf("Passed tcontest\n");
- return True;
+ return ret;
}