]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3/locking: store NTCREATEX_FLAG_DENY_[DOS|FCB] as share_entry_flags
authorRalph Boehme <slow@samba.org>
Mon, 17 Mar 2025 13:59:49 +0000 (14:59 +0100)
committerVolker Lendecke <vl@samba.org>
Wed, 9 Apr 2025 13:40:36 +0000 (13:40 +0000)
Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
source3/librpc/idl/open_files.idl
source3/locking/share_mode_lock.c
source3/utils/status.c

index 0182bbd304618c31c79a75f1baabe5ee4068f75f..9f1d33a60d08c85e377d10b5b379165c8ce44271 100644 (file)
@@ -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 {
index cf76c457b21ada407a06557b8491221db8092235..fa6cd4230e02dd6b292f61f9a68f79faf2b69549 100644 (file)
@@ -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));
 }
index f47504208e645e9dd01639ac363a91be48594d90..806168ae902bae8b46159bfc2b24f3065c6c93bd 100644 (file)
@@ -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";