Fix an out of boundary access in fat.c

    From SD Specifications Part2 - File System
    For Next Free Cluster, value FFFFFFFFh indicates that there exists
    no information about the first available (free) cluster. It is a
    valid value. However fat.c doesn't check the value before use it
    as array index. This will cause fsck_msdos coredump with some
    micro sd cards

Change-Id: Ibdec1655399d95c3ca98a4f4aaed1fd9bf459f33
Signed-off-by: Ethan <ethan.too@gmail.com>
diff --git a/fat.c b/fat.c
index 8871407..d07be09 100644
--- a/fat.c
+++ b/fat.c
@@ -692,16 +692,18 @@
 				ret = 1;
 			}
 		}
-		if (boot->NumFree && fat[boot->FSNext].next != CLUST_FREE) {
-			pwarn("Next free cluster in FSInfo block (%u) not free\n",
-			      boot->FSNext);
-			if (ask(1, "Fix"))
-				for (head = CLUST_FIRST; head < boot->NumClusters; head++)
-					if (fat[head].next == CLUST_FREE) {
-						boot->FSNext = head;
-						ret = 1;
-						break;
-					}
+		if (boot->NumFree) {
+			if ((boot->FSNext >= boot->NumClusters) || (fat[boot->FSNext].next != CLUST_FREE)) {
+				pwarn("Next free cluster in FSInfo block (%u) not free\n",
+				      boot->FSNext);
+				if (ask(1, "Fix"))
+					for (head = CLUST_FIRST; head < boot->NumClusters; head++)
+						if (fat[head].next == CLUST_FREE) {
+							boot->FSNext = head;
+							ret = 1;
+							break;
+						}
+			}
 		}
 		if (ret)
 			mod |= writefsinfo(dosfs, boot);