python: Fix talloc frame use in make_simple_acl().
authorJeremy Allison <jra@samba.org>
Thu, 14 Jun 2018 21:08:36 +0000 (14:08 -0700)
committerKarolin Seeger <kseeger@samba.org>
Wed, 20 Jun 2018 11:53:29 +0000 (13:53 +0200)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=13474

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
This was fixed differently by commit
539f51f0dfbe4ce317a2978982fd0fc9a7fd6922 in master.

Autobuild-User(v4-8-test): Karolin Seeger <kseeger@samba.org>
Autobuild-Date(v4-8-test): Wed Jun 20 13:53:29 CEST 2018 on sn-devel-144

source3/smbd/pysmbd.c

index be30b866e2067e5cfa2183ffe97ed5514286fc15..41b44ad2d4223251db5460b3793b82eceb9fe304 100644 (file)
@@ -268,101 +268,101 @@ static int set_acl_entry_perms(SMB_ACL_ENTRY_T entry, mode_t perm_mask)
        return 0;
 }
 
-static SMB_ACL_T make_simple_acl(gid_t gid, mode_t chmod_mode)
+static SMB_ACL_T make_simple_acl(TALLOC_CTX *mem_ctx,
+                       gid_t gid,
+                       mode_t chmod_mode)
 {
-       TALLOC_CTX *frame = talloc_stackframe();
-
        mode_t mode = SMB_ACL_READ|SMB_ACL_WRITE|SMB_ACL_EXECUTE;
 
        mode_t mode_user = (chmod_mode & 0700) >> 6;
        mode_t mode_group = (chmod_mode & 070) >> 3;
        mode_t mode_other = chmod_mode &  07;
        SMB_ACL_ENTRY_T entry;
-       SMB_ACL_T acl = sys_acl_init(frame);
+       SMB_ACL_T acl = sys_acl_init(mem_ctx);
 
        if (!acl) {
                return NULL;
        }
 
        if (sys_acl_create_entry(&acl, &entry) != 0) {
-               TALLOC_FREE(frame);
+               TALLOC_FREE(acl);
                return NULL;
        }
 
        if (sys_acl_set_tag_type(entry, SMB_ACL_USER_OBJ) != 0) {
-               TALLOC_FREE(frame);
+               TALLOC_FREE(acl);
                return NULL;
        }
 
        if (set_acl_entry_perms(entry, mode_user) != 0) {
-               TALLOC_FREE(frame);
+               TALLOC_FREE(acl);
                return NULL;
        }
 
        if (sys_acl_create_entry(&acl, &entry) != 0) {
-               TALLOC_FREE(frame);
+               TALLOC_FREE(acl);
                return NULL;
        }
 
        if (sys_acl_set_tag_type(entry, SMB_ACL_GROUP_OBJ) != 0) {
-               TALLOC_FREE(frame);
+               TALLOC_FREE(acl);
                return NULL;
        }
 
        if (set_acl_entry_perms(entry, mode_group) != 0) {
-               TALLOC_FREE(frame);
+               TALLOC_FREE(acl);
                return NULL;
        }
 
        if (sys_acl_create_entry(&acl, &entry) != 0) {
-               TALLOC_FREE(frame);
+               TALLOC_FREE(acl);
                return NULL;
        }
 
        if (sys_acl_set_tag_type(entry, SMB_ACL_OTHER) != 0) {
-               TALLOC_FREE(frame);
+               TALLOC_FREE(acl);
                return NULL;
        }
 
        if (set_acl_entry_perms(entry, mode_other) != 0) {
-               TALLOC_FREE(frame);
+               TALLOC_FREE(acl);
                return NULL;
        }
 
        if (gid != -1) {
                if (sys_acl_create_entry(&acl, &entry) != 0) {
-                       TALLOC_FREE(frame);
+                       TALLOC_FREE(acl);
                        return NULL;
                }
 
                if (sys_acl_set_tag_type(entry, SMB_ACL_GROUP) != 0) {
-                       TALLOC_FREE(frame);
+                       TALLOC_FREE(acl);
                        return NULL;
                }
 
                if (sys_acl_set_qualifier(entry, &gid) != 0) {
-                       TALLOC_FREE(frame);
+                       TALLOC_FREE(acl);
                        return NULL;
                }
 
                if (set_acl_entry_perms(entry, mode_group) != 0) {
-                       TALLOC_FREE(frame);
+                       TALLOC_FREE(acl);
                        return NULL;
                }
        }
 
        if (sys_acl_create_entry(&acl, &entry) != 0) {
-               TALLOC_FREE(frame);
+               TALLOC_FREE(acl);
                return NULL;
        }
 
        if (sys_acl_set_tag_type(entry, SMB_ACL_MASK) != 0) {
-               TALLOC_FREE(frame);
+               TALLOC_FREE(acl);
                return NULL;
        }
 
        if (set_acl_entry_perms(entry, mode) != 0) {
-               TALLOC_FREE(frame);
+               TALLOC_FREE(acl);
                return NULL;
        }
        return acl;
@@ -386,17 +386,20 @@ static PyObject *py_smbd_set_simple_acl(PyObject *self, PyObject *args, PyObject
                                         &fname, &mode, &gid, &service))
                return NULL;
 
-       acl = make_simple_acl(gid, mode);
-
        frame = talloc_stackframe();
 
+       acl = make_simple_acl(frame, gid, mode);
+       if (acl == NULL) {
+               TALLOC_FREE(frame);
+               return NULL;
+       }
+
        conn = get_conn(frame, service);
        if (!conn) {
                return NULL;
        }
 
        ret = set_sys_acl_conn(fname, SMB_ACL_TYPE_ACCESS, acl, conn);
-       TALLOC_FREE(acl);
 
        if (ret != 0) {
                TALLOC_FREE(frame);