From: Stefan Metzmacher Date: Wed, 31 Aug 2022 14:34:40 +0000 (+0200) Subject: s3:locking: let set_delete_on_close() use share_mode_do_locked_vfs_denied() X-Git-Tag: talloc-2.4.0~872 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c8458f237cd415f35dd5582876c80a9b44d0a053;p=thirdparty%2Fsamba.git s3:locking: let set_delete_on_close() use share_mode_do_locked_vfs_denied() BUG: https://bugzilla.samba.org/show_bug.cgi?id=15125 Signed-off-by: Stefan Metzmacher Reviewed-by: Jeremy Allison --- diff --git a/source3/locking/locking.c b/source3/locking/locking.c index 6a2dcbd1f98..46779776fc3 100644 --- a/source3/locking/locking.c +++ b/source3/locking/locking.c @@ -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; }