diff --git a/lustre/llite/symlink.c b/lustre/llite/symlink.c index 5b2fe077ecfe4abfe1267f96eca039d98d3caf7e..918e2e9b5bc00baa046075b5fc2b811b0a31e4c7 100644 --- a/lustre/llite/symlink.c +++ b/lustre/llite/symlink.c @@ -165,10 +165,22 @@ static LL_FOLLOW_LINK_RETURN_TYPE ll_follow_link(struct dentry *dentry, #endif CDEBUG(D_VFSTRACE, "VFS Op\n"); +#if THREAD_SIZE < 8192 + /* + * We set the limits recursive symlink to 5 + * instead of default 8 when kernel has 4k stack + * to prevent stack overflow. + */ + if (current->link_count >= 5) { + rc = -ELOOP; + GOTO(out_release, rc); + } +#endif down(&lli->lli_size_sem); rc = ll_readlink_internal(inode, &request, &symname); up(&lli->lli_size_sem); if (rc) { +out_release: path_release(nd); /* Kernel assumes that ->follow_link() releases nameidata on error */ GOTO(out, rc);