]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
VFS: SMB_VFS_SYS_ACL_GET_FD: Modify api to take additional type param
authorNoel Power <noel.power@suse.com>
Fri, 14 May 2021 14:26:46 +0000 (15:26 +0100)
committerRalph Boehme <slow@samba.org>
Wed, 9 Jun 2021 13:14:30 +0000 (13:14 +0000)
Modify all implementations (and the definitions) related to
SMB_VFS_SYS_ACL_GET_FD to accept additional SMB_ACL_TYPE_T type param.

Signed-off-by: Noel Power <noel.power@suse.com>
Reviewed-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
26 files changed:
examples/VFS/skel_opaque.c
examples/VFS/skel_transparent.c
source3/include/vfs.h
source3/include/vfs_macros.h
source3/lib/sysacls.c
source3/modules/posixacl_xattr.c
source3/modules/posixacl_xattr.h
source3/modules/vfs_aixacl.c
source3/modules/vfs_aixacl2.c
source3/modules/vfs_catia.c
source3/modules/vfs_default.c
source3/modules/vfs_fake_acls.c
source3/modules/vfs_full_audit.c
source3/modules/vfs_gpfs.c
source3/modules/vfs_hpuxacl.c
source3/modules/vfs_nfs4acl_xattr.c
source3/modules/vfs_not_implemented.c
source3/modules/vfs_posixacl.c
source3/modules/vfs_posixacl.h
source3/modules/vfs_solarisacl.c
source3/modules/vfs_time_audit.c
source3/modules/vfs_zfsacl.c
source3/smbd/posix_acls.c
source3/smbd/trans2.c
source3/smbd/vfs.c
source3/torture/cmd_vfs.c

index 4ac5e61f1ffb1a7981eefb3cee82a2f26d1d74c7..8ec6e0dff387f09a8b776bec9e113dacf367eb25 100644 (file)
@@ -808,7 +808,9 @@ static SMB_ACL_T skel_sys_acl_get_file(vfs_handle_struct *handle,
 }
 
 static SMB_ACL_T skel_sys_acl_get_fd(vfs_handle_struct *handle,
-                                    files_struct *fsp, TALLOC_CTX *mem_ctx)
+                                    files_struct *fsp,
+                                    SMB_ACL_TYPE_T type,
+                                    TALLOC_CTX *mem_ctx)
 {
        errno = ENOSYS;
        return (SMB_ACL_T) NULL;
index 9138bde08729425f13aea68b9ae761a024f685c8..bd22b62e5d000e42fc6b074b80fffdddec6bf97c 100644 (file)
@@ -1075,9 +1075,11 @@ static SMB_ACL_T skel_sys_acl_get_file(vfs_handle_struct *handle,
 }
 
 static SMB_ACL_T skel_sys_acl_get_fd(vfs_handle_struct *handle,
-                                    files_struct *fsp, TALLOC_CTX *mem_ctx)
+                                    files_struct *fsp,
+                                    SMB_ACL_TYPE_T type,
+                                    TALLOC_CTX *mem_ctx)
 {
-       return SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, mem_ctx);
+       return SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, type, mem_ctx);
 }
 
 static int skel_sys_acl_blob_get_file(vfs_handle_struct *handle,
index 0f01da81148ca0e9b3c5ec067758750266f6ed7a..679aa8714301dcd0af19ff868bde160c769998e1 100644 (file)
@@ -1220,6 +1220,7 @@ struct vfs_fn_pointers {
                                         TALLOC_CTX *mem_ctx);
        SMB_ACL_T (*sys_acl_get_fd_fn)(struct vfs_handle_struct *handle,
                                       struct files_struct *fsp,
+                                      SMB_ACL_TYPE_T type,
                                       TALLOC_CTX *mem_ctx);
        int (*sys_acl_blob_get_file_fn)(struct vfs_handle_struct *handle,
                                        const struct smb_filename *smb_fname,
@@ -1731,6 +1732,7 @@ SMB_ACL_T smb_vfs_call_sys_acl_get_file(struct vfs_handle_struct *handle,
                                        TALLOC_CTX *mem_ctx);
 SMB_ACL_T smb_vfs_call_sys_acl_get_fd(struct vfs_handle_struct *handle,
                                      struct files_struct *fsp,
+                                     SMB_ACL_TYPE_T type,
                                      TALLOC_CTX *mem_ctx);
 int smb_vfs_call_sys_acl_blob_get_file(struct vfs_handle_struct *handle,
                                       const struct smb_filename *smb_fname,
@@ -2142,7 +2144,9 @@ SMB_ACL_T vfs_not_implemented_sys_acl_get_file(vfs_handle_struct *handle,
                                               SMB_ACL_TYPE_T type,
                                               TALLOC_CTX *mem_ctx);
 SMB_ACL_T vfs_not_implemented_sys_acl_get_fd(vfs_handle_struct *handle,
-                                            files_struct *fsp, TALLOC_CTX *mem_ctx);
+                                            files_struct *fsp,
+                                            SMB_ACL_TYPE_T type,
+                                            TALLOC_CTX *mem_ctx);
 int vfs_not_implemented_sys_acl_blob_get_file(vfs_handle_struct *handle,
                                const struct smb_filename *smb_fname,
                                TALLOC_CTX *mem_ctx,
index 71492b4db79543321d01f3a196ac39d91032ecb8..be113932d57f6f896e044d6290452a0bf830462b 100644 (file)
 #define SMB_VFS_NEXT_SYS_ACL_GET_FILE(handle, smb_fname, type, mem_ctx)                \
        smb_vfs_call_sys_acl_get_file((handle)->next, (smb_fname), (type), (mem_ctx))
 
-#define SMB_VFS_SYS_ACL_GET_FD(fsp, mem_ctx) \
-       smb_vfs_call_sys_acl_get_fd((fsp)->conn->vfs_handles, (fsp), (mem_ctx))
-#define SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, mem_ctx) \
-       smb_vfs_call_sys_acl_get_fd((handle)->next, (fsp), (mem_ctx))
+#define SMB_VFS_SYS_ACL_GET_FD(fsp, type, mem_ctx) \
+       smb_vfs_call_sys_acl_get_fd((fsp)->conn->vfs_handles, (fsp), (type), (mem_ctx))
+#define SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, type, mem_ctx) \
+       smb_vfs_call_sys_acl_get_fd((handle)->next, (fsp), (type), (mem_ctx))
 
 #define SMB_VFS_SYS_ACL_BLOB_GET_FILE(conn, smb_fname, mem_ctx, blob_description, blob)        \
        smb_vfs_call_sys_acl_blob_get_file((conn)->vfs_handles, (smb_fname), (mem_ctx), (blob_description), (blob))
index 8e30e3341f7f33e43a9b38c1be862d86ab810316..ca31fc60bfbaeaa2ca26b738670c7559a488aa3d 100644 (file)
@@ -372,7 +372,7 @@ SMB_ACL_T sys_acl_get_fd(vfs_handle_struct *handle,
                         SMB_ACL_TYPE_T type,
                         TALLOC_CTX *mem_ctx)
 {
-       return posixacl_sys_acl_get_fd(handle, fsp, mem_ctx);
+       return posixacl_sys_acl_get_fd(handle, fsp, type, mem_ctx);
 }
 
 int sys_acl_set_file(vfs_handle_struct *handle,
index 2b8c926cd33f00e700554b6ae110bb8e1c16eb11..ef0521eda3476c1e910e0bb5362b433b4c76cd73 100644 (file)
@@ -409,25 +409,36 @@ SMB_ACL_T posixacl_xattr_acl_get_file(vfs_handle_struct *handle,
 
 SMB_ACL_T posixacl_xattr_acl_get_fd(vfs_handle_struct *handle,
                                    files_struct *fsp,
+                                   SMB_ACL_TYPE_T type,
                                    TALLOC_CTX *mem_ctx)
 {
        int ret;
        int size = ACL_EA_SIZE(20);
        char *buf = alloca(size);
+       const char *name;
+
+       if (type == SMB_ACL_TYPE_ACCESS) {
+               name = ACL_EA_ACCESS;
+       } else if (type == SMB_ACL_TYPE_DEFAULT) {
+               name = ACL_EA_DEFAULT;
+       } else {
+               errno = EINVAL;
+               return NULL;
+       }
 
        if (!buf) {
                return NULL;
        }
 
-       ret = SMB_VFS_FGETXATTR(fsp, ACL_EA_ACCESS, buf, size);
+       ret = SMB_VFS_FGETXATTR(fsp, name, buf, size);
        if (ret < 0 && errno == ERANGE) {
-               size = SMB_VFS_FGETXATTR(fsp, ACL_EA_ACCESS, NULL, 0);
+               size = SMB_VFS_FGETXATTR(fsp, name, NULL, 0);
                if (size > 0) {
                        buf = alloca(size);
                        if (!buf) {
                                return NULL;
                        }
-                       ret = SMB_VFS_FGETXATTR(fsp, ACL_EA_ACCESS, buf, size);
+                       ret = SMB_VFS_FGETXATTR(fsp, name, buf, size);
                }
        }
 
index 83885b8c10e752676613c1c8f5279e6fe1835eab..9e892dd814e5aba30eeff570c3fd357170855ceb 100644 (file)
@@ -28,6 +28,7 @@ SMB_ACL_T posixacl_xattr_acl_get_file(vfs_handle_struct *handle,
 
 SMB_ACL_T posixacl_xattr_acl_get_fd(vfs_handle_struct *handle,
                                    files_struct *fsp,
+                                   SMB_ACL_TYPE_T type,
                                    TALLOC_CTX *mem_ctx);
 
 int posixacl_xattr_acl_set_file(vfs_handle_struct *handle,
index 182e4e1880ef3690c9852ee6ec45ea09afabf555..0400276f18ef04802266e7a306f7e72193f3d691 100644 (file)
@@ -83,6 +83,7 @@ SMB_ACL_T aixacl_sys_acl_get_file(vfs_handle_struct *handle,
 
 SMB_ACL_T aixacl_sys_acl_get_fd(vfs_handle_struct *handle,
                                files_struct *fsp,
+                               SMB_ACL_TYPE_T type,
                                TALLOC_CTX *mem_ctx)
 {
 
@@ -92,6 +93,11 @@ SMB_ACL_T aixacl_sys_acl_get_fd(vfs_handle_struct *handle,
        int rc = 0;
        uid_t user_id;
 
+       /* AIX has no DEFAULT */
+       if  ( type == SMB_ACL_TYPE_DEFAULT ) {
+               return NULL;
+       }
+
        /* Get the acl using fstatacl */
    
        DEBUG(10,("Entering AIX sys_acl_get_fd\n"));
index 8f4b34ada65d567809ed4c42a87b0d0d4cecec81..cdb709ab88f064a22979ef965cace361a623bbaf 100644 (file)
@@ -323,10 +323,23 @@ SMB_ACL_T aixjfs2_sys_acl_get_file(vfs_handle_struct *handle,
 }
 
 SMB_ACL_T aixjfs2_sys_acl_get_fd(vfs_handle_struct *handle,
-                                files_struct *fsp, TALLOC_CTX *mem_ctx)
+                                files_struct *fsp,
+                                SMB_ACL_TYPE_T type,
+                                TALLOC_CTX *mem_ctx)
 {
         acl_type_t aixjfs2_type;
-        aixjfs2_type.u64 = ACL_AIXC;
+
+        switch(type) {
+        case SMB_ACL_TYPE_ACCESS:
+                aixjfs2_type.u64 = ACL_AIXC;
+                break;
+        case SMB_ACL_TYPE_DEFAULT:
+                DEBUG(0, ("Got AIX JFS2 unsupported type: %d\n", type));
+                return NULL;
+        default:
+                DEBUG(0, ("Got invalid type: %d\n", type));
+                smb_panic("exiting");
+        }
 
        return aixjfs2_get_posix_acl(fsp->fsp_name->base_name,
                                     aixjfs2_type, mem_ctx);
index 34f6bbaed4df877a753e266ae35bca7b0509df6a..e146b8070241dd9dc2c254787509737fab6c8c2c 100644 (file)
@@ -1352,6 +1352,7 @@ static int catia_fsetxattr(struct vfs_handle_struct *handle,
 
 static SMB_ACL_T catia_sys_acl_get_fd(vfs_handle_struct *handle,
                                      files_struct *fsp,
+                                     SMB_ACL_TYPE_T type,
                                      TALLOC_CTX *mem_ctx)
 {
        struct catia_cache *cc = NULL;
@@ -1363,7 +1364,7 @@ static SMB_ACL_T catia_sys_acl_get_fd(vfs_handle_struct *handle,
                return NULL;
        }
 
-       result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, mem_ctx);
+       result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, type, mem_ctx);
 
        CATIA_FETCH_FSP_POST_NEXT(&cc, fsp);
 
index 4ef6ea17fa9b09946e3ae977dfa508e43c633453..58ecff4da26cef0b577ad6a296e2805ef5d6687b 100644 (file)
@@ -3252,9 +3252,10 @@ static SMB_ACL_T vfswrap_sys_acl_get_file(vfs_handle_struct *handle,
 
 static SMB_ACL_T vfswrap_sys_acl_get_fd(vfs_handle_struct *handle,
                                        files_struct *fsp,
+                                       SMB_ACL_TYPE_T type,
                                        TALLOC_CTX *mem_ctx)
 {
-       return sys_acl_get_fd(handle, fsp, SMB_ACL_TYPE_ACCESS, mem_ctx);
+       return sys_acl_get_fd(handle, fsp, type, mem_ctx);
 }
 
 static int vfswrap_sys_acl_set_fd(vfs_handle_struct *handle,
index 41695686086514db4a083d905b48ebd6ec6987fb..9da6530c730597a643640da353bf6266910f3581 100644 (file)
@@ -291,14 +291,32 @@ static SMB_ACL_T fake_acls_sys_acl_get_file(struct vfs_handle_struct *handle,
 
 static SMB_ACL_T fake_acls_sys_acl_get_fd(struct vfs_handle_struct *handle,
                                          files_struct *fsp,
+                                         SMB_ACL_TYPE_T type,
                                          TALLOC_CTX *mem_ctx)
 {
        DATA_BLOB blob = data_blob_null;
        ssize_t length;
-       const char *name = FAKE_ACL_ACCESS_XATTR;
+       const char *name = NULL;
        struct smb_acl_t *acl = NULL;
        TALLOC_CTX *frame = talloc_stackframe();
                
+       switch (type) {
+       case SMB_ACL_TYPE_ACCESS:
+               name = FAKE_ACL_ACCESS_XATTR;
+               break;
+       case SMB_ACL_TYPE_DEFAULT:
+               name = FAKE_ACL_DEFAULT_XATTR;
+               break;
+       default:
+               DBG_ERR("Illegal ACL type %d\n", (int)type);
+               break;
+       }
+
+       if (name == NULL) {
+               TALLOC_FREE(frame);
+               return NULL;
+       }
+
        do {
                blob.length += 1000;
                blob.data = talloc_realloc(frame, blob.data, uint8_t, blob.length);
@@ -598,6 +616,7 @@ static int fake_acls_fchmod(vfs_handle_struct *handle,
 
        the_acl = fake_acls_sys_acl_get_fd(handle,
                                fsp,
+                               SMB_ACL_TYPE_ACCESS,
                                talloc_tos());
        if (the_acl == NULL) {
                TALLOC_FREE(frame);
index 32e7879f7da9fa22b215d7551050c7e4ae9a9775..f5177bf7d327222988ba7a05f250d78310b2e414 100644 (file)
@@ -2571,11 +2571,16 @@ static SMB_ACL_T smb_full_audit_sys_acl_get_file(vfs_handle_struct *handle,
 }
 
 static SMB_ACL_T smb_full_audit_sys_acl_get_fd(vfs_handle_struct *handle,
-                                              files_struct *fsp, TALLOC_CTX *mem_ctx)
+                                              files_struct *fsp,
+                                              SMB_ACL_TYPE_T type,
+                                              TALLOC_CTX *mem_ctx)
 {
        SMB_ACL_T result;
 
-       result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, mem_ctx);
+       result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle,
+                                            fsp,
+                                            type,
+                                            mem_ctx);
 
        do_log(SMB_VFS_OP_SYS_ACL_GET_FD, (result != NULL), handle,
               "%s", fsp_str_do_log(fsp));
index a05bb0f3c7a21b9c11df1bf92cca00ef3c567dd4..18eb8f72c74ff3f709ba43fc4affccd9990ca832 100644 (file)
@@ -1072,8 +1072,10 @@ static SMB_ACL_T gpfsacl_sys_acl_get_file(vfs_handle_struct *handle,
 
 static SMB_ACL_T gpfsacl_sys_acl_get_fd(vfs_handle_struct *handle,
                                        files_struct *fsp,
+                                       SMB_ACL_TYPE_T type,
                                        TALLOC_CTX *mem_ctx)
 {
+       gpfs_aclType_t gpfs_type;
        struct gpfs_config_data *config;
 
        SMB_VFS_HANDLE_GET_DATA(handle, config,
@@ -1081,11 +1083,22 @@ static SMB_ACL_T gpfsacl_sys_acl_get_fd(vfs_handle_struct *handle,
                                return NULL);
 
        if (!config->acl) {
-               return SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, mem_ctx);
+               return SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, type, mem_ctx);
        }
 
+       switch(type) {
+       case SMB_ACL_TYPE_ACCESS:
+               gpfs_type = GPFS_ACL_TYPE_ACCESS;
+               break;
+       case SMB_ACL_TYPE_DEFAULT:
+               gpfs_type = GPFS_ACL_TYPE_DEFAULT;
+               break;
+       default:
+               DEBUG(0, ("Got invalid type: %d\n", type));
+               smb_panic("exiting");
+       }
        return gpfsacl_get_posix_acl(fsp->fsp_name->base_name,
-                                    GPFS_ACL_TYPE_ACCESS, mem_ctx);
+                                    gpfs_type, mem_ctx);
 }
 
 static int gpfsacl_sys_acl_blob_get_file(vfs_handle_struct *handle,
index ec09e3b9ee9879e78fec524bc4734d3e25dc31fa..21e25491611cc3f2f5bcc56a40bfbe5e01571b00 100644 (file)
@@ -189,6 +189,7 @@ SMB_ACL_T hpuxacl_sys_acl_get_file(vfs_handle_struct *handle,
  */
 SMB_ACL_T hpuxacl_sys_acl_get_fd(vfs_handle_struct *handle,
                                 files_struct *fsp,
+                                SMB_ACL_TYPE_T type,
                                 TALLOC_CTX *mem_ctx)
 {
         /* 
@@ -203,7 +204,7 @@ SMB_ACL_T hpuxacl_sys_acl_get_fd(vfs_handle_struct *handle,
 
         return hpuxacl_sys_acl_get_file(handle,
                                        fsp->fsp_name->base_name,
-                                       SMB_ACL_TYPE_ACCESS,
+                                       type,
                                        mem_ctx);
 }
 
index 1cf1d22381bfb18dd3be02bc4046515b66a7cc9e..f9ad5eba032fabf3460e7c3bccc5bc062b1ab081 100644 (file)
@@ -634,6 +634,7 @@ static SMB_ACL_T nfs4acl_xattr_fail__sys_acl_get_file(vfs_handle_struct *handle,
 
 static SMB_ACL_T nfs4acl_xattr_fail__sys_acl_get_fd(vfs_handle_struct *handle,
                                                    files_struct *fsp,
+                                                   SMB_ACL_TYPE_T type,
                                                    TALLOC_CTX *mem_ctx)
 {
        return (SMB_ACL_T)NULL;
index 8b93b3444e250b5a75950f7490783eb7ffad6581..24e4f6b07a77a29088a471d7255a9dd510541e21 100644 (file)
@@ -812,7 +812,9 @@ SMB_ACL_T vfs_not_implemented_sys_acl_get_file(vfs_handle_struct *handle,
 }
 
 SMB_ACL_T vfs_not_implemented_sys_acl_get_fd(vfs_handle_struct *handle,
-                                            files_struct *fsp, TALLOC_CTX *mem_ctx)
+                                            files_struct *fsp,
+                                            SMB_ACL_TYPE_T type,
+                                            TALLOC_CTX *mem_ctx)
 {
        errno = ENOSYS;
        return (SMB_ACL_T) NULL;
index 534248a6b6420e8d06b52cc6e98951aab42b0395..44a7efc99339cfce90c6a22b787f8fc6392330f2 100644 (file)
@@ -66,12 +66,27 @@ SMB_ACL_T posixacl_sys_acl_get_file(vfs_handle_struct *handle,
 }
 
 SMB_ACL_T posixacl_sys_acl_get_fd(vfs_handle_struct *handle,
-                                 files_struct *fsp, TALLOC_CTX *mem_ctx)
+                                 files_struct *fsp,
+                                 SMB_ACL_TYPE_T type,
+                                 TALLOC_CTX *mem_ctx)
 {
        struct smb_acl_t *result;
        acl_t acl = NULL;
+       acl_type_t acl_type;
 
-       if (!fsp->fsp_flags.is_pathref) {
+       switch(type) {
+       case SMB_ACL_TYPE_ACCESS:
+               acl_type = ACL_TYPE_ACCESS;
+               break;
+       case SMB_ACL_TYPE_DEFAULT:
+               acl_type = ACL_TYPE_DEFAULT;
+               break;
+       default:
+               errno = EINVAL;
+               return NULL;
+       }
+       if (!fsp->fsp_flags.is_pathref && (acl_type == ACL_TYPE_ACCESS)) {
+               /* POSIX API only allows ACL_TYPE_ACCESS fetched on fd. */
                acl = acl_get_fd(fsp_get_io_fd(fsp));
        } else if (fsp->fsp_flags.have_proc_fds) {
                int fd = fsp_get_pathref_fd(fsp);
@@ -83,12 +98,12 @@ SMB_ACL_T posixacl_sys_acl_get_fd(vfs_handle_struct *handle,
                        return NULL;
                }
 
-               acl = acl_get_file(proc_fd_path, ACL_TYPE_ACCESS);
+               acl = acl_get_file(proc_fd_path, acl_type);
        } else {
                /*
                 * This is no longer a handle based call.
                 */
-               acl = acl_get_file(fsp->fsp_name->base_name, ACL_TYPE_ACCESS);
+               acl = acl_get_file(fsp->fsp_name->base_name, acl_type);
        }
        if (acl == NULL) {
                return NULL;
index 7c7007b5f572da174d19967f471f6fc47026d784..50e7c480e974acada2d1f33e010cef54db272b44 100644 (file)
@@ -28,6 +28,7 @@ SMB_ACL_T posixacl_sys_acl_get_file(vfs_handle_struct *handle,
 
 SMB_ACL_T posixacl_sys_acl_get_fd(vfs_handle_struct *handle,
                                  files_struct *fsp,
+                                 SMB_ACL_TYPE_T type,
                                  TALLOC_CTX *mem_ctx);
 
 int posixacl_sys_acl_set_file(vfs_handle_struct *handle,
index d35721b9b04001f532b8c7fb042b457985f8445b..9e310d13bb546c0830ede0a8b376c3eac60dad9e 100644 (file)
@@ -105,7 +105,9 @@ SMB_ACL_T solarisacl_sys_acl_get_file(vfs_handle_struct *handle,
  * get the access ACL of a file referred to by a fd
  */
 SMB_ACL_T solarisacl_sys_acl_get_fd(vfs_handle_struct *handle,
-                                   files_struct *fsp, TALLOC_CTX *mem_ctx)
+                                   files_struct *fsp,
+                                   SMB_ACL_TYPE_T type,
+                                   TALLOC_CTX *mem_ctx)
 {
        SMB_ACL_T result = NULL;
        int count;
@@ -116,13 +118,19 @@ SMB_ACL_T solarisacl_sys_acl_get_fd(vfs_handle_struct *handle,
        if (!solaris_acl_get_fd(fsp_get_io_fd(fsp), &solaris_acl, &count)) {
                goto done;
        }
+
+       if (type != SMB_ACL_TYPE_ACCESS && type != SMB_ACL_TYPE_DEFAULT) {
+               DEBUG(10, ("invalid SMB_ACL_TYPE given (%d)\n", type));
+               errno = EINVAL;
+               goto done;
+       }
        /* 
         * The facl call returns both ACCESS and DEFAULT acls (as present). 
         * The posix acl_get_fd function returns only the
         * access acl. So we need to filter this out here.  
         */
        result = solaris_acl_to_smb_acl(solaris_acl, count,
-                                       SMB_ACL_TYPE_ACCESS, mem_ctx);
+                                       type, mem_ctx);
        if (result == NULL) {
                DEBUG(10, ("conversion solaris_acl -> smb_acl failed (%s).\n",
                           strerror(errno)));
index 28196b55a8d84a4e2a4037564569f193c3393e58..9f407a721d9c8838f05ca863612ddce9d076b46e 100644 (file)
@@ -2371,6 +2371,7 @@ static SMB_ACL_T smb_time_audit_sys_acl_get_file(vfs_handle_struct *handle,
 
 static SMB_ACL_T smb_time_audit_sys_acl_get_fd(vfs_handle_struct *handle,
                                               files_struct *fsp,
+                                              SMB_ACL_TYPE_T type,
                                               TALLOC_CTX *mem_ctx)
 {
        SMB_ACL_T result;
@@ -2378,7 +2379,7 @@ static SMB_ACL_T smb_time_audit_sys_acl_get_fd(vfs_handle_struct *handle,
        double timediff;
 
        clock_gettime_mono(&ts1);
-       result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, mem_ctx);
+       result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, type, mem_ctx);
        clock_gettime_mono(&ts2);
        timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
 
index bdddce8a5d0bc116066471347d26361233d0ba6e..6f2696577e985788cf76eb15fbe96dd02aac14aa 100644 (file)
@@ -533,6 +533,7 @@ static SMB_ACL_T zfsacl_fail__sys_acl_get_file(vfs_handle_struct *handle,
 
 static SMB_ACL_T zfsacl_fail__sys_acl_get_fd(vfs_handle_struct *handle,
                                             files_struct *fsp,
+                                            SMB_ACL_TYPE_T type,
                                             TALLOC_CTX *mem_ctx)
 {
        return (SMB_ACL_T)NULL;
index 489a4695ba13d4e3139a001a0c37a5f110866477..2d533b4373367c3bb44987ad1f5c9473ce2a9427 100644 (file)
@@ -3443,14 +3443,15 @@ NTSTATUS posix_fget_nt_acl(struct files_struct *fsp, uint32_t security_info,
        }
 
        /* Get the ACL from the fd. */
-       posix_acl = SMB_VFS_SYS_ACL_GET_FD(fsp, frame);
+       posix_acl = SMB_VFS_SYS_ACL_GET_FD(fsp,
+                                          SMB_ACL_TYPE_ACCESS,
+                                          frame);
 
        /* If it's a directory get the default POSIX ACL. */
        if(fsp->fsp_flags.is_directory) {
-               def_acl = SMB_VFS_SYS_ACL_GET_FILE(fsp->conn,
-                                                  fsp->fsp_name,
-                                                  SMB_ACL_TYPE_DEFAULT,
-                                                  frame);
+               def_acl = SMB_VFS_SYS_ACL_GET_FD(fsp,
+                                                SMB_ACL_TYPE_DEFAULT,
+                                                frame);
                def_acl = free_empty_sys_acl(fsp->conn, def_acl);
        }
 
@@ -4447,7 +4448,9 @@ static NTSTATUS remove_posix_acl(connection_struct *conn,
        }
 
        /* Get the current file ACL. */
-       file_acl = SMB_VFS_SYS_ACL_GET_FD(fsp, talloc_tos());
+       file_acl = SMB_VFS_SYS_ACL_GET_FD(fsp,
+                                         SMB_ACL_TYPE_ACCESS,
+                                         talloc_tos());
 
        if (file_acl == NULL) {
                status = map_nt_error_from_unix(errno);
index 5d4645f09dd238b754c7b7a4ad1ccae1d7477c01..0692cdcb4e221fb27cd3bb812f05ab6fbe0f0139 100644 (file)
@@ -4996,7 +4996,7 @@ static NTSTATUS smb_query_posix_acl(connection_struct *conn,
                goto out;
        }
 
-       file_acl = SMB_VFS_SYS_ACL_GET_FD(fsp,
+       file_acl = SMB_VFS_SYS_ACL_GET_FD(fsp, SMB_ACL_TYPE_ACCESS,
                                        talloc_tos());
 
        if (file_acl == NULL && no_acl_syscall_error(errno)) {
index 958b53fe4865ab388464313a65b7f03b3d45e8d1..866ad9d2e8598dbcfd0cbcfcb7a092a9aecbaf2c 100644 (file)
@@ -2759,10 +2759,11 @@ SMB_ACL_T smb_vfs_call_sys_acl_get_file(struct vfs_handle_struct *handle,
 
 SMB_ACL_T smb_vfs_call_sys_acl_get_fd(struct vfs_handle_struct *handle,
                                      struct files_struct *fsp,
+                                     SMB_ACL_TYPE_T type,
                                      TALLOC_CTX *mem_ctx)
 {
        VFS_FIND(sys_acl_get_fd);
-       return handle->fns->sys_acl_get_fd_fn(handle, fsp, mem_ctx);
+       return handle->fns->sys_acl_get_fd_fn(handle, fsp, type, mem_ctx);
 }
 
 int smb_vfs_call_sys_acl_blob_get_file(struct vfs_handle_struct *handle,
index 5d75d930b72ed177ff0461b591405300bf1c1f3f..de41554dba93c27c298f1937fc93c85cbbc3820e 100644 (file)
@@ -1817,7 +1817,9 @@ static NTSTATUS cmd_sys_acl_get_fd(struct vfs_state *vfs, TALLOC_CTX *mem_ctx,
                return NT_STATUS_OK;
        }
 
-       acl = SMB_VFS_SYS_ACL_GET_FD(vfs->files[fd], talloc_tos());
+       acl = SMB_VFS_SYS_ACL_GET_FD(vfs->files[fd],
+                                    SMB_ACL_TYPE_ACCESS,
+                                    talloc_tos());
        if (!acl) {
                printf("sys_acl_get_fd failed (%s)\n", strerror(errno));
                return NT_STATUS_UNSUCCESSFUL;