diff options
author | Atin Mukherjee <amukherj@redhat.com> | 2014-04-08 17:10:25 +0530 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2014-05-03 08:20:06 -0700 |
commit | e73fc9939aecfa9f7955653d02f12243aba02fc6 (patch) | |
tree | f170c95f3b6622aa9fb2937dfef7742ea579a711 /xlators/mgmt/glusterd/src/glusterd-store.c | |
parent | c6f4504c12d35359986a08da222193057946570a (diff) |
glusterd : Volname, brickpath & volfpath length validation
While creating a volume and adding a brick validation for _POSIX_PATH_MAX is
done on absolute pathname instead of relative pathname due to which a brickpath
having less than _POSIX_PATH_MAX may also fail the validation if the directory
length is greater than (_POSIX_PATH_MAX -strlen(brickpath/volume name).
Also this fix addresses one cli response message correction which says the
volume file is too long instead of brick path is too long (when brickpath
length validation doesn't fail and vol file length validation fails.)
It is also important to note that with the current design of volfile naming, it
can not be guranteed that volname and brickpath can have max of _POSIX_PATH_MAX
characters.
Change-Id: I1283d1f9dea96ae797620002c8723719f26a866d
BUG: 1085330
Signed-off-by: Atin Mukherjee <amukherj@redhat.com>
Reviewed-on: http://review.gluster.org/7420
Reviewed-by: Niels de Vos <ndevos@redhat.com>
Reviewed-by: Krishnan Parthasarathi <kparthas@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-store.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.c | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index 0404e110cb5..26de774e3f5 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -134,12 +134,16 @@ glusterd_store_brickinfopath_set (glusterd_volinfo_t *volinfo, gf_boolean_t glusterd_store_is_valid_brickpath (char *volname, char *brick) { - char brickpath[PATH_MAX] = {0}; glusterd_brickinfo_t *brickinfo = NULL; glusterd_volinfo_t *volinfo = NULL; int32_t ret = 0; size_t volname_len = strlen (volname); xlator_t *this = NULL; + int bpath_len = 0; + const char delim[2] = "/"; + char *sub_dir = NULL; + char *saveptr = NULL; + char *brickpath_ptr = NULL; this = THIS; GF_ASSERT (this); @@ -163,10 +167,40 @@ glusterd_store_is_valid_brickpath (char *volname, char *brick) goto out; } memcpy (volinfo->volname, volname, volname_len+1); - glusterd_store_brickinfopath_set (volinfo, brickinfo, brickpath, - sizeof (brickpath)); - ret = (strlen (brickpath) < _POSIX_PATH_MAX); + /* Check whether brickpath is less than PATH_MAX */ + ret = 1; + bpath_len = strlen (brickinfo->path); + + if (brickinfo->path[bpath_len - 1] != '/') { + if (strlen (brickinfo->path) >= PATH_MAX) { + ret = 0; + goto out; + } + } else { + /* Path has a trailing "/" which should not be considered in + * length check validation + */ + if (strlen (brickinfo->path) >= PATH_MAX + 1) { + ret = 0; + goto out; + } + } + + /* The following validation checks whether each sub directories in the + * brick path meets the POSIX max length validation + */ + + brickpath_ptr = brickinfo->path; + sub_dir = strtok_r (brickpath_ptr, delim, &saveptr); + + while (sub_dir != NULL) { + if (strlen(sub_dir) >= _POSIX_PATH_MAX) { + ret = 0; + goto out; + } + sub_dir = strtok_r (NULL, delim, &saveptr); + } out: if (brickinfo) @@ -2564,7 +2598,7 @@ glusterd_store_retrieve_volume (char *volname, glusterd_snap_t *snap) if (ret) goto out; - strncpy (volinfo->volname, volname, GLUSTERD_MAX_VOLUME_NAME); + strncpy (volinfo->volname, volname, GD_VOLUME_NAME_MAX); volinfo->snapshot = snap; if (snap) volinfo->is_snap_volume = _gf_true; |