The branch, master has been updated via 2b495c44a2a smbd: Fix a typo in a few places via a99f2f3ae39 smbd: Modernize a few DEBUGs via df75ae65e63 g_lock: Fix buffer length check in g_lock_parse() via aca70be7829 smbd: Simplify check_parent_access_fsp() via c422002ce5e smbd: Remove an obsolete comment from b71f729698f smbd: Add reparse tag to smb3_posix_cc_info
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 2b495c44a2abcfa9b9c7f520e0989ff72f7b651f Author: Volker Lendecke <v...@samba.org> Date: Wed May 15 16:43:31 2024 +0200 smbd: Fix a typo in a few places Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Wed May 15 17:56:24 UTC 2024 on atb-devel-224 commit a99f2f3ae390ddc4d80548a593a3edf50eeb76f3 Author: Volker Lendecke <v...@samba.org> Date: Tue May 14 16:20:03 2024 +0200 smbd: Modernize a few DEBUGs Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit df75ae65e6347736c96707c57e736d15662a6846 Author: Volker Lendecke <v...@samba.org> Date: Sat Feb 10 11:15:58 2024 +0100 g_lock: Fix buffer length check in g_lock_parse() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit aca70be7829b97729b18a9c2c5e3add894e323c1 Author: Volker Lendecke <v...@samba.org> Date: Tue May 14 16:30:21 2024 +0200 smbd: Simplify check_parent_access_fsp() We don't need to explicitly call fetch_share_mode_unlocked, get_file_infos does it for us behind the scenes Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit c422002ce5ef8ea4dcac69b7167dcf67d5c373d1 Author: Volker Lendecke <v...@samba.org> Date: Tue May 14 17:01:40 2024 +0200 smbd: Remove an obsolete comment notify_fname only sends a message to the notify daemon. There is no potential deadlock anymore. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: source3/lib/g_lock.c | 9 +++++---- source3/locking/locking.c | 19 +++++++++++-------- source3/smbd/close.c | 41 +++++++++++++++-------------------------- source3/smbd/open.c | 16 +--------------- 4 files changed, 32 insertions(+), 53 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/lib/g_lock.c b/source3/lib/g_lock.c index 33f088b2a43..77b8287273b 100644 --- a/source3/lib/g_lock.c +++ b/source3/lib/g_lock.c @@ -58,7 +58,8 @@ static bool g_lock_parse(uint8_t *buf, size_t buflen, struct g_lock *lck) uint64_t unique_data_epoch; if (buflen < (SERVER_ID_BUF_LENGTH + /* exclusive */ - sizeof(uint64_t) + /* seqnum */ + sizeof(uint64_t) + /* unique_lock_epoch */ + sizeof(uint64_t) + /* unique_data_epoch */ sizeof(uint32_t))) { /* num_shared */ struct g_lock ret = { .exclusive.pid = 0, @@ -360,7 +361,7 @@ NTSTATUS g_lock_lock_cb_dump(struct g_lock_lock_cb_state *cb_state, { struct g_lock *lck = cb_state->lck; - /* We allow a cn_fn only for G_LOCK_WRITE for now... */ + /* We allow a cb_fn only for G_LOCK_WRITE for now... */ SMB_ASSERT(lck->num_shared == 0); fn(lck->exclusive, @@ -1018,7 +1019,7 @@ struct tevent_req *g_lock_lock_send(TALLOC_CTX *mem_ctx, }; /* - * We allow a cn_fn only for G_LOCK_WRITE for now. + * We allow a cb_fn only for G_LOCK_WRITE for now. * * It's all we currently need and it makes a few things * easier to implement. @@ -1238,7 +1239,7 @@ NTSTATUS g_lock_lock(struct g_lock_ctx *ctx, TDB_DATA key, SMB_ASSERT(!ctx->busy); /* - * We allow a cn_fn only for G_LOCK_WRITE for now. + * We allow a cb_fn only for G_LOCK_WRITE for now. * * It's all we currently need and it makes a few things * easier to implement. diff --git a/source3/locking/locking.c b/source3/locking/locking.c index fa1c85afe91..25735a3083d 100644 --- a/source3/locking/locking.c +++ b/source3/locking/locking.c @@ -158,12 +158,14 @@ bool strict_lock_check_default(files_struct *fsp, struct lock_struct *plock) TALLOC_FREE(br_lck); } - DEBUG(10, ("strict_lock_default: flavour = %s brl start=%ju " - "len=%ju %s for fnum %ju file %s\n", - lock_flav_name(plock->lock_flav), - (uintmax_t)plock->start, (uintmax_t)plock->size, - ret ? "unlocked" : "locked", - (uintmax_t)plock->fnum, fsp_str_dbg(fsp))); + DBG_DEBUG("flavour = %s brl start=%" PRIu64 " " + "len=%" PRIu64 " %s for fnum %" PRIu64 " file %s\n", + lock_flav_name(plock->lock_flav), + plock->start, + plock->size, + ret ? "unlocked" : "locked", + plock->fnum, + fsp_str_dbg(fsp)); return ret; } @@ -583,8 +585,9 @@ bool rename_share_filename(struct messaging_context *msg_ctx, NTSTATUS status; bool ok; - DEBUG(10, ("rename_share_filename: servicepath %s newname %s\n", - servicepath, smb_fname_dst->base_name)); + DBG_DEBUG("servicepath %s newname %s\n", + servicepath, + smb_fname_dst->base_name); status = share_mode_lock_access_private_data(lck, &d); if (!NT_STATUS_IS_OK(status)) { diff --git a/source3/smbd/close.c b/source3/smbd/close.c index 7c5c4d68bee..5cb2bb6f17c 100644 --- a/source3/smbd/close.c +++ b/source3/smbd/close.c @@ -473,8 +473,8 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp, */ lck_state.cleanup_fn = close_share_mode_lock_cleanup; - DEBUG(5,("close_remove_share_mode: file %s. Delete on close was set " - "- deleting file.\n", fsp_str_dbg(fsp))); + DBG_INFO("%s. Delete on close was set - deleting file.\n", + fsp_str_dbg(fsp)); /* * Don't try to update the write time when we delete the file @@ -486,10 +486,9 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp, { /* Become the user who requested the delete. */ - DEBUG(5,("close_remove_share_mode: file %s. " - "Change user to uid %u\n", - fsp_str_dbg(fsp), - (unsigned int)lck_state.del_token->uid)); + DBG_INFO("file %s. Change user to uid %u\n", + fsp_str_dbg(fsp), + (unsigned int)lck_state.del_token->uid); if (!push_sec_ctx()) { smb_panic("close_remove_share_mode: file %s. failed to push " @@ -510,9 +509,10 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp, tmp_status = vfs_stat_fsp(fsp); if (!NT_STATUS_IS_OK(tmp_status)) { - DEBUG(5,("close_remove_share_mode: file %s. Delete on close " + DBG_INFO("file %s. Delete on close " "was set and stat failed with error %s\n", - fsp_str_dbg(fsp), nt_errstr(tmp_status))); + fsp_str_dbg(fsp), + nt_errstr(tmp_status)); /* * Don't save the errno here, we ignore this error */ @@ -523,14 +523,13 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp, if (!file_id_equal(&fsp->file_id, &id)) { struct file_id_buf ftmp1, ftmp2; - DEBUG(5,("close_remove_share_mode: file %s. Delete on close " + DBG_INFO("file %s. Delete on close " "was set and dev and/or inode does not match\n", - fsp_str_dbg(fsp))); - DEBUG(5,("close_remove_share_mode: file %s. stored file_id %s, " - "stat file_id %s\n", + fsp_str_dbg(fsp)); + DBG_INFO("file %s. stored file_id %s, stat file_id %s\n", fsp_str_dbg(fsp), file_id_str_buf(fsp->file_id, &ftmp1), - file_id_str_buf(id, &ftmp2))); + file_id_str_buf(id, &ftmp2)); /* * Don't save the errno here, we ignore this error */ @@ -588,9 +587,10 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp, * zero. */ - DEBUG(5,("close_remove_share_mode: file %s. Delete on close " + DBG_INFO("file %s. Delete on close " "was set and unlink failed with error %s\n", - fsp_str_dbg(fsp), strerror(errno))); + fsp_str_dbg(fsp), + strerror(errno)); status = map_nt_error_from_unix(errno); } @@ -633,17 +633,6 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp, } if (lck_state.delete_object) { - /* - * Do the notification after we released the share - * mode lock. Inside notify_fname we take out another - * tdb lock. With ctdb also accessing our databases, - * this can lead to deadlocks. Putting this notify - * after the TALLOC_FREE(lck) above we avoid locking - * two records simultaneously. Notifies are async and - * informational only, so calling the notify_fname - * without holding the share mode lock should not do - * any harm. - */ notify_fname(conn, NOTIFY_ACTION_REMOVED, FILE_NOTIFY_CHANGE_FILE_NAME, fsp->fsp_name->base_name); diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 68e5eb957f2..04d0e1e0336 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -341,7 +341,6 @@ NTSTATUS check_parent_access_fsp(struct files_struct *fsp, NTSTATUS status; struct security_descriptor *parent_sd = NULL; uint32_t access_granted = 0; - struct share_mode_lock *lck = NULL; uint32_t name_hash; bool delete_on_close_set; TALLOC_CTX *frame = talloc_stackframe(); @@ -410,20 +409,7 @@ NTSTATUS check_parent_access_fsp(struct files_struct *fsp, goto out; } - /* - * Don't take a lock here. We just need a snapshot - * of the current state of delete on close and this is - * called in a codepath where we may already have a lock - * (and we explicitly can't hold 2 locks at the same time - * as that may deadlock). - */ - lck = fetch_share_mode_unlocked(frame, fsp->file_id); - if (lck == NULL) { - status = NT_STATUS_OK; - goto out; - } - - delete_on_close_set = is_delete_on_close_set(lck, name_hash); + get_file_infos(fsp->file_id, name_hash, &delete_on_close_set, NULL); if (delete_on_close_set) { status = NT_STATUS_DELETE_PENDING; goto out; -- Samba Shared Repository