summaryrefslogtreecommitdiffstats
path: root/xlators/mount/fuse/src/fuse-bridge.c
diff options
context:
space:
mode:
authorXavi Hernandez <xhernandez@redhat.com>2019-02-05 16:57:52 +0100
committerAmar Tumballi <amarts@redhat.com>2019-02-07 10:56:33 +0000
commit539c3027d47959eb37e280807b731d3e37e8ac33 (patch)
treeb06ff2583a50665f62868e01fb38d42304d1a66c /xlators/mount/fuse/src/fuse-bridge.c
parent208c368cc7e6f8124bf65ecefdbc5f4304b4f484 (diff)
fuse: correctly handle setxattr values
The setxattr function receives a pointer to raw data, which may not be null-terminated. When this data needs to be interpreted as a string, an explicit null termination needs to be added before using the value. Change-Id: Id110f9b215b22786da5782adec9449ce38d0d563 updates: bz#1193929 Signed-off-by: Xavi Hernandez <xhernandez@redhat.com>
Diffstat (limited to 'xlators/mount/fuse/src/fuse-bridge.c')
-rw-r--r--xlators/mount/fuse/src/fuse-bridge.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c
index c3945d7a13c..3479d40ceeb 100644
--- a/xlators/mount/fuse/src/fuse-bridge.c
+++ b/xlators/mount/fuse/src/fuse-bridge.c
@@ -3989,7 +3989,7 @@ fuse_setxattr(xlator_t *this, fuse_in_header_t *finh, void *msg,
/* Check if the command is for changing the log
level of process or specific xlator */
- ret = is_gf_log_command(this, name, value);
+ ret = is_gf_log_command(this, name, value, fsi->size);
if (ret >= 0) {
op_errno = ret;
goto done;
@@ -4034,11 +4034,23 @@ fuse_setxattr(xlator_t *this, fuse_in_header_t *finh, void *msg,
* fixups to make sure that's the case. To avoid nasty
* surprises, allocate an extra byte and add a NUL here.
*/
- dict_value = memdup(value, fsi->size + 1);
+ dict_value = GF_MALLOC(fsi->size + 1, gf_common_mt_char);
+ if (dict_value == NULL) {
+ gf_log("glusterfs-fuse", GF_LOG_ERROR,
+ "%" PRIu64 ": SETXATTR value allocation failed",
+ finh->unique);
+ op_errno = ENOMEM;
+ goto done;
+ }
+ memcpy(dict_value, value, fsi->size);
dict_value[fsi->size] = '\0';
}
- dict_set(state->xattr, newkey,
- data_from_dynptr((void *)dict_value, fsi->size));
+ ret = dict_set_dynptr(state->xattr, newkey, dict_value, fsi->size);
+ if (ret < 0) {
+ op_errno = -ret;
+ GF_FREE(dict_value);
+ goto done;
+ }
state->flags = fsi->flags;
state->name = newkey;