From bf82e232d176034f74ff5a12d0b00bccbb3a1008 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Fri, 20 Sep 2024 21:33:33 +0200 Subject: [PATCH] smbd: Factor out create/directory mode/mask logic Don't write down that logic twice Signed-off-by: Volker Lendecke Reviewed-by: Ralph Boehme --- source3/smbd/dosmode.c | 25 ++++++++++++++++--------- source3/smbd/proto.h | 3 +++ source3/smbd/smb2_trans2.c | 8 ++------ 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/source3/smbd/dosmode.c b/source3/smbd/dosmode.c index 32de2a4a018..e59c234fedb 100644 --- a/source3/smbd/dosmode.c +++ b/source3/smbd/dosmode.c @@ -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); } } diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index 93c3dcff07a..9265962a2d2 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -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); diff --git a/source3/smbd/smb2_trans2.c b/source3/smbd/smb2_trans2.c index 29c1ce44bb2..ad0b85b77c5 100644 --- a/source3/smbd/smb2_trans2.c +++ b/source3/smbd/smb2_trans2.c @@ -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; -- 2.47.3