From: Ralph Boehme Date: Thu, 7 Aug 2025 16:44:27 +0000 (+0200) Subject: s3/locking: fix checking for byterange locks when granting RH lease X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=debcd77ae7818ec953058e7524642ef76e0e6c7b;p=thirdparty%2Fsamba.git s3/locking: fix checking for byterange locks when granting RH lease From MS-FSA 2.1.5.18 "Server Requests an Oplock": ... * Else If Type is LEVEL_GRANULAR: * If RequestedOplockLevel is READ_CACHING or (READ_CACHING|HANDLE_CACHING): * The operation MUST be failed with STATUS_OPLOCK_NOT_GRANTED under either of the following conditions: * Open.Stream.ByteRangeLockList is not empty and Open.Stream.AllocationSize is greater than any ByteRangeLock.LockOffset in Open.Stream.ByteRangeLockList. ... BUG: https://bugzilla.samba.org/show_bug.cgi?id=15894 Signed-off-by: Ralph Boehme Reviewed-by: Volker Lendecke --- diff --git a/selftest/knownfail.d/samba3.smb2.lease b/selftest/knownfail.d/samba3.smb2.lease deleted file mode 100644 index ea03e666e61..00000000000 --- a/selftest/knownfail.d/samba3.smb2.lease +++ /dev/null @@ -1 +0,0 @@ -^samba3.smb2.lease.lock2\(fileserver\) diff --git a/source3/locking/brlock.c b/source3/locking/brlock.c index 2560df1fb0e..e0f5c14c302 100644 --- a/source3/locking/brlock.c +++ b/source3/locking/brlock.c @@ -2002,11 +2002,24 @@ void brl_set_modified(struct byte_range_lock *br_lck, bool modified) bool file_has_brlocks(files_struct *fsp) { struct byte_range_lock *br_lck = NULL; + uint i, num_locks; br_lck = brl_get_locks_readonly(fsp); if (br_lck == NULL) { return false; } - return (brl_num_locks(br_lck) > 0); + num_locks = brl_num_locks(br_lck); + if (num_locks == 0) { + return false; + } + + for (i = 0; i < num_locks; i++) { + struct lock_struct *l = &br_lck->lock_data[i]; + + if (l->start < fsp->fsp_name->st.st_ex_size) { + return true; + } + } + return false; }