summaryrefslogtreecommitdiffstats
path: root/api
diff options
context:
space:
mode:
Diffstat (limited to 'api')
-rw-r--r--api/src/glfs-fops.c18
-rw-r--r--api/src/glfs-handleops.c8
-rw-r--r--api/src/glfs-internal.h1
3 files changed, 21 insertions, 6 deletions
diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c
index e8d4f9af18f..c8ddeea196e 100644
--- a/api/src/glfs-fops.c
+++ b/api/src/glfs-fops.c
@@ -3571,6 +3571,7 @@ glfs_setxattr_common (struct glfs *fs, const char *path, const char *name,
struct iatt iatt = {0, };
dict_t *xattr = NULL;
int reval = 0;
+ void *value_cp = NULL;
DECLARE_OLD_THIS;
__GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
@@ -3605,8 +3606,13 @@ retry:
if (ret)
goto out;
- xattr = dict_for_key_value (name, value, size);
+ value_cp = gf_memdup (value, size);
+ GF_CHECK_ALLOC_AND_LOG (subvol->name, value_cp, ret, "Failed to"
+ " duplicate setxattr value", out);
+
+ xattr = dict_for_key_value (name, value_cp, size, _gf_false);
if (!xattr) {
+ GF_FREE (value_cp);
ret = -1;
errno = ENOMEM;
goto out;
@@ -3615,8 +3621,6 @@ retry:
ret = syncop_setxattr (subvol, &loc, xattr, flags, NULL, NULL);
DECODE_SYNCOP_ERR (ret);
- ESTALE_RETRY (ret, errno, reval, &loc, retry);
-
out:
loc_wipe (&loc);
if (xattr)
@@ -3659,6 +3663,7 @@ pub_glfs_fsetxattr (struct glfs_fd *glfd, const char *name, const void *value,
xlator_t *subvol = NULL;
dict_t *xattr = NULL;
fd_t *fd = NULL;
+ void *value_cp = NULL;
DECLARE_OLD_THIS;
__GLFS_ENTRY_VALIDATE_FD (glfd, invalid_fs);
@@ -3691,8 +3696,13 @@ pub_glfs_fsetxattr (struct glfs_fd *glfd, const char *name, const void *value,
goto out;
}
- xattr = dict_for_key_value (name, value, size);
+ value_cp = gf_memdup (value, size);
+ GF_CHECK_ALLOC_AND_LOG (subvol->name, value_cp, ret, "Failed to"
+ " duplicate setxattr value", out);
+
+ xattr = dict_for_key_value (name, value_cp, size, _gf_false);
if (!xattr) {
+ GF_FREE (value_cp);
ret = -1;
errno = ENOMEM;
goto out;
diff --git a/api/src/glfs-handleops.c b/api/src/glfs-handleops.c
index dbffa9e26bf..4180f5cf777 100644
--- a/api/src/glfs-handleops.c
+++ b/api/src/glfs-handleops.c
@@ -481,6 +481,7 @@ pub_glfs_h_setxattrs (struct glfs *fs, struct glfs_object *object,
inode_t *inode = NULL;
loc_t loc = {0, };
dict_t *xattr = NULL;
+ void *value_cp = NULL;
/* validate in args */
if ((fs == NULL) || (object == NULL) ||
@@ -517,8 +518,13 @@ pub_glfs_h_setxattrs (struct glfs *fs, struct glfs_object *object,
goto out;
}
- xattr = dict_for_key_value (name, value, size);
+ value_cp = gf_memdup (value, size);
+ GF_CHECK_ALLOC_AND_LOG (subvol->name, value_cp, ret, "Failed to"
+ " duplicate setxattr value", out);
+
+ xattr = dict_for_key_value (name, value_cp, size, _gf_false);
if (!xattr) {
+ GF_FREE (value_cp);
ret = -1;
errno = ENOMEM;
goto out;
diff --git a/api/src/glfs-internal.h b/api/src/glfs-internal.h
index 838b5c748b2..180981830d7 100644
--- a/api/src/glfs-internal.h
+++ b/api/src/glfs-internal.h
@@ -373,7 +373,6 @@ int glfs_loc_touchup (loc_t *loc)
void glfs_iatt_to_stat (struct glfs *fs, struct iatt *iatt, struct stat *stat);
int glfs_loc_link (loc_t *loc, struct iatt *iatt);
int glfs_loc_unlink (loc_t *loc);
-dict_t *dict_for_key_value (const char *name, const char *value, size_t size);
int glfs_getxattr_process (void *value, size_t size, dict_t *xattr,
const char *name);