From c9d6581c1821d9c873bc19e1ee34766fad6d2990 Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Thu, 3 Apr 2025 22:01:09 +0200 Subject: [PATCH] s3/locking: add and use fsp_[get|apply]_share_entry_flags() Prepares for converting private_options to flags. Fixes Durable Handle reconnect of POSIX opens which weren't setting the fsp_flags when reconnecting, so fsp_flags.posix_open wasn't set. Signed-off-by: Ralph Boehme Reviewed-by: Volker Lendecke --- source3/locking/share_mode_lock.c | 21 +++++++++++++++++++-- source3/locking/share_mode_lock.h | 3 +++ source3/smbd/durable.c | 1 + 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/source3/locking/share_mode_lock.c b/source3/locking/share_mode_lock.c index 43886937119..e3dacbc636a 100644 --- a/source3/locking/share_mode_lock.c +++ b/source3/locking/share_mode_lock.c @@ -2080,8 +2080,7 @@ bool set_share_mode(struct share_mode_lock *lck, .time.tv_usec = fsp->open_time.tv_usec, .share_file_id = fh_get_gen_id(fsp->fh), .uid = (uint32_t)uid, - .flags = fsp->fsp_flags.posix_open ? - SHARE_ENTRY_FLAG_POSIX_OPEN : 0, + .flags = fsp_get_share_entry_flags(fsp), .name_hash = fsp->name_hash, }; @@ -3513,3 +3512,21 @@ NTSTATUS _share_mode_entry_prepare_unlock( return state.status; } + + +uint16_t fsp_get_share_entry_flags(const struct files_struct *fsp) +{ + uint16_t flags = 0; + + if (fsp->fsp_flags.posix_open) { + flags |= SHARE_ENTRY_FLAG_POSIX_OPEN; + } + return flags; +} + +void fsp_apply_share_entry_flags(struct files_struct *fsp, uint16_t flags) +{ + if (flags & SHARE_ENTRY_FLAG_POSIX_OPEN) { + fsp->fsp_flags.posix_open = true; + } +} diff --git a/source3/locking/share_mode_lock.h b/source3/locking/share_mode_lock.h index 0a2696d38a2..82668cd977a 100644 --- a/source3/locking/share_mode_lock.h +++ b/source3/locking/share_mode_lock.h @@ -205,3 +205,6 @@ NTSTATUS _share_mode_entry_prepare_unlock( __fn, __private_data, __location__); #endif + +uint16_t fsp_get_share_entry_flags(const struct files_struct *fsp); +void fsp_apply_share_entry_flags(struct files_struct *fsp, uint16_t flags); diff --git a/source3/smbd/durable.c b/source3/smbd/durable.c index 1c36f552c72..71cd3a01f99 100644 --- a/source3/smbd/durable.c +++ b/source3/smbd/durable.c @@ -596,6 +596,7 @@ static void vfs_default_durable_reconnect_fn(struct share_mode_lock *lck, } fh_set_private_options(fsp->fh, e.private_options); + fsp_apply_share_entry_flags(fsp, e.flags); fsp->open_time = e.time; fsp->access_mask = e.access_mask; fsp->fsp_flags.can_read = ((fsp->access_mask & FILE_READ_DATA) != 0); -- 2.47.3