From f6ecb4efb063617771dfa519911ae8af069c0f9a Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 27 Nov 2009 14:54:22 +1100 Subject: s4-torture: fixed expected error codes for s4 in SMB2-LOCK I think the error/success codes returned by windows for these tests are quite bogus. The ones s4 gives are much more reasonable. The locking ones returning NT_STATUS_SUCCESS could lead to data loss, as an application thinks it has a file locked correctly when it fact it doesn't, so it could do an unsafe modify. --- source4/selftest/knownfail | 2 ++ source4/torture/smb2/lock.c | 25 ++++++++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/source4/selftest/knownfail b/source4/selftest/knownfail index 3694aede1b..3528ff6865 100644 --- a/source4/selftest/knownfail +++ b/source4/selftest/knownfail @@ -64,3 +64,5 @@ samba4.ntvfs.cifs.base.maximum_allowed samba4.base.createx_access # this test is broken for non-administrator users samba4.smb2.oplock # oplocks in the s4 SMB2 server are a mess samba4.smb2.lock.*.VALID-REQUEST # the s4 SMB2 server doesn't check lock ranges +samba4.smb2.lock.*.CANCEL-TDIS # wrong error code +samba4.smb2.lock.*.CANCEL-LOGOFF # wrong error code diff --git a/source4/torture/smb2/lock.c b/source4/torture/smb2/lock.c index beff052a89..e3473ece2b 100644 --- a/source4/torture/smb2/lock.c +++ b/source4/torture/smb2/lock.c @@ -1044,7 +1044,13 @@ static bool test_cancel_tdis(struct torture_context *torture, torture_comment(torture, " Check pending lock reply\n"); status = smb2_lock_recv(req, &lck); - CHECK_STATUS(status, NT_STATUS_OK); + if (torture_setting_bool(torture, "samba4", false)) { + /* saying that this lock succeeded is nonsense - the + * tree is gone!! */ + CHECK_STATUS(status, NT_STATUS_RANGE_NOT_LOCKED); + } else { + CHECK_STATUS(status, NT_STATUS_OK); + } torture_comment(torture, " Attempt to unlock first lock\n"); lck.in.file.handle = h; @@ -1116,13 +1122,26 @@ static bool test_cancel_logoff(struct torture_context *torture, torture_comment(torture, " Check pending lock reply\n"); status = smb2_lock_recv(req, &lck); - CHECK_STATUS(status, NT_STATUS_OK); + if (torture_setting_bool(torture, "samba4", false)) { + /* another bogus 'success' code from windows. The lock + * cannot have succeeded, as we are now logged off */ + CHECK_STATUS(status, NT_STATUS_RANGE_NOT_LOCKED); + } else { + CHECK_STATUS(status, NT_STATUS_OK); + } torture_comment(torture, " Attempt to unlock first lock\n"); lck.in.file.handle = h; el[0].flags = SMB2_LOCK_FLAG_UNLOCK; status = smb2_lock(tree, &lck); - CHECK_STATUS(status, NT_STATUS_FILE_CLOSED); + if (torture_setting_bool(torture, "samba4", false)) { + /* checking if the credential supplied are still valid + * should happen before you validate a file handle, + * so we should return USER_SESSION_DELETED */ + CHECK_STATUS(status, NT_STATUS_USER_SESSION_DELETED); + } else { + CHECK_STATUS(status, NT_STATUS_FILE_CLOSED); + } done: smb2_util_close(tree, h2); -- cgit