]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:locking: let set_delete_on_close() use share_mode_do_locked_vfs_denied()
authorStefan Metzmacher <metze@samba.org>
Wed, 31 Aug 2022 14:34:40 +0000 (16:34 +0200)
committerJeremy Allison <jra@samba.org>
Tue, 20 Sep 2022 00:34:35 +0000 (00:34 +0000)
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/locking.c

index 6a2dcbd1f98afff48dc3067c3bb878c75ab00dfd..46779776fc37c04faa29dc98744c43b182415daa 100644 (file)
@@ -943,37 +943,63 @@ void set_delete_on_close_lck(files_struct *fsp,
        TALLOC_FREE(state.blob.data);
 }
 
+struct set_delete_on_close_locked_state {
+       struct files_struct *fsp;
+       bool delete_on_close;
+       const struct security_token *nt_tok;
+       const struct security_unix_token *tok;
+};
+
+static void set_delete_on_close_locked(struct share_mode_lock *lck,
+                                      void *private_data)
+{
+       struct set_delete_on_close_locked_state *state =
+               (struct set_delete_on_close_locked_state *)private_data;
+
+       if (state->delete_on_close) {
+               set_delete_on_close_lck(state->fsp,
+                                       lck,
+                                       state->nt_tok,
+                                       state->tok);
+       } else {
+               reset_delete_on_close_lck(state->fsp, lck);
+       }
+
+       if (state->fsp->fsp_flags.is_directory) {
+               send_stat_cache_delete_message(state->fsp->conn->sconn->msg_ctx,
+                                              state->fsp->fsp_name->base_name);
+       }
+
+       state->fsp->fsp_flags.delete_on_close = state->delete_on_close;
+}
+
 bool set_delete_on_close(files_struct *fsp, bool delete_on_close,
                        const struct security_token *nt_tok,
                        const struct security_unix_token *tok)
 {
-       struct share_mode_lock *lck;
+       struct set_delete_on_close_locked_state state = {
+               .fsp = fsp,
+               .delete_on_close = delete_on_close,
+               .nt_tok = nt_tok,
+               .tok = tok,
+       };
+       NTSTATUS status;
 
        DEBUG(10,("set_delete_on_close: %s delete on close flag for "
                  "%s, file %s\n",
                  delete_on_close ? "Adding" : "Removing", fsp_fnum_dbg(fsp),
                  fsp_str_dbg(fsp)));
 
-       lck = get_existing_share_mode_lock(talloc_tos(), fsp->file_id);
-       if (lck == NULL) {
-               return False;
-       }
-
-       if (delete_on_close) {
-               set_delete_on_close_lck(fsp, lck, nt_tok, tok);
-       } else {
-               reset_delete_on_close_lck(fsp, lck);
-       }
-
        if (fsp->fsp_flags.is_directory) {
                SMB_ASSERT(!is_ntfs_stream_smb_fname(fsp->fsp_name));
-               send_stat_cache_delete_message(fsp->conn->sconn->msg_ctx,
-                                              fsp->fsp_name->base_name);
        }
 
-       TALLOC_FREE(lck);
-
-       fsp->fsp_flags.delete_on_close = delete_on_close;
+       status = share_mode_do_locked_vfs_denied(fsp->file_id,
+                                                set_delete_on_close_locked,
+                                                &state);
+       if (!NT_STATUS_IS_OK(status)) {
+               return false;
+       }
 
        return True;
 }