diff options
Diffstat (limited to 'source3/torture/test_cleanup.c')
-rw-r--r-- | source3/torture/test_cleanup.c | 87 |
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; +} |