diff options
author | Milind Changire <mchangir@redhat.com> | 2015-09-22 18:30:22 +0530 |
---|---|---|
committer | Niels de Vos <ndevos@redhat.com> | 2015-11-09 04:07:54 -0800 |
commit | 8356e4281c2953a7f35bf0b4bce194b0c678b6a5 (patch) | |
tree | 9383541b3d2a3c8117dd91be0edb4d81f17b790f /api | |
parent | 9380b1d1fb74cd73d306a1a501e4b7b982c1a76e (diff) |
gfapi: xattr key length check to avoid brick crash
Added check to test if xattr key length > max allowed for OS
distribution and return:
EINVAL if xattr name pointer is NULL or 0 length
ENAMETOOLONG if xattr name length > max allowed for distribution
Function exit path for invalid input is via label "out:" for
mandatory __GLFS_EXIT_FS.
Typically the VFS does this in the kernel for us. But since we are
bypassing the VFS by providing the libgfapi to talk directly to the
brick process, we need to add such checks.
Change-Id: I610a8440871200ae4640351902b752777a3ec0c2
BUG: 1272926
Signed-off-by: Milind Changire <mchangir@redhat.com>
Reviewed-on: http://review.gluster.org/12207
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Niels de Vos <ndevos@redhat.com>
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
(cherry picked from commit 47d8d2fc9c88c95dfcae2c5c06e6eb3b1ce03a92)
Reviewed-on: http://review.gluster.org/12387
Reviewed-by: Kaleb KEITHLEY <kkeithle@redhat.com>
Diffstat (limited to 'api')
-rw-r--r-- | api/src/glfs-fops.c | 50 | ||||
-rw-r--r-- | api/src/glfs-handleops.c | 20 |
2 files changed, 70 insertions, 0 deletions
diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c index f17d7212d39..dd9becea3a4 100644 --- a/api/src/glfs-fops.c +++ b/api/src/glfs-fops.c @@ -2846,12 +2846,25 @@ glfs_getxattr_common (struct glfs *fs, const char *path, const char *name, DECLARE_OLD_THIS; __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs); + if (!name || *name == '\0') { + ret = -1; + errno = EINVAL; + goto out; + } + + if (strlen(name) > GF_XATTR_NAME_MAX) { + ret = -1; + errno = ENAMETOOLONG; + goto out; + } + subvol = glfs_active_subvol (fs); if (!subvol) { ret = -1; errno = EIO; goto out; } + retry: if (follow) ret = glfs_resolve (fs, subvol, path, &loc, &iatt, reval); @@ -2916,6 +2929,18 @@ pub_glfs_fgetxattr (struct glfs_fd *glfd, const char *name, void *value, DECLARE_OLD_THIS; __GLFS_ENTRY_VALIDATE_FD (glfd, invalid_fs); + if (!name || *name == '\0') { + ret = -1; + errno = EINVAL; + goto out; + } + + if (strlen(name) > GF_XATTR_NAME_MAX) { + ret = -1; + errno = ENAMETOOLONG; + goto out; + } + subvol = glfs_active_subvol (glfd->fs); if (!subvol) { ret = -1; @@ -3109,12 +3134,25 @@ glfs_setxattr_common (struct glfs *fs, const char *path, const char *name, DECLARE_OLD_THIS; __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs); + if (!name || *name == '\0') { + ret = -1; + errno = EINVAL; + goto out; + } + + if (strlen(name) > GF_XATTR_NAME_MAX) { + ret = -1; + errno = ENAMETOOLONG; + goto out; + } + subvol = glfs_active_subvol (fs); if (!subvol) { ret = -1; errno = EIO; goto out; } + retry: if (follow) ret = glfs_resolve (fs, subvol, path, &loc, &iatt, reval); @@ -3184,6 +3222,18 @@ pub_glfs_fsetxattr (struct glfs_fd *glfd, const char *name, const void *value, DECLARE_OLD_THIS; __GLFS_ENTRY_VALIDATE_FD (glfd, invalid_fs); + if (!name || *name == '\0') { + ret = -1; + errno = EINVAL; + goto out; + } + + if (strlen(name) > GF_XATTR_NAME_MAX) { + ret = -1; + errno = ENAMETOOLONG; + goto out; + } + subvol = glfs_active_subvol (glfd->fs); if (!subvol) { ret = -1; diff --git a/api/src/glfs-handleops.c b/api/src/glfs-handleops.c index 0f201a2b99d..0fe5b35ff11 100644 --- a/api/src/glfs-handleops.c +++ b/api/src/glfs-handleops.c @@ -326,6 +326,16 @@ glfs_h_getxattrs_common (struct glfs *fs, struct glfs_object *object, return -1; } + if (!name || *name == '\0') { + errno = EINVAL; + return -1; + } + + if (strlen(name) > GF_XATTR_NAME_MAX) { + errno = ENAMETOOLONG; + return -1; + } + /* get the active volume */ subvol = glfs_active_subvol (fs); if (!subvol) { @@ -476,6 +486,16 @@ pub_glfs_h_setxattrs (struct glfs *fs, struct glfs_object *object, return -1; } + if (!name || *name == '\0') { + errno = EINVAL; + return -1; + } + + if (strlen(name) > GF_XATTR_NAME_MAX) { + errno = ENAMETOOLONG; + return -1; + } + DECLARE_OLD_THIS; __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs); |