From: Uri Simchoni Date: Tue, 5 Dec 2017 18:49:03 +0000 (+0200) Subject: pysmbd: fix use of sysacl API X-Git-Tag: samba-4.6.13~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e64528a915398c7d5ac6da508f7ebdf4faf7b444;p=thirdparty%2Fsamba.git pysmbd: fix use of sysacl API Fix pysmbd to use the sysacl (POSIX ACL support) as intended, and not assume too much about the inner structure and implementation of the permissions in the sysacl API. This will allow the inner structure to change in a following commit. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13176 Signed-off-by: Uri Simchoni Reviewed-by: Jeremy Allison (cherry picked from commit d6f5ee6707fa5404e2bef6fc81ae06b393ebd8ff) --- diff --git a/source3/smbd/pysmbd.c b/source3/smbd/pysmbd.c index fca8f108b57..06a02cbeeb3 100644 --- a/source3/smbd/pysmbd.c +++ b/source3/smbd/pysmbd.c @@ -224,6 +224,39 @@ static NTSTATUS get_nt_acl_conn(TALLOC_CTX *mem_ctx, return status; } +static int set_acl_entry_perms(SMB_ACL_ENTRY_T entry, mode_t perm_mask) +{ + SMB_ACL_PERMSET_T perms = NULL; + + if (sys_acl_get_permset(entry, &perms) != 0) { + return -1; + } + + if (sys_acl_clear_perms(perms) != 0) { + return -1; + } + + if ((perm_mask & SMB_ACL_READ) != 0 && + sys_acl_add_perm(perms, SMB_ACL_READ) != 0) { + return -1; + } + + if ((perm_mask & SMB_ACL_WRITE) != 0 && + sys_acl_add_perm(perms, SMB_ACL_WRITE) != 0) { + return -1; + } + + if ((perm_mask & SMB_ACL_EXECUTE) != 0 && + sys_acl_add_perm(perms, SMB_ACL_EXECUTE) != 0) { + return -1; + } + + if (sys_acl_set_permset(entry, perms) != 0) { + return -1; + } + + return 0; +} static SMB_ACL_T make_simple_acl(gid_t gid, mode_t chmod_mode) { @@ -251,7 +284,7 @@ static SMB_ACL_T make_simple_acl(gid_t gid, mode_t chmod_mode) return NULL; } - if (sys_acl_set_permset(entry, &mode_user) != 0) { + if (set_acl_entry_perms(entry, mode_user) != 0) { TALLOC_FREE(frame); return NULL; } @@ -266,7 +299,7 @@ static SMB_ACL_T make_simple_acl(gid_t gid, mode_t chmod_mode) return NULL; } - if (sys_acl_set_permset(entry, &mode_group) != 0) { + if (set_acl_entry_perms(entry, mode_group) != 0) { TALLOC_FREE(frame); return NULL; } @@ -281,7 +314,7 @@ static SMB_ACL_T make_simple_acl(gid_t gid, mode_t chmod_mode) return NULL; } - if (sys_acl_set_permset(entry, &mode_other) != 0) { + if (set_acl_entry_perms(entry, mode_other) != 0) { TALLOC_FREE(frame); return NULL; } @@ -302,7 +335,7 @@ static SMB_ACL_T make_simple_acl(gid_t gid, mode_t chmod_mode) return NULL; } - if (sys_acl_set_permset(entry, &mode_group) != 0) { + if (set_acl_entry_perms(entry, mode_group) != 0) { TALLOC_FREE(frame); return NULL; } @@ -318,7 +351,7 @@ static SMB_ACL_T make_simple_acl(gid_t gid, mode_t chmod_mode) return NULL; } - if (sys_acl_set_permset(entry, &mode) != 0) { + if (set_acl_entry_perms(entry, mode) != 0) { TALLOC_FREE(frame); return NULL; }