diff options
author | Anand Avati <avati@redhat.com> | 2013-09-03 16:01:41 -0700 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2013-09-10 01:16:09 -0700 |
commit | 255b0dc5201b012b0e8f02ea665ba08ab0a4a0d1 (patch) | |
tree | b481c70ecd9988381e3bd000ad9ee74d00709e8b /api/src/glfs-resolve.c | |
parent | 49f073ec63d0ede22a390bf1ac33939dd65b6241 (diff) |
gfapi: apply an upper bound on nested symlink resolution
In case of nested symlink resolution, implement an upper
bound on the number of such nested levels the resolver will
descend. This limit is arbitrary, and set to 2048 nested
levels.
Change-Id: I264e5bd60d317eda97f4e6f49bd5d8694f8664a9
BUG: 1004100
Signed-off-by: Anand Avati <avati@redhat.com>
Reviewed-on: http://review.gluster.org/5874
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'api/src/glfs-resolve.c')
-rw-r--r-- | api/src/glfs-resolve.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/api/src/glfs-resolve.c b/api/src/glfs-resolve.c index 1dcaddecd..a6698f8b9 100644 --- a/api/src/glfs-resolve.c +++ b/api/src/glfs-resolve.c @@ -368,6 +368,16 @@ glfs_resolve_at (struct glfs *fs, xlator_t *subvol, inode_t *at, char *lpath = NULL; loc_t sym_loc = {0,}; + if (follow > GLFS_SYMLINK_MAX_FOLLOW) { + errno = ELOOP; + ret = -1; + if (inode) { + inode_unref (inode); + inode = NULL; + } + break; + } + ret = glfs_resolve_symlink (fs, subvol, inode, &lpath); inode_unref (inode); inode = NULL; @@ -383,7 +393,7 @@ glfs_resolve_at (struct glfs *fs, xlator_t *subvol, inode_t *at, /* always recurisvely follow while following symlink */ - 1, reval); + follow + 1, reval); if (ret == 0) inode = inode_ref (sym_loc.inode); loc_wipe (&sym_loc); |