]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
smbd: Factor out create/directory mode/mask logic
authorVolker Lendecke <vl@samba.org>
Fri, 20 Sep 2024 19:33:33 +0000 (21:33 +0200)
committerRalph Boehme <slow@samba.org>
Thu, 26 Sep 2024 15:22:46 +0000 (15:22 +0000)
Don't write down that logic twice

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
source3/smbd/dosmode.c
source3/smbd/proto.h
source3/smbd/smb2_trans2.c

index 32de2a4a0182181a07166c01c2a51b0e1e00ffdd..e59c234fedb649f0a338985442cd67290b866a1b 100644 (file)
@@ -87,6 +87,20 @@ static uint32_t filter_mode_by_protocol(enum protocol_types protocol,
        return mode;
 }
 
+mode_t apply_conf_file_mask(struct connection_struct *conn, mode_t mode)
+{
+       mode &= lp_create_mask(SNUM(conn));
+       mode |= lp_force_create_mode(SNUM(conn));
+       return mode;
+}
+
+mode_t apply_conf_dir_mask(struct connection_struct *conn, mode_t mode)
+{
+       mode &= lp_directory_mask(SNUM(conn));
+       mode |= lp_force_directory_mode(SNUM(conn));
+       return mode;
+}
+
 /****************************************************************************
  Change a dos mode to a unix mode.
     Base permission for files:
@@ -158,11 +172,7 @@ mode_t unix_mode(connection_struct *conn, int dosmode,
                } else {
                        /* Provisionally add all 'x' bits */
                        result |= (S_IXUSR | S_IXGRP | S_IXOTH);
-
-                       /* Apply directory mask */
-                       result &= lp_directory_mask(SNUM(conn));
-                       /* Add in force bits */
-                       result |= lp_force_directory_mode(SNUM(conn));
+                       result = apply_conf_dir_mask(conn, result);
                }
        } else {
                if ((dosmode & FILE_ATTRIBUTE_ARCHIVE) &&
@@ -184,10 +194,7 @@ mode_t unix_mode(connection_struct *conn, int dosmode,
                        /* Inherit 666 component of parent directory mode */
                        result |= dir_mode & (S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR | S_IWGRP | S_IWOTH);
                } else {
-                       /* Apply mode mask */
-                       result &= lp_create_mask(SNUM(conn));
-                       /* Add in force bits */
-                       result |= lp_force_create_mode(SNUM(conn));
+                       result = apply_conf_file_mask(conn, result);
                }
        }
 
index 93c3dcff07ad394e88ec8c3a3b1fa7d28b65bca4..9265962a2d2ced38af2466783fc23a2f63d5a48c 100644 (file)
@@ -193,6 +193,9 @@ bool smbd_setup_mdns_registration(struct tevent_context *ev,
 
 /* The following definitions come from smbd/dosmode.c  */
 
+mode_t apply_conf_file_mask(struct connection_struct *conn, mode_t mode);
+mode_t apply_conf_dir_mask(struct connection_struct *conn, mode_t mode);
+
 mode_t unix_mode(connection_struct *conn, int dosmode,
                 const struct smb_filename *smb_fname,
                 struct files_struct *parent_dirfsp);
index 29c1ce44bb2a4e86294791df8a724ec2c1e9e393..ad0b85b77c59f2261eb13f015ccd705f1a5f2764 100644 (file)
@@ -914,17 +914,13 @@ NTSTATUS unix_perms_from_wire(connection_struct *conn,
                 * "create mask"/"force create mode" are
                 * only applied to new files, not existing ones.
                 */
-               ret &= lp_create_mask(SNUM(conn));
-               /* Add in force bits */
-               ret |= lp_force_create_mode(SNUM(conn));
+               ret = apply_conf_file_mask(conn, ret);
        } else if (ptype == PERM_NEW_DIR) {
                /*
                 * "directory mask"/"force directory mode" are
                 * only applied to new directories, not existing ones.
                 */
-               ret &= lp_directory_mask(SNUM(conn));
-               /* Add in force bits */
-               ret |= lp_force_directory_mode(SNUM(conn));
+               ret = apply_conf_dir_mask(conn, ret);
        }
 
        *ret_perms = ret;