ChangeLog, pass1.c, pass2.c, problem.c, problem.h:
  pass1.c (mark_inode_bad): Replace alloc_bad_map with a function which
  	sets the bit in the bad inode bitmap.
  	(e2fsck_pass1): Check for fast symlinks with an invalid size, and set
  	the bad inode map in that case.
  pass2.c (e2fsck_process_bad_inode): Check for fast symlinks with an
  	invalid size and prompt the user if the inode should be cleared.
  problem.h, problem.c (PR_2_SYMLINK_SIZE): Added new problem code.

diff --git a/e2fsck/pass2.c b/e2fsck/pass2.c
index ca41272..13b398e 100644
--- a/e2fsck/pass2.c
+++ b/e2fsck/pass2.c
@@ -680,22 +680,22 @@
 	    !LINUX_S_ISLNK(inode.i_mode) && !LINUX_S_ISFIFO(inode.i_mode) &&
 	    !(LINUX_S_ISSOCK(inode.i_mode)))
 		problem = PR_2_BAD_MODE;
-
-	if (LINUX_S_ISCHR(inode.i_mode)
-	    && !e2fsck_pass1_check_device_inode(&inode))
+	else if (LINUX_S_ISCHR(inode.i_mode)
+		 && !e2fsck_pass1_check_device_inode(&inode))
 		problem = PR_2_BAD_CHAR_DEV;
-		
-	if (LINUX_S_ISBLK(inode.i_mode)
-	    && !e2fsck_pass1_check_device_inode(&inode))
+	else if (LINUX_S_ISBLK(inode.i_mode)
+		 && !e2fsck_pass1_check_device_inode(&inode))
 		problem = PR_2_BAD_BLOCK_DEV;
-
-	if (LINUX_S_ISFIFO(inode.i_mode)
-	    && !e2fsck_pass1_check_device_inode(&inode))
+	else if (LINUX_S_ISFIFO(inode.i_mode)
+		 && !e2fsck_pass1_check_device_inode(&inode))
 		problem = PR_2_BAD_FIFO;
-		
-	if (LINUX_S_ISSOCK(inode.i_mode)
-	    && !e2fsck_pass1_check_device_inode(&inode))
+	else if (LINUX_S_ISSOCK(inode.i_mode)
+		 && !e2fsck_pass1_check_device_inode(&inode))
 		problem = PR_2_BAD_SOCKET;
+	else if (LINUX_S_ISLNK(inode.i_mode)
+		 && (inode.i_size_high ||
+		     (inode.i_size > EXT2_N_BLOCKS*4)))
+		problem = PR_2_SYMLINK_SIZE;
 
 	if (problem) {
 		if (fix_problem(ctx, problem, &pctx)) {