The branch, master has been updated via 4bbe291efcb vfs: Remove SMB_VFS_BRL_CANCEL_WINDOWS via 871bb7562ca smbd: Remove unused brlock code via b3284bef353 smbd: Cancel smbd_smb1_do_locks requests in reply_ntcancel via f37c14dd632 smbd: Add a clarifying comment on triggering waiters via d60a35bd75a smbd: Don't call cancel_pending_lock_requests_by_fid on close via b091c19cb20 smbd: Base smb2_lock.c on tevent_req via 6f204de7784 smbd: Use smbd_smb1_do_locks_send() in smb_set_posix_lock() via 4c1d574ebea smbd: Use smbd_smb1_do_locks_send() in reply_lockingX() via c4649b3ad6e smbd: Use smbd_smb1_do_locks_send() in reply_lock() via 1967bb8538f smbd: Use smbd_smb1_do_locks_send() in reply_lockread() via ab149a611f2 smbd: Remove SMB1 special case handling from brlock.c via 2d746d1364e smbd: Ping dbwrap_watch on locking.tdb for in smbd_do_unlocking() via fbbf684338d smbd: Add smbd_smb1_do_locks_send/recv() via f0a9459e66b smbd: Slightly simplify smbd_smb2_lock_send() via 67f89bb3300 smbd: Return "blocker_pid" from do_lock() via ca73ba859ed smbd: Add some paranoia against NULL dereference via 4adbeb9714b smbd: Add "blocker_pid" to brl_lock() via b752e242a6a torture3: Test cancelling locking&x with ntcancel via 56521c5fbf0 libsmb: Make cli_lockingx cancellable via 3f6ed6e3523 torture3: Run a blocking lock&x call with a subsequent read via b20231a1abb torture3: Test blocking posix locks via 2f1a459b742 torture3: Test LOCKINGX_CANCEL without locks via 7dec53ed0c1 torture3: Add a test to block a locking&read via ff992d1c6c3 smbd: Use smbd_do_unlocking() in reply_unlock() via 00b11867253 smbd: Use smbd_do_unlocking() in reply_writeunlock() via 865c86bd327 smbd: Use smbd_do_unlocking() in smb_set_posix_lock() via b3d533aa585 smbd: Add "lock_flav" to smbd_do_unlocking() via 4d6152b1bfa smbd: Simplify smb_set_posix_lock() via 10ba4aa6d5c smbd: Avoid casts in smb_set_posix_lock() via 1736f7c5c5e smbd: Use NT_STATUS_IS_OK() in reply_unlock() via 041608cb899 smbd: Avoid casts in reply_unlock() via 7fe67a47826 lib: Fix a typo via a371d22feb2 smbd: Fix a typo via 7fa0be8f63c tevent: Fix a typo via c00c7bfb7e2 smbd: Only remove locks by mid if necessary from 7f70e216fcd docs: fix typo in "ntlm auth" doc in smb.conf man page
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 4bbe291efcb389715651b2eb94330b6c36f83030 Author: Volker Lendecke <v...@samba.org> Date: Thu Jun 20 13:42:12 2019 +0200 vfs: Remove SMB_VFS_BRL_CANCEL_WINDOWS This is not called anymore, bump the VFS version number in a separate commit Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Thu Jun 20 18:34:20 UTC 2019 on sn-devel-184 commit 871bb7562cad1d4a9dccab602880d2ef3fffd75c Author: Volker Lendecke <v...@samba.org> Date: Thu Jun 20 11:07:17 2019 +0200 smbd: Remove unused brlock code No PENDING locks in brlock.tdb anymore. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit b3284bef3536328ff4ae965b5f34cec8ee9b8a3a Author: Volker Lendecke <v...@samba.org> Date: Wed Jun 19 22:00:25 2019 +0200 smbd: Cancel smbd_smb1_do_locks requests in reply_ntcancel Last link to the specialized brlock queue Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit f37c14dd63285e108a9fc1050de9b14a288097cb Author: Volker Lendecke <v...@samba.org> Date: Wed Jun 19 16:08:49 2019 +0200 smbd: Add a clarifying comment on triggering waiters Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit d60a35bd75a0c427a593defe8fd3a7850f45ee5f Author: Volker Lendecke <v...@samba.org> Date: Wed Jun 19 15:49:46 2019 +0200 smbd: Don't call cancel_pending_lock_requests_by_fid on close We don't use that queue anymore Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit b091c19cb2045e72b3a9a0b364f110ad88debe53 Author: Volker Lendecke <v...@samba.org> Date: Sat Jun 15 15:23:50 2019 -0700 smbd: Base smb2_lock.c on tevent_req smb2 locking is a lot more regular than reply_lockingX. So this is a much smaller change. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 6f204de778490c7bffdc367de21d80fb410b227f Author: Volker Lendecke <v...@samba.org> Date: Fri Jun 14 15:17:12 2019 -0700 smbd: Use smbd_smb1_do_locks_send() in smb_set_posix_lock() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 4c1d574ebea5138eda1cfbdcab90d25618e0a4f3 Author: Volker Lendecke <v...@samba.org> Date: Thu Jun 13 03:59:54 2019 -0700 smbd: Use smbd_smb1_do_locks_send() in reply_lockingX() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit c4649b3ad6e6c41731b21da0c75632c38209d69c Author: Volker Lendecke <v...@samba.org> Date: Thu Jun 13 03:56:13 2019 -0700 smbd: Use smbd_smb1_do_locks_send() in reply_lock() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 1967bb8538fdf36ea646b6036b1c539bde1e48f1 Author: Volker Lendecke <v...@samba.org> Date: Thu Jun 13 03:48:31 2019 -0700 smbd: Use smbd_smb1_do_locks_send() in reply_lockread() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit ab149a611f23dc8f4b274bf1e8c73b3e5cd976c8 Author: Volker Lendecke <v...@samba.org> Date: Thu Jun 13 03:46:01 2019 -0700 smbd: Remove SMB1 special case handling from brlock.c This is now handled in smbd_smb1_do_locks_send/recv. From here on for a few commits we won't survive make test. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 2d746d1364e24ca2936601508d4f06af28e9de5a Author: Volker Lendecke <v...@samba.org> Date: Thu Jun 13 03:58:02 2019 -0700 smbd: Ping dbwrap_watch on locking.tdb for in smbd_do_unlocking() smbd_smb1_do_locks_send() watches the file's locking.tdb record for changes, like the oplock code does. Unlocking a byte range thus must trigger a retry. With the share mode cache get_existing_share_mode_lock() is pretty cheap. We have to write out the share mode record with the current code, but an obvious optimization will be a share_mode_do_locked doing all this without actually unmarshalling the locking.tdb entry. And -- there's precedence for this pattern in downgrade_lease()... Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit fbbf684338d7059e9dced229c3b0925fe154bd98 Author: Volker Lendecke <v...@samba.org> Date: Thu Jun 13 03:38:57 2019 -0700 smbd: Add smbd_smb1_do_locks_send/recv() This contains the SMB1-specific brlock logic. Right now our core brlock code has specialized code to deal with pending locks. For dealing with pending requests waiting for something nowadays we recommend to use tevent_req. This code also provides the basis to remove the SMB1 special case handling from the core logic, isolating protocol features specific to SMB1 and not exposed in SMB2 in SMB1-specific code. The core brlock code will not see blocking locks anymore. Instead, the code in this patch will always immediately fail and take care of the retries and timeouts. Retries are implemented by a dbwrap_watch_record_send on the corresponding locking.tdb entry. A later commit will make unlocks trigger wakeups there. I chose locking.tdb and not brlock itself to simplify the implementation. We already have oplock break watchers on locking.tdb, this will only add one more. This might lead to spurious wakeups, but they are taken care of by careful retries. An advantage of doing that is the implicit handling of a killed blocker PID through dbwrap_watch, obsoleting brl_revalidate. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit f0a9459e66b93ba7b231aa6c0edc5270e0c13f55 Author: Volker Lendecke <v...@samba.org> Date: Mon May 27 17:03:38 2019 +0200 smbd: Slightly simplify smbd_smb2_lock_send() For unlocking we don't need the error mapping, do an early return Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 67f89bb3300a4cedd2bb01f81a6ede21b05377e0 Author: Volker Lendecke <v...@samba.org> Date: Thu Jun 20 12:20:39 2019 +0200 smbd: Return "blocker_pid" from do_lock() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit ca73ba859ed91f272504c31d1f56f9315b7ef5c0 Author: Volker Lendecke <v...@samba.org> Date: Thu Jun 20 12:42:23 2019 +0200 smbd: Add some paranoia against NULL dereference Quite a few callers set "psmblctx" to NULL, and I could not really follow 100% that brl_lock only assigns that in the blocking lock case. Too many layers :-) Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 4adbeb9714beb9194a6f350fdf89dfcb7dd04226 Author: Volker Lendecke <v...@samba.org> Date: Thu Jun 20 12:05:30 2019 +0200 smbd: Add "blocker_pid" to brl_lock() Soon we will wait on a conflicting lock to become free via dbwrap_watched_watch_send. That routine can take a server_id that blocks us, watching it to go away. To use that, we need to know which PID it is that blocks us. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit b752e242a6a963253d54a16b2a071f2cfa9797ce Author: Volker Lendecke <v...@samba.org> Date: Thu Jun 20 10:46:21 2019 +0200 torture3: Test cancelling locking&x with ntcancel Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 56521c5fbf0bea3dcf0d58a686879485a939b7af Author: Volker Lendecke <v...@samba.org> Date: Wed Jun 19 20:47:24 2019 +0200 libsmb: Make cli_lockingx cancellable Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 3f6ed6e35239507ebe78091b9e1b4af7b644e3fd Author: Volker Lendecke <v...@samba.org> Date: Wed Jun 19 17:50:54 2019 +0200 torture3: Run a blocking lock&x call with a subsequent read Samba aborts the read&x after a blocked, but eventually successful locking&x call. Both Windows and source4/ntvfs do the read properly, source3/smbd does not. With later code, this will become possible much easier. Lets see if it's worth it given that we've got away with this forever. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit b20231a1abb6d790dcb667f7010ec3b0b1ecb00b Author: Volker Lendecke <v...@samba.org> Date: Fri Jun 14 21:55:09 2019 -0700 torture3: Test blocking posix locks Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 2f1a459b7425db316d6c066115889134e67fa2cd Author: Volker Lendecke <v...@samba.org> Date: Mon Jun 3 11:00:25 2019 +0200 torture3: Test LOCKINGX_CANCEL without locks Tested against W2012R2 Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 7dec53ed0c1c58b4ab7b7483b2da3e4cd58750fa Author: Volker Lendecke <v...@samba.org> Date: Thu May 30 10:38:41 2019 +0200 torture3: Add a test to block a locking&read Right now we fail this with smbd, we return LOCK_NOT_GRANTED instead of FILE_LOCK_CONFLICT. This will change with later commits. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit ff992d1c6c3c6327893f0505a5d03087777087ee Author: Volker Lendecke <v...@samba.org> Date: Fri Jun 14 05:34:08 2019 -0700 smbd: Use smbd_do_unlocking() in reply_unlock() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 00b11867253e837d1c369470c83224d130c73304 Author: Volker Lendecke <v...@samba.org> Date: Fri Jun 14 04:48:58 2019 -0700 smbd: Use smbd_do_unlocking() in reply_writeunlock() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 865c86bd327703be36db64a1b96e7ba96551928e Author: Volker Lendecke <v...@samba.org> Date: Fri Jun 14 04:45:05 2019 -0700 smbd: Use smbd_do_unlocking() in smb_set_posix_lock() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit b3d533aa585a6d69855f10fafbf6d68e98597996 Author: Volker Lendecke <v...@samba.org> Date: Fri Jun 14 04:39:04 2019 -0700 smbd: Add "lock_flav" to smbd_do_unlocking() The next commits will pass all direct "do_unlock" calls through smbd_do_unlocking(). Why? Unlocking will later on require that we take the share mode lock for the file in question while the unlock is happening, and this should be in one central place. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 4d6152b1bfa7b5c624a26bcf1e662d77faffb4f2 Author: Volker Lendecke <v...@samba.org> Date: Thu Jun 13 12:19:35 2019 -0700 smbd: Simplify smb_set_posix_lock() Instead of reading twice from pdata, use a switch statement Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 10ba4aa6d5cf68cad35e7fab92b2f494f1b2d85c Author: Volker Lendecke <v...@samba.org> Date: Thu Jun 13 12:12:59 2019 -0700 smbd: Avoid casts in smb_set_posix_lock() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 1736f7c5c5e27d8b50a969da0be74ecb3a17e47b Author: Volker Lendecke <v...@samba.org> Date: Fri Jun 14 05:33:03 2019 -0700 smbd: Use NT_STATUS_IS_OK() in reply_unlock() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 041608cb89958bb85e7c57040abdd0c6851651af Author: Volker Lendecke <v...@samba.org> Date: Fri Jun 14 05:00:35 2019 -0700 smbd: Avoid casts in reply_unlock() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 7fe67a47826f7e2609088f02716e91b91c33f7c4 Author: Volker Lendecke <v...@samba.org> Date: Wed Jun 19 11:45:30 2019 +0200 lib: Fix a typo Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit a371d22feb2ae4afbc19f306cf25f1d7ba1b131f Author: Volker Lendecke <v...@samba.org> Date: Fri Jun 14 10:08:57 2019 -0700 smbd: Fix a typo Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 7fa0be8f63c13d2f1957551e298a154332cf9d04 Author: Volker Lendecke <v...@samba.org> Date: Wed Jun 12 02:19:32 2019 -0700 tevent: Fix a typo Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit c00c7bfb7e275cce89ec95b7e282dda1dee97d48 Author: Volker Lendecke <v...@samba.org> Date: Wed Jun 19 21:15:38 2019 +0200 smbd: Only remove locks by mid if necessary Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: examples/VFS/skel_opaque.c | 9 - examples/VFS/skel_transparent.c | 8 - lib/tevent/tevent.h | 2 +- librpc/idl/messaging.idl | 4 +- selftest/knownfail | 3 + selftest/skip | 1 + source3/include/locking.h | 4 +- source3/include/proto.h | 3 - source3/include/vfs.h | 30 +- source3/include/vfs_macros.h | 5 - source3/lib/smbd_shim.c | 10 - source3/lib/smbd_shim.h | 3 - source3/libsmb/clifile.c | 16 + source3/libsmb/trusts_util.c | 2 +- source3/locking/brlock.c | 350 +--------- source3/locking/locking.c | 73 +- source3/locking/proto.h | 20 +- source3/modules/vfs_default.c | 11 - source3/modules/vfs_fruit.c | 60 +- source3/modules/vfs_full_audit.c | 20 - source3/modules/vfs_glusterfs.c | 1 - source3/modules/vfs_not_implemented.c | 9 - source3/modules/vfs_time_audit.c | 22 - source3/selftest/tests.py | 8 +- source3/smbd/blocking.c | 1224 +++++++++++---------------------- source3/smbd/close.c | 6 + source3/smbd/globals.h | 46 +- source3/smbd/notify.c | 5 +- source3/smbd/nttrans.c | 7 +- source3/smbd/open.c | 2 +- source3/smbd/proto.h | 67 +- source3/smbd/reply.c | 614 +++++++++-------- source3/smbd/server.c | 82 --- source3/smbd/smb2_close.c | 12 + source3/smbd/smb2_lock.c | 650 ++++------------- source3/smbd/smbd_cleanupd.c | 21 - source3/smbd/trans2.c | 147 ++-- source3/torture/torture.c | 1102 +++++++++++++++++++++++++++++ source3/utils/smbcontrol.c | 40 -- source3/utils/status.c | 2 - 40 files changed, 2212 insertions(+), 2489 deletions(-) Changeset truncated at 500 lines: diff --git a/examples/VFS/skel_opaque.c b/examples/VFS/skel_opaque.c index 6510ef30d6f..6628bffe3eb 100644 --- a/examples/VFS/skel_opaque.c +++ b/examples/VFS/skel_opaque.c @@ -655,14 +655,6 @@ static bool skel_brl_unlock_windows(struct vfs_handle_struct *handle, return false; } -static bool skel_brl_cancel_windows(struct vfs_handle_struct *handle, - struct byte_range_lock *br_lck, - struct lock_struct *plock) -{ - errno = ENOSYS; - return false; -} - static bool skel_strict_lock_check(struct vfs_handle_struct *handle, struct files_struct *fsp, struct lock_struct *plock) @@ -1104,7 +1096,6 @@ static struct vfs_fn_pointers skel_opaque_fns = { .connectpath_fn = skel_connectpath, .brl_lock_windows_fn = skel_brl_lock_windows, .brl_unlock_windows_fn = skel_brl_unlock_windows, - .brl_cancel_windows_fn = skel_brl_cancel_windows, .strict_lock_check_fn = skel_strict_lock_check, .translate_name_fn = skel_translate_name, .fsctl_fn = skel_fsctl, diff --git a/examples/VFS/skel_transparent.c b/examples/VFS/skel_transparent.c index fc892a23208..9b5f336042e 100644 --- a/examples/VFS/skel_transparent.c +++ b/examples/VFS/skel_transparent.c @@ -827,13 +827,6 @@ static bool skel_brl_unlock_windows(struct vfs_handle_struct *handle, return SMB_VFS_NEXT_BRL_UNLOCK_WINDOWS(handle, msg_ctx, br_lck, plock); } -static bool skel_brl_cancel_windows(struct vfs_handle_struct *handle, - struct byte_range_lock *br_lck, - struct lock_struct *plock) -{ - return SMB_VFS_NEXT_BRL_CANCEL_WINDOWS(handle, br_lck, plock); -} - static bool skel_strict_lock_check(struct vfs_handle_struct *handle, struct files_struct *fsp, struct lock_struct *plock) @@ -1367,7 +1360,6 @@ static struct vfs_fn_pointers skel_transparent_fns = { .connectpath_fn = skel_connectpath, .brl_lock_windows_fn = skel_brl_lock_windows, .brl_unlock_windows_fn = skel_brl_unlock_windows, - .brl_cancel_windows_fn = skel_brl_cancel_windows, .strict_lock_check_fn = skel_strict_lock_check, .translate_name_fn = skel_translate_name, .fsctl_fn = skel_fsctl, diff --git a/lib/tevent/tevent.h b/lib/tevent/tevent.h index 2ec7330e249..3c3e3cc2cef 100644 --- a/lib/tevent/tevent.h +++ b/lib/tevent/tevent.h @@ -1685,7 +1685,7 @@ struct timeval tevent_timeval_add(const struct timeval *tv, uint32_t secs, * * @param[in] usecs The microseconds of the offset from now. * - * @return A timval with the given offset in the future. + * @return A timeval with the given offset in the future. */ struct timeval tevent_timeval_current_ofs(uint32_t secs, uint32_t usecs); diff --git a/librpc/idl/messaging.idl b/librpc/idl/messaging.idl index c2f62f673b2..f355c7503d9 100644 --- a/librpc/idl/messaging.idl +++ b/librpc/idl/messaging.idl @@ -67,7 +67,7 @@ interface messaging MSG_SMB_FORCE_TDIS = 0x0302, /* MSG_SMB_SAM_SYNC = 0x0303, Obsoleted */ /* MSG_SMB_SAM_REPL = 0x0304, Obsoleted */ - MSG_SMB_UNLOCK = 0x0305, + /* MSG_SMB_UNLOCK = 0x0305, Obsoleted */ MSG_SMB_BREAK_REQUEST = 0x0306, /* MSG_SMB_BREAK_RESPONSE = 0x0307, Obsoleted */ /* MSG_SMB_ASYNC_LEVEL2_BREAK = 0x0308, Obsoleted */ @@ -83,7 +83,7 @@ interface messaging MSG_PVFS_NOTIFY = 0x0310, /* cluster reconfigure events */ - MSG_SMB_BRL_VALIDATE = 0x0311, + /* MSG_SMB_BRL_VALIDATE = 0x0311, Oboleted */ /*Close a specific file given a share entry. */ MSG_SMB_CLOSE_FILE = 0x0313, diff --git a/selftest/knownfail b/selftest/knownfail index 2c31bf91619..ded80b12259 100644 --- a/selftest/knownfail +++ b/selftest/knownfail @@ -9,9 +9,12 @@ ^samba3.smbtorture_s3.crypt_server\(nt4_dc\).SMB2-SESSION-REAUTH # expected to give ACCESS_DENIED SMB2.1 doesn't have encryption ^samba3.smbtorture_s3.crypt_server\(nt4_dc\).SMB2-SESSION-RECONNECT # expected to give CONNECTION_DISCONNECTED, we need to fix the test ^samba3.smbtorture_s3.plain.*SMB2-DIR-FSYNC.*\(ad_dc_ntvfs\) +^samba3.smbtorture_s3.plain.LOCK11.*\(ad_dc_ntvfs\) ^samba3.smb2.session enc.reconnect # expected to give CONNECTION_DISCONNECTED, we need to fix the test ^samba3.raw.session enc # expected to give ACCESS_DENIED as SMB1 encryption isn't used ^samba3.smbtorture_s3.crypt_server # expected to give ACCESS_DENIED as SMB1 encryption isn't used +^samba3.smbtorture_s3.*.LOCK12.*\(fileserver\) +^samba3.smbtorture_s3.*.LOCK12.*\(nt4_dc\) ^samba3.nbt.dgram.*netlogon2\(nt4_dc\) ^samba3.*rap.sam.*.useradd # Not provided by Samba 3 ^samba3.*rap.sam.*.userdelete # Not provided by Samba 3 diff --git a/selftest/skip b/selftest/skip index e628d7ccc85..bdf3c71893d 100644 --- a/selftest/skip +++ b/selftest/skip @@ -49,6 +49,7 @@ ^samba3.smbtorture_s3.plain.POSIX-OFD-LOCK\(ad_dc_ntvfs\) # Fails against the s4 ntvfs server ^samba3.smbtorture_s3.plain.POSIX-STREAM-DELETE\(ad_dc_ntvfs\) # Fails against the s4 ntvfs server ^samba3.smbtorture_s3.plain.POSIX-MKDIR\(ad_dc_ntvfs\) # Fails against the s4 ntvfs server +^samba3.smbtorture_s3.plain.POSIX-BLOCKING-LOCK\(ad_dc_ntvfs\) # Fails against the s4 ntvfs server ^samba3.smbtorture_s3.plain.WINDOWS-BAD-SYMLINK\(ad_dc_ntvfs\) # Fails against the s4 ntvfs server ^samba3.smbtorture_s3.plain.RENAME-ACCESS\(ad_dc_ntvfs\) # Fails against the s4 ntvfs server ^samba3.smbtorture_s3.plain.OWNER-RIGHTS\(ad_dc_ntvfs\) # Don't test against the s4 ntvfs server anymore diff --git a/source3/include/locking.h b/source3/include/locking.h index 97c138aead9..4cb75202d1a 100644 --- a/source3/include/locking.h +++ b/source3/include/locking.h @@ -26,11 +26,9 @@ PENDING read and write locks to allow posix lock downgrades to trigger a lock re-evaluation. */ -enum brl_type {READ_LOCK, WRITE_LOCK, PENDING_READ_LOCK, PENDING_WRITE_LOCK, UNLOCK_LOCK}; +enum brl_type {READ_LOCK, WRITE_LOCK, UNLOCK_LOCK}; enum brl_flavour {WINDOWS_LOCK = 0, POSIX_LOCK = 1}; -#define IS_PENDING_LOCK(type) ((type) == PENDING_READ_LOCK || (type) == PENDING_WRITE_LOCK) - #include "librpc/gen_ndr/server_id.h" /* This contains elements that differentiate locks. The smbpid is a diff --git a/source3/include/proto.h b/source3/include/proto.h index 93d01a06be0..484afc959b9 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -996,9 +996,6 @@ void unbecome_root(void); /* The following definitions come from lib/smbd_shim.c */ int find_service(TALLOC_CTX *ctx, const char *service_in, char **p_service_out); -void cancel_pending_lock_requests_by_fid(files_struct *fsp, - struct byte_range_lock *br_lck, - enum file_close_type close_type); void send_stat_cache_delete_message(struct messaging_context *msg_ctx, const char *name); NTSTATUS can_delete_directory_fsp(files_struct *fsp); diff --git a/source3/include/vfs.h b/source3/include/vfs.h index 10d7fb0621a..4727fc029da 100644 --- a/source3/include/vfs.h +++ b/source3/include/vfs.h @@ -259,8 +259,10 @@ /* Bump to version 40, Samba 4.10 will ship with that */ /* Version 40 - Add SMB_VFS_GETXATTRAT_SEND/RECV */ /* Version 40 - Add SMB_VFS_GET_DOS_ATTRIBUTES_SEND/RECV */ +/* Bump to version 41, Samba 4.11 will ship with that */ +/* Version 41 - Remove SMB_VFS_BRL_CANCEL_WINDOWS */ -#define SMB_VFS_INTERFACE_VERSION 40 +#define SMB_VFS_INTERFACE_VERSION 41 /* All intercepted VFS operations must be declared as static functions inside module source @@ -384,6 +386,22 @@ typedef struct files_struct { */ unsigned num_aio_requests; struct tevent_req **aio_requests; + bool closing; + + /* + * Requests waiting for smb1 byte range locks. They are + * generated by smbd_smb1_do_locks_send and are required here, + * because lock cancel operations index through reply_lockingX + * not based on mid but on the lock type and range. + */ + struct tevent_req **blocked_smb1_lock_reqs; + + /* + * SMB1 remembers lock failures and delays repeated blocking + * lock attempts on the same offset. + */ + bool lock_failure_seen; + uint64_t lock_failure_offset; /* * If a close request comes in while we still have aio_requests @@ -854,10 +872,6 @@ struct vfs_fn_pointers { struct byte_range_lock *br_lck, const struct lock_struct *plock); - bool (*brl_cancel_windows_fn)(struct vfs_handle_struct *handle, - struct byte_range_lock *br_lck, - struct lock_struct *plock); - bool (*strict_lock_check_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, struct lock_struct *plock); @@ -1329,9 +1343,6 @@ bool smb_vfs_call_brl_unlock_windows(struct vfs_handle_struct *handle, struct messaging_context *msg_ctx, struct byte_range_lock *br_lck, const struct lock_struct *plock); -bool smb_vfs_call_brl_cancel_windows(struct vfs_handle_struct *handle, - struct byte_range_lock *br_lck, - struct lock_struct *plock); bool smb_vfs_call_strict_lock_check(struct vfs_handle_struct *handle, struct files_struct *fsp, struct lock_struct *plock); @@ -1793,9 +1804,6 @@ bool vfs_not_implemented_brl_unlock_windows(struct vfs_handle_struct *handle, struct messaging_context *msg_ctx, struct byte_range_lock *br_lck, const struct lock_struct *plock); -bool vfs_not_implemented_brl_cancel_windows(struct vfs_handle_struct *handle, - struct byte_range_lock *br_lck, - struct lock_struct *plock); bool vfs_not_implemented_strict_lock_check(struct vfs_handle_struct *handle, struct files_struct *fsp, struct lock_struct *plock); diff --git a/source3/include/vfs_macros.h b/source3/include/vfs_macros.h index 7a0f14ef08d..e867810f30f 100644 --- a/source3/include/vfs_macros.h +++ b/source3/include/vfs_macros.h @@ -356,11 +356,6 @@ #define SMB_VFS_NEXT_BRL_UNLOCK_WINDOWS(handle, msg_ctx, br_lck, plock) \ smb_vfs_call_brl_unlock_windows((handle)->next, (msg_ctx), (br_lck), (plock)) -#define SMB_VFS_BRL_CANCEL_WINDOWS(conn, br_lck, plock) \ - smb_vfs_call_brl_cancel_windows((conn)->vfs_handles, (br_lck), (plock)) -#define SMB_VFS_NEXT_BRL_CANCEL_WINDOWS(handle, br_lck, plock) \ - smb_vfs_call_brl_cancel_windows((handle)->next, (br_lck), (plock)) - #define SMB_VFS_STRICT_LOCK_CHECK(conn, fsp, plock) \ smb_vfs_call_strict_lock_check((conn)->vfs_handles, (fsp), (plock)) #define SMB_VFS_NEXT_STRICT_LOCK_CHECK(handle, fsp, plock) \ diff --git a/source3/lib/smbd_shim.c b/source3/lib/smbd_shim.c index 1b5b4e6ca52..a6e3695096d 100644 --- a/source3/lib/smbd_shim.c +++ b/source3/lib/smbd_shim.c @@ -32,16 +32,6 @@ void set_smbd_shim(const struct smbd_shim *shim_functions) shim = *shim_functions; } -void cancel_pending_lock_requests_by_fid(files_struct *fsp, - struct byte_range_lock *br_lck, - enum file_close_type close_type) -{ - if (shim.cancel_pending_lock_requests_by_fid) { - - shim.cancel_pending_lock_requests_by_fid(fsp, br_lck, close_type); - } -} - void send_stat_cache_delete_message(struct messaging_context *msg_ctx, const char *name) { diff --git a/source3/lib/smbd_shim.h b/source3/lib/smbd_shim.h index f3da5859027..19ce7acd50e 100644 --- a/source3/lib/smbd_shim.h +++ b/source3/lib/smbd_shim.h @@ -29,9 +29,6 @@ struct smbd_shim { - void (*cancel_pending_lock_requests_by_fid)(files_struct *fsp, - struct byte_range_lock *br_lck, - enum file_close_type close_type); void (*send_stat_cache_delete_message)(struct messaging_context *msg_ctx, const char *name); diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c index 3738904f894..e696b536093 100644 --- a/source3/libsmb/clifile.c +++ b/source3/libsmb/clifile.c @@ -3434,9 +3434,11 @@ static uint8_t *cli_lockingx_put_locks( struct cli_lockingx_state { uint16_t vwv[8]; struct iovec bytes; + struct tevent_req *subreq; }; static void cli_lockingx_done(struct tevent_req *subreq); +static bool cli_lockingx_cancel(struct tevent_req *req); struct tevent_req *cli_lockingx_create( TALLOC_CTX *mem_ctx, @@ -3515,6 +3517,7 @@ struct tevent_req *cli_lockingx_send( const struct smb1_lock_element *locks) { struct tevent_req *req = NULL, *subreq = NULL; + struct cli_lockingx_state *state = NULL; NTSTATUS status; req = cli_lockingx_create( @@ -3533,11 +3536,14 @@ struct tevent_req *cli_lockingx_send( if (req == NULL) { return NULL; } + state = tevent_req_data(req, struct cli_lockingx_state); + state->subreq = subreq; status = smb1cli_req_chain_submit(&subreq, 1); if (tevent_req_nterror(req, status)) { return tevent_req_post(req, ev); } + tevent_req_set_cancel_fn(req, cli_lockingx_cancel); return req; } @@ -3548,6 +3554,16 @@ static void cli_lockingx_done(struct tevent_req *subreq) tevent_req_simple_finish_ntstatus(subreq, status); } +static bool cli_lockingx_cancel(struct tevent_req *req) +{ + struct cli_lockingx_state *state = tevent_req_data( + req, struct cli_lockingx_state); + if (state->subreq == NULL) { + return false; + } + return tevent_req_cancel(state->subreq); +} + NTSTATUS cli_lockingx_recv(struct tevent_req *req) { return tevent_req_simple_recv_ntstatus(req); diff --git a/source3/libsmb/trusts_util.c b/source3/libsmb/trusts_util.c index 3ebf67f231e..0f0541a26b9 100644 --- a/source3/libsmb/trusts_util.c +++ b/source3/libsmb/trusts_util.c @@ -354,7 +354,7 @@ NTSTATUS trust_pw_change(struct netlogon_creds_cli_context *context, } /* - * We use the password that's already persitent in + * We use the password that's already persistent in * our database in order to handle failures. */ data_blob_clear_free(&new_trust_pw_blob); diff --git a/source3/locking/brlock.c b/source3/locking/brlock.c index 5a4bd0d5c06..00462a31c78 100644 --- a/source3/locking/brlock.c +++ b/source3/locking/brlock.c @@ -142,10 +142,6 @@ static bool brl_overlap(const struct lock_struct *lck1, static bool brl_conflict(const struct lock_struct *lck1, const struct lock_struct *lck2) { - /* Ignore PENDING locks. */ - if (IS_PENDING_LOCK(lck1->lock_type) || IS_PENDING_LOCK(lck2->lock_type)) - return False; - /* Read locks never conflict. */ if (lck1->lock_type == READ_LOCK && lck2->lock_type == READ_LOCK) { return False; @@ -176,10 +172,6 @@ static bool brl_conflict_posix(const struct lock_struct *lck1, SMB_ASSERT(lck2->lock_flav == POSIX_LOCK); #endif - /* Ignore PENDING locks. */ - if (IS_PENDING_LOCK(lck1->lock_type) || IS_PENDING_LOCK(lck2->lock_type)) - return False; - /* Read locks never conflict. */ if (lck1->lock_type == READ_LOCK && lck2->lock_type == READ_LOCK) { return False; @@ -199,9 +191,6 @@ static bool brl_conflict_posix(const struct lock_struct *lck1, static bool brl_conflict1(const struct lock_struct *lck1, const struct lock_struct *lck2) { - if (IS_PENDING_LOCK(lck1->lock_type) || IS_PENDING_LOCK(lck2->lock_type)) - return False; - if (lck1->lock_type == READ_LOCK && lck2->lock_type == READ_LOCK) { return False; } @@ -233,11 +222,6 @@ static bool brl_conflict1(const struct lock_struct *lck1, static bool brl_conflict_other(const struct lock_struct *lock, const struct lock_struct *rw_probe) { - if (IS_PENDING_LOCK(lock->lock_type) || - IS_PENDING_LOCK(rw_probe->lock_type)) { - return False; - } - if (lock->lock_type == READ_LOCK && rw_probe->lock_type == READ_LOCK) { return False; } @@ -291,58 +275,6 @@ static bool brl_conflict_other(const struct lock_struct *lock, return false; } -/**************************************************************************** - Check if an unlock overlaps a pending lock. -****************************************************************************/ - -static bool brl_pending_overlap(const struct lock_struct *lock, - const struct lock_struct *pend_lock) -{ - if ((lock->start <= pend_lock->start) && - (lock->start + lock->size > pend_lock->start)) { - return true; - } - if ((lock->start >= pend_lock->start) && - (lock->start < pend_lock->start + pend_lock->size)) { - return true; - } - return false; -} - -/**************************************************************************** - Amazingly enough, w2k3 "remembers" whether the last lock failure on a fnum - is the same as this one and changes its error code. I wonder if any - app depends on this ? -****************************************************************************/ - -static NTSTATUS brl_lock_failed(files_struct *fsp, - const struct lock_struct *lock, - bool blocking_lock) -{ - if (lock->start >= 0xEF000000 && (lock->start >> 63) == 0) { - /* amazing the little things you learn with a test - suite. Locks beyond this offset (as a 64 bit - number!) always generate the conflict error code, - unless the top bit is set */ - if (!blocking_lock) { - fsp->last_lock_failure = *lock; - } - return NT_STATUS_FILE_LOCK_CONFLICT; - } - - if (serverid_equal(&lock->context.pid, &fsp->last_lock_failure.context.pid) && - lock->context.tid == fsp->last_lock_failure.context.tid && - lock->fnum == fsp->last_lock_failure.fnum && - lock->start == fsp->last_lock_failure.start) { - return NT_STATUS_FILE_LOCK_CONFLICT; - } - - if (!blocking_lock) { - fsp->last_lock_failure = *lock; - } - return NT_STATUS_LOCK_NOT_GRANTED; -} - /**************************************************************************** Open up the brlock.tdb database. ****************************************************************************/ @@ -442,7 +374,7 @@ NTSTATUS brl_lock_windows_default(struct byte_range_lock *br_lck, } /* Remember who blocked us. */ plock->context.smblctx = locks[i].context.smblctx; - return brl_lock_failed(fsp,plock,blocking_lock); + return NT_STATUS_LOCK_NOT_GRANTED; } #if ZERO_ZERO if (plock->start == 0 && plock->size == 0 && @@ -452,15 +384,13 @@ NTSTATUS brl_lock_windows_default(struct byte_range_lock *br_lck, #endif } - if (!IS_PENDING_LOCK(plock->lock_type)) { - contend_level2_oplocks_begin(fsp, LEVEL2_CONTEND_WINDOWS_BRL); - } + contend_level2_oplocks_begin(fsp, LEVEL2_CONTEND_WINDOWS_BRL); /* We can get the Windows lock, now see if it needs to be mapped into a lower level POSIX one, and if so can we get it ? */ - if (!IS_PENDING_LOCK(plock->lock_type) && lp_posix_locking(fsp->conn->params)) { + if (lp_posix_locking(fsp->conn->params)) { int errno_ret; if (!set_posix_lock_windows_flavour(fsp, plock->start, @@ -499,9 +429,7 @@ NTSTATUS brl_lock_windows_default(struct byte_range_lock *br_lck, return NT_STATUS_OK; fail: - if (!IS_PENDING_LOCK(plock->lock_type)) { - contend_level2_oplocks_end(fsp, LEVEL2_CONTEND_WINDOWS_BRL); - } + contend_level2_oplocks_end(fsp, LEVEL2_CONTEND_WINDOWS_BRL); return status; } @@ -806,7 +734,6 @@ static NTSTATUS brl_lock_posix(struct messaging_context *msg_ctx, unsigned int i, count, posix_count; struct lock_struct *locks = br_lck->lock_data; struct lock_struct *tp; - bool signal_pending_read = False; bool break_oplocks = false; NTSTATUS status; @@ -834,13 +761,6 @@ static NTSTATUS brl_lock_posix(struct messaging_context *msg_ctx, for (i=0; i < br_lck->num_locks; i++) { struct lock_struct *curr_lock = &locks[i]; - /* If we have a pending read lock, a lock downgrade should - trigger a lock re-evaluation. */ - if (curr_lock->lock_type == PENDING_READ_LOCK && - brl_pending_overlap(plock, curr_lock)) { - signal_pending_read = True; -- Samba Shared Repository