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/5768
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Raghavendra Talur <rtalur@redhat.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
This commit is contained in:
Anand Avati 2013-09-03 16:01:41 -07:00 committed by Vijay Bellur
parent 4b317e64ca
commit 2a1f445d30
2 changed files with 13 additions and 1 deletions

View File

@ -14,6 +14,8 @@
#include "xlator.h"
#define GLFS_SYMLINK_MAX_FOLLOW 2048
struct glfs;
typedef int (*glfs_init_cbk) (struct glfs *fs, int ret);

View File

@ -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);