diff options
Diffstat (limited to 'api')
| -rw-r--r-- | api/src/glfs-internal.h | 2 | ||||
| -rw-r--r-- | api/src/glfs-resolve.c | 12 | 
2 files changed, 13 insertions, 1 deletions
diff --git a/api/src/glfs-internal.h b/api/src/glfs-internal.h index 30ff599f2e6..c7fdf75f541 100644 --- a/api/src/glfs-internal.h +++ b/api/src/glfs-internal.h @@ -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); diff --git a/api/src/glfs-resolve.c b/api/src/glfs-resolve.c index ec8890b2dcf..104fc9e48f2 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);  | 
