]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3: oplock: Fix race condition when closing an oplocked file.
authorJeremy Allison <jra@samba.org>
Wed, 10 Aug 2016 21:42:07 +0000 (14:42 -0700)
committerKarolin Seeger <kseeger@samba.org>
Fri, 16 Sep 2016 10:05:33 +0000 (12:05 +0200)
We must send the 'oplock released' message whilst the lock
is held in the close path. Otherwise the messaged smbd can
race with the share mode delete.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=12139

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
(cherry picked from commit df83b17c60a08a27a7ddd1d88dc125e15b3ee06d)

source3/smbd/close.c

index 66840aed5f31129f9e4619551a39ff8b1febfcb1..6a87ccc8484adbe4b415a08edbf660825c255903 100644 (file)
@@ -279,6 +279,11 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
                return NT_STATUS_INVALID_PARAMETER;
        }
 
+       /* Remove the oplock before potentially deleting the file. */
+       if(fsp->oplock_type) {
+               remove_oplock_under_lock(fsp, lck);
+       }
+
        if (fsp->write_time_forced) {
                DEBUG(10,("close_remove_share_mode: write time forced "
                        "for file %s\n",
@@ -743,11 +748,6 @@ static NTSTATUS close_normal_file(struct smb_request *req, files_struct *fsp,
                return NT_STATUS_OK;
        }
 
-       /* Remove the oplock before potentially deleting the file. */
-       if(fsp->oplock_type) {
-               remove_oplock(fsp);
-       }
-
        /* If this is an old DOS or FCB open and we have multiple opens on
           the same handle we only have one share mode. Ensure we only remove
           the share mode on the last close. */