summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/src/glfs-internal.h2
-rw-r--r--api/src/glfs-resolve.c12
2 files changed, 13 insertions, 1 deletions
diff --git a/api/src/glfs-internal.h b/api/src/glfs-internal.h
index 30ff599f2..c7fdf75f5 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 ec8890b2d..104fc9e48 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);