s3:locking: pass lease_key explicitly to set_share_mode()
authorStefan Metzmacher <metze@samba.org>
Wed, 10 Aug 2022 08:27:15 +0000 (08:27 +0000)
committerJeremy Allison <jra@samba.org>
Fri, 19 Aug 2022 18:41:34 +0000 (18:41 +0000)
We should avoid accessing fsp->lease if possible.

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

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/locking/share_mode_lock.c
source3/locking/share_mode_lock.h
source3/smbd/open.c

index cf1447d889efca5f09ff0bf0a2f4a709f20eabf1..b3f30c0f5128977fbbec75761a62dbe3d620f4ae 100644 (file)
@@ -1782,6 +1782,7 @@ bool set_share_mode(struct share_mode_lock *lck,
                    uid_t uid,
                    uint64_t mid,
                    uint16_t op_type,
+                   const struct smb2_lease_key *lease_key,
                    uint32_t share_access,
                    uint32_t access_mask)
 {
@@ -1839,7 +1840,7 @@ bool set_share_mode(struct share_mode_lock *lck,
        if (op_type == LEASE_OPLOCK) {
                const struct GUID *client_guid = fsp_client_guid(fsp);
                e.client_guid = *client_guid;
-               e.lease_key = fsp->lease->lease.lease_key;
+               e.lease_key = *lease_key;
        }
 
        ok = share_mode_entry_put(&e, &e_buf);
index bd4e98ccecde77f23709517f6931a8d8e606cd25..f8693b14b547d89722b8291ce6be28e319965689 100644 (file)
@@ -26,6 +26,7 @@ struct share_mode_lock;
 struct share_mode_entry;
 struct smb_filename;
 struct files_struct;
+struct smb2_lease_key;
 
 bool locking_init(void);
 bool locking_init_readonly(void);
@@ -52,6 +53,7 @@ bool set_share_mode(
        uid_t uid,
        uint64_t mid,
        uint16_t op_type,
+       const struct smb2_lease_key *lease_key,
        uint32_t share_access,
        uint32_t access_mask);
 bool reset_share_mode_entry(
index e189d418262e3e49eaa476ababbb9dd7deae18be..5eea89d69c8dfbd4ecbe406ac9fbd86c070fea83 100644 (file)
@@ -3548,6 +3548,7 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
        uint32_t existing_dos_attributes = 0;
        struct share_mode_lock *lck = NULL;
        uint32_t open_access_mask = access_mask;
+       const struct smb2_lease_key *lease_key = NULL;
        NTSTATUS status;
        SMB_STRUCT_STAT saved_stat = smb_fname->st;
        struct timespec old_write_time;
@@ -4064,6 +4065,10 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
                return status;
        }
 
+       if (fsp->oplock_type == LEASE_OPLOCK) {
+               lease_key = &lease->lease_key;
+       }
+
        share_mode_flags_restrict(lck, access_mask, share_access, 0);
 
        ok = set_share_mode(
@@ -4072,6 +4077,7 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
                get_current_uid(fsp->conn),
                req ? req->mid : 0,
                fsp->oplock_type,
+               lease_key,
                share_access,
                access_mask);
        if (!ok) {
@@ -4752,6 +4758,7 @@ static NTSTATUS open_directory(connection_struct *conn,
                get_current_uid(conn),
                req ? req->mid : 0,
                NO_OPLOCK,
+               NULL,
                share_access,
                fsp->access_mask);
        if (!ok) {