diff options
Diffstat (limited to 'api/src')
-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); |