From ac0ffba004160693ea5829775d732146ef261c47 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 10 Nov 2010 17:54:57 -0800 Subject: Add test that detects problems in the SMB signing code when run through cli_write() (which doesn't use the new async methods). Unfortunately, and I think due to the socket wrapper code, this doesn't detect the failure on the build farm, but running the RW-SIGNING test separately against a Samba or Windows server using signing does. Jeremy. --- selftest/target/Samba3.pm | 2 ++ source3/script/tests/test_smbtorture_s3.sh | 2 +- source3/torture/torture.c | 46 +++++++++++++++++++++++------- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm index f1387d9fc3..1326949e6a 100644 --- a/selftest/target/Samba3.pm +++ b/selftest/target/Samba3.pm @@ -525,6 +525,8 @@ sub provision($$$$$$) max protocol = SMB2 read only = no + server signing = auto + smbd:sharedelay = 100000 # smbd:writetimeupdatedelay = 500000 map hidden = no diff --git a/source3/script/tests/test_smbtorture_s3.sh b/source3/script/tests/test_smbtorture_s3.sh index 1abf7b6d8f..4680f64039 100755 --- a/source3/script/tests/test_smbtorture_s3.sh +++ b/source3/script/tests/test_smbtorture_s3.sh @@ -28,7 +28,7 @@ tests="FDPASS LOCK1 LOCK2 LOCK3 LOCK4 LOCK5 LOCK6 LOCK7 LOCK9" #tests="$tests UNLINK BROWSE ATTR TRANS2 MAXFID TORTURE " tests="$tests UNLINK BROWSE ATTR TRANS2 TORTURE " tests="$tests OPLOCK1 OPLOCK2 OPLOCK3 STREAMERROR" -tests="$tests DIR DIR1 DIR-CREATETIME TCON TCONDEV RW1 RW2 RW3" +tests="$tests DIR DIR1 DIR-CREATETIME TCON TCONDEV RW1 RW2 RW3 RW-SIGNING" tests="$tests OPEN XCOPY RENAME DELETE PROPERTIES W2K" tests="$tests TCON2 IOCTL CHKPATH FDSESS LOCAL-SUBSTITUTE CHAIN1" tests="$tests GETADDRINFO POSIX UID-REGRESSION-TEST SHORTNAME-TEST" diff --git a/source3/torture/torture.c b/source3/torture/torture.c index 161c6f9a64..f69d734b7b 100644 --- a/source3/torture/torture.c +++ b/source3/torture/torture.c @@ -52,6 +52,7 @@ static fstring multishare_conn_fname; 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; @@ -178,7 +179,7 @@ static struct cli_state *open_nbt_connection(void) 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; } @@ -311,7 +312,7 @@ static struct cli_state *open_bad_nbt_connection(void) 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; } @@ -412,7 +413,7 @@ static bool torture_open_connection_share(struct cli_state **c, hostname, NULL, port_to_use, sharename, "?????", username, workgroup, - password, flags, Undefined, &retry); + password, flags, signing_state, &retry); 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)); @@ -887,7 +888,7 @@ static bool run_readwritemulti(int dummy) 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; @@ -902,9 +903,17 @@ static bool run_readwritelarge(int dummy) cli_sockopt(cli1, sockops); memset(buf,'\0',sizeof(buf)); - cli1->max_xmit = 128*1024; + cli1->max_xmit = max_xmit_k*1024; + + if (signing_state == Required) { + /* Horrible cheat to force + multiple signed outstanding + packets against a Samba server. + */ + cli1->is_samba = false; + } - printf("starting readwritelarge\n"); + printf("starting readwritelarge_internal\n"); cli_unlink(cli1, lockfname, aSYSTEM | aHIDDEN); @@ -923,10 +932,10 @@ static bool run_readwritelarge(int dummy) } 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; } @@ -958,10 +967,10 @@ static bool run_readwritelarge(int dummy) } 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; } @@ -992,6 +1001,20 @@ static bool run_readwritelarge(int dummy) 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; @@ -1440,7 +1463,7 @@ static bool run_tcon_devtype_test(int dummy) host, NULL, port_to_use, NULL, NULL, username, workgroup, - password, flags, Undefined, &retry); + password, flags, signing_state, &retry); if (!NT_STATUS_IS_OK(status)) { printf("could not open connection\n"); @@ -7782,6 +7805,7 @@ static struct { {"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}, -- cgit