summaryrefslogtreecommitdiff
path: root/source3/torture/test_cleanup.c
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2012-01-05 17:44:44 +0100
committerVolker Lendecke <vlendec@samba.org>2012-01-05 20:29:59 +0100
commitf97216eb4ae1052e435d83ce51a7067fa6697ff4 (patch)
tree9f6d5d7740271aa00a4db4c32180d68be37a26d7 /source3/torture/test_cleanup.c
parent515dfe6c7ff9f6aed94a51960bb26aabb6fb449b (diff)
downloadsamba-f97216eb4ae1052e435d83ce51a7067fa6697ff4.tar.gz
samba-f97216eb4ae1052e435d83ce51a7067fa6697ff4.tar.bz2
samba-f97216eb4ae1052e435d83ce51a7067fa6697ff4.zip
s3: Add a test for proper brlock cleanup
We need to improve the server here. Maybe we should validate the brlock entry whenever we detect a read/write being blocked from locking? This is not our hot code path anyway, and it would gain us significant robustness. The code might become quite a bit simpler as well.
Diffstat (limited to 'source3/torture/test_cleanup.c')
-rw-r--r--source3/torture/test_cleanup.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/source3/torture/test_cleanup.c b/source3/torture/test_cleanup.c
index 4e89893bcd..2b4989e48b 100644
--- a/source3/torture/test_cleanup.c
+++ b/source3/torture/test_cleanup.c
@@ -22,6 +22,7 @@
#include "system/filesys.h"
#include "libsmb/libsmb.h"
#include "libcli/smb/smbXcli_base.h"
+#include "libcli/security/security.h"
bool run_cleanup1(int dummy)
{
@@ -68,3 +69,89 @@ done:
torture_close_connection(cli);
return NT_STATUS_IS_OK(status);
}
+
+bool run_cleanup2(int dummy)
+{
+ struct cli_state *cli1, *cli2;
+ const char *fname = "\\cleanup2";
+ uint16_t fnum1, fnum2;
+ NTSTATUS status;
+ char buf;
+
+ printf("CLEANUP2: Checking that a conflicting brlock is cleaned up\n");
+
+ if (!torture_open_connection(&cli1, 0)) {
+ return false;
+ }
+ status = cli_ntcreate(
+ cli1, fname, 0, FILE_GENERIC_READ|FILE_GENERIC_WRITE,
+ FILE_ATTRIBUTE_NORMAL,
+ FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
+ FILE_OVERWRITE_IF, 0, 0, &fnum1);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("open of %s failed (%s)\n", fname, nt_errstr(status));
+ return false;
+ }
+ status = cli_lock32(cli1, fnum1, 0, 1, 0, WRITE_LOCK);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("lock failed (%s)\n", nt_errstr(status));
+ return false;
+ }
+
+ /*
+ * Check the file is indeed locked
+ */
+ if (!torture_open_connection(&cli2, 0)) {
+ return false;
+ }
+ status = cli_ntcreate(
+ cli2, fname, 0, FILE_GENERIC_READ|FILE_GENERIC_WRITE,
+ FILE_ATTRIBUTE_NORMAL,
+ FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
+ FILE_OPEN, 0, 0, &fnum2);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("open of %s failed (%s)\n", fname, nt_errstr(status));
+ return false;
+ }
+ buf = 'x';
+ status = cli_smbwrite(cli2, fnum2, &buf, 0, 1, NULL);
+ if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_LOCK_CONFLICT)) {
+ printf("write succeeded\n");
+ return false;
+ }
+
+ /*
+ * Kill the lock holder
+ */
+ status = smbXcli_conn_samba_suicide(cli1->conn, 1);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("smbXcli_conn_samba_suicide failed: %s\n",
+ nt_errstr(status));
+ return false;
+ }
+
+ /*
+ * Right now we don't clean up immediately. Re-open the 2nd connection.
+ */
+#if 1
+ cli_shutdown(cli2);
+ if (!torture_open_connection(&cli2, 0)) {
+ return false;
+ }
+ status = cli_ntcreate(
+ cli2, fname, 0, FILE_GENERIC_READ|FILE_GENERIC_WRITE,
+ FILE_ATTRIBUTE_NORMAL,
+ FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
+ FILE_OPEN, 0, 0, &fnum2);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("open of %s failed (%s)\n", fname, nt_errstr(status));
+ return false;
+ }
+#endif
+ status = cli_smbwrite(cli2, fnum2, &buf, 0, 1, NULL);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("write failed: %s\n", nt_errstr(status));
+ return false;
+ }
+ return true;
+}