]> git.sven.stormbind.net Git - sven/fuse-exfat.git/commitdiff
Add the fix for https://github.com/relan/exfat/issues/6 found and reported by The...
authorSven Hoexter <sven@stormbind.net>
Thu, 5 Nov 2015 19:01:15 +0000 (20:01 +0100)
committerSven Hoexter <sven@stormbind.net>
Thu, 5 Nov 2015 19:01:15 +0000 (20:01 +0100)
debian/changelog
libexfat/mount.c

index b3b2ddef38c4dc2906e9270742dff40f669cacfc..593b703589f6435953709ee17545b98d06bdd57d 100644 (file)
@@ -2,6 +2,8 @@ fuse-exfat (1.1.0-2+deb8u1) UNRELEASED; urgency=medium
 
   * Add the fix for https://github.com/relan/exfat/issues/5 found
     and reported by The Fuzzing Project. Check sector and cluster size.
+  * Add the fix for https://github.com/relan/exfat/issues/6 found
+    and reported by The Fuzzing Project. Detect infinite loop. 
 
  --
 
index 2456187975ace01378270ad6722d08c351743923..9a29cbecb0a78f02efbe06fc8d642b2d954dbb0d 100644 (file)
 
 static uint64_t rootdir_size(const struct exfat* ef)
 {
-       uint64_t clusters = 0;
+       uint32_t clusters = 0;
+       uint32_t clusters_max = le32_to_cpu(ef->sb->cluster_count);
        cluster_t rootdir_cluster = le32_to_cpu(ef->sb->rootdir_cluster);
 
-       while (!CLUSTER_INVALID(rootdir_cluster))
+       /* Iterate all clusters of the root directory to calculate its size.
+          It can't be contiguous because there is no flag to indicate this. */
+       do
        {
-               clusters++;
-               /* root directory cannot be contiguous because there is no flag
-                  to indicate this */
+               if (clusters == clusters_max) /* infinite loop detected */
+               {
+                       exfat_error("root directory cannot occupy all %d clusters",
+                                       clusters);
+                       return 0;
+               }
+               if (CLUSTER_INVALID(rootdir_cluster))
+               {
+                       exfat_error("bad cluster %#x while reading root directory",
+                                       rootdir_cluster);
+                       return 0;
+               }
                rootdir_cluster = exfat_next_cluster(ef, ef->root, rootdir_cluster);
+               clusters++;
        }
-       if (rootdir_cluster != EXFAT_CLUSTER_END)
-       {
-               exfat_error("bad cluster %#x while reading root directory",
-                               rootdir_cluster);
-               return 0;
-       }
-       return clusters * CLUSTER_SIZE(*ef->sb);
+       while (rootdir_cluster != EXFAT_CLUSTER_END);
+
+       return (uint64_t) clusters * CLUSTER_SIZE(*ef->sb);
 }
 
 static const char* get_option(const char* options, const char* option_name)