summaryrefslogtreecommitdiffstats
path: root/api/src/glfs-handleops.c
diff options
context:
space:
mode:
Diffstat (limited to 'api/src/glfs-handleops.c')
-rw-r--r--api/src/glfs-handleops.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/api/src/glfs-handleops.c b/api/src/glfs-handleops.c
index c010f0c9a0f..47f2139c140 100644
--- a/api/src/glfs-handleops.c
+++ b/api/src/glfs-handleops.c
@@ -1987,6 +1987,7 @@ pub_glfs_h_acl_set (struct glfs *fs, struct glfs_object *object,
int ret = -1;
char *acl_s = NULL;
const char *acl_key = NULL;
+ struct glfs_object *new_object = NULL;
DECLARE_OLD_THIS;
@@ -2006,12 +2007,22 @@ pub_glfs_h_acl_set (struct glfs *fs, struct glfs_object *object,
if (!acl_s)
goto out;
- ret = pub_glfs_h_setxattrs (fs, object, acl_key, acl_s,
+ if (IA_ISLNK (object->inode->ia_type)) {
+ new_object = glfs_h_resolve_symlink (fs, object);
+ if (new_object == NULL)
+ goto out;
+ } else
+ new_object = object;
+
+ ret = pub_glfs_h_setxattrs (fs, new_object, acl_key, acl_s,
strlen (acl_s) + 1, 0);
acl_free (acl_s);
out:
+ if (IA_ISLNK (object->inode->ia_type) && new_object)
+ glfs_h_close (new_object);
+
__GLFS_EXIT_FS;
invalid_fs:
@@ -2027,6 +2038,7 @@ pub_glfs_h_acl_get (struct glfs *fs, struct glfs_object *object,
char *acl_s = NULL;
dict_t *xattr = NULL;
const char *acl_key = NULL;
+ struct glfs_object *new_object = NULL;
DECLARE_OLD_THIS;
@@ -2041,7 +2053,14 @@ pub_glfs_h_acl_get (struct glfs *fs, struct glfs_object *object,
if (!acl_key)
goto out;
- ret = glfs_h_getxattrs_common (fs, object, &xattr, acl_key);
+ if (IA_ISLNK (object->inode->ia_type)) {
+ new_object = glfs_h_resolve_symlink (fs, object);
+ if (new_object == NULL)
+ goto out;
+ } else
+ new_object = object;
+
+ ret = glfs_h_getxattrs_common (fs, new_object, &xattr, acl_key);
if (ret)
goto out;
@@ -2053,6 +2072,8 @@ pub_glfs_h_acl_get (struct glfs *fs, struct glfs_object *object,
out:
GF_FREE (acl_s);
+ if (IA_ISLNK (object->inode->ia_type) && new_object)
+ glfs_h_close (new_object);
__GLFS_EXIT_FS;