From: Ralph Boehme Date: Mon, 17 Mar 2025 13:59:49 +0000 (+0100) Subject: s3/locking: store NTCREATEX_FLAG_DENY_[DOS|FCB] as share_entry_flags X-Git-Tag: tevent-0.17.0~359 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fd281343c178de4193a32d4d6557a92a959c5ffc;p=thirdparty%2Fsamba.git s3/locking: store NTCREATEX_FLAG_DENY_[DOS|FCB] as share_entry_flags Signed-off-by: Ralph Boehme Reviewed-by: Volker Lendecke --- diff --git a/source3/librpc/idl/open_files.idl b/source3/librpc/idl/open_files.idl index 0182bbd3046..9f1d33a60d0 100644 --- a/source3/librpc/idl/open_files.idl +++ b/source3/librpc/idl/open_files.idl @@ -14,7 +14,9 @@ interface open_files { typedef [public,bitmap16bit] bitmap { SHARE_ENTRY_FLAG_POSIX_OPEN = 0x0001, - SHARE_ENTRY_FLAG_STREAM_BASEOPEN = 0x0002 + SHARE_ENTRY_FLAG_STREAM_BASEOPEN = 0x0002, + SHARE_ENTRY_FLAG_DENY_DOS = 0x0004, + SHARE_ENTRY_FLAG_DENY_FCB = 0x0008 } share_entry_flags; typedef [enum16bit] enum { diff --git a/source3/locking/share_mode_lock.c b/source3/locking/share_mode_lock.c index cf76c457b21..fa6cd4230e0 100644 --- a/source3/locking/share_mode_lock.c +++ b/source3/locking/share_mode_lock.c @@ -3525,6 +3525,12 @@ uint16_t fsp_get_share_entry_flags(const struct files_struct *fsp) if (private_options & NTCREATEX_FLAG_STREAM_BASEOPEN) { flags |= SHARE_ENTRY_FLAG_STREAM_BASEOPEN; } + if (private_options & NTCREATEX_FLAG_DENY_DOS) { + flags |= SHARE_ENTRY_FLAG_DENY_DOS; + } + if (private_options & NTCREATEX_FLAG_DENY_FCB) { + flags |= SHARE_ENTRY_FLAG_DENY_FCB; + } return flags; } @@ -3539,4 +3545,12 @@ void fsp_apply_share_entry_flags(struct files_struct *fsp, uint16_t flags) * of restoring an fsp when doing a Durable Handle reconnect. */ SMB_ASSERT(!(flags & SHARE_ENTRY_FLAG_STREAM_BASEOPEN)); + + /* + * SHARE_ENTRY_FLAG_DENY_[DOS|FCB] are only valid for SMB1, so + * they're not supposed to be set when we're called as part + * of restoring an fsp when doing a Durable Handle reconnect. + */ + SMB_ASSERT(!(flags & SHARE_ENTRY_FLAG_DENY_DOS)); + SMB_ASSERT(!(flags & SHARE_ENTRY_FLAG_DENY_FCB)); } diff --git a/source3/utils/status.c b/source3/utils/status.c index f47504208e6..806168ae902 100644 --- a/source3/utils/status.c +++ b/source3/utils/status.c @@ -166,7 +166,7 @@ static int prepare_share_mode(struct traverse_state *state) } static uint32_t map_share_mode_to_deny_mode( - uint32_t share_access, uint32_t private_options) + uint32_t share_access, uint16_t flags) { switch (share_access & ~FILE_SHARE_DELETE) { case FILE_SHARE_NONE: @@ -178,9 +178,9 @@ static uint32_t map_share_mode_to_deny_mode( case FILE_SHARE_READ|FILE_SHARE_WRITE: return DENY_NONE; } - if (private_options & NTCREATEX_FLAG_DENY_DOS) { + if (flags & SHARE_ENTRY_FLAG_DENY_DOS) { return DENY_DOS; - } else if (private_options & NTCREATEX_FLAG_DENY_FCB) { + } else if (flags & SHARE_ENTRY_FLAG_DENY_FCB) { return DENY_FCB; } @@ -233,7 +233,7 @@ static int print_share_mode(struct file_id fid, } denymode_int = map_share_mode_to_deny_mode(e->share_access, - e->private_options); + e->flags); switch (denymode_int) { case DENY_NONE: denymode = "DENY_NONE";