diff options
author | Poornima G <pgurusid@redhat.com> | 2017-08-03 17:43:22 +0530 |
---|---|---|
committer | Jeff Darcy <jeff@pl.atyp.us> | 2017-08-07 16:28:45 +0000 |
commit | e11296f8e52b7e3b13d21b41d4fa34baea878edf (patch) | |
tree | 2d8d76600e48c1a9336651354cce779c10384d3e /api/src/glfs-handleops.c | |
parent | ebc8237d8c445af208446c937f31aa311d1efb2c (diff) |
gfapi: Duplicate the buffer sent in setxattr calls
Issue:
The caller of glfs_setxattr sends a buffer to set as the value.
We create a dict in which the pointer to the value is set.
Underlying layers like md-cache take a ref on this dict to store
the value for a longer time. But the moment setxattr is complete,
the caller of glfs_setxattr can free the value memory.
Solution:
memcpy the setxattr value to the gluster buffer.
Change-Id: I58753fe702e8b7d0f6c4f058714c65d0ad5d7a0a
BUG: 1477488
Signed-off-by: Poornima G <pgurusid@redhat.com>
Reviewed-on: https://review.gluster.org/17967
Reviewed-by: soumya k <skoduri@redhat.com>
Smoke: Gluster Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Jeff Darcy <jeff@pl.atyp.us>
Diffstat (limited to 'api/src/glfs-handleops.c')
-rw-r--r-- | api/src/glfs-handleops.c | 8 |
1 files changed, 7 insertions, 1 deletions
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; |