OSDN Git Service

Fixed clusters allocation: a cluster beyond valid clusters range could be allocated.
authorresver <resver@60bc1c72-a15a-11de-b98f-4500b42dc123>
Mon, 14 Jan 2013 18:54:42 +0000 (18:54 +0000)
committerresver <resver@60bc1c72-a15a-11de-b98f-4500b42dc123>
Mon, 14 Jan 2013 18:54:42 +0000 (18:54 +0000)
git-svn-id: http://exfat.googlecode.com/svn/trunk@331 60bc1c72-a15a-11de-b98f-4500b42dc123

libexfat/cluster.c

index e123eaa..e533a1e 100644 (file)
@@ -106,41 +106,24 @@ cluster_t exfat_advance_cluster(const struct exfat* ef,
        return node->fptr_cluster;
 }
 
        return node->fptr_cluster;
 }
 
-static cluster_t find_bit_and_set(uint8_t* bitmap, cluster_t start,
-               cluster_t end)
+static cluster_t find_bit_and_set(uint8_t* bitmap, size_t start, size_t end)
 {
 {
-       const cluster_t mid_start = (start + 7) / 8 * 8;
-       const cluster_t mid_end = end / 8 * 8;
-       cluster_t c;
-       cluster_t byte;
-
-       for (c = start; c < mid_start; c++)
-               if (BMAP_GET(bitmap, c) == 0)
-               {
-                       BMAP_SET(bitmap, c);
-                       return c + EXFAT_FIRST_DATA_CLUSTER;
-               }
-
-       for (byte = mid_start / 8; byte < mid_end / 8; byte++)
-               if (bitmap[byte] != 0xff)
-               {
-                       cluster_t bit;
-
-                       for (bit = 0; bit < 8; bit++)
-                               if (!(bitmap[byte] & (1u << bit)))
-                               {
-                                       bitmap[byte] |= (1u << bit);
-                                       return byte * 8 + bit + EXFAT_FIRST_DATA_CLUSTER;
-                               }
-               }
-
-       for (c = mid_end; c < end; c++)
-               if (BMAP_GET(bitmap, c) == 0)
-               {
-                       BMAP_SET(bitmap, c);
-                       return c + EXFAT_FIRST_DATA_CLUSTER;
-               }
+       const size_t start_index = start / 8;
+       const size_t end_index = DIV_ROUND_UP(end, 8);
+       size_t i;
+       size_t c;
 
 
+       for (i = start_index; i < end_index; i++)
+       {
+               if (bitmap[i] == 0xff)
+                       continue;
+               for (c = MAX(i * 8, start); c < MIN((i + 1) * 8, end); c++)
+                       if (BMAP_GET(bitmap, c) == 0)
+                       {
+                               BMAP_SET(bitmap, c);
+                               return c + EXFAT_FIRST_DATA_CLUSTER;
+                       }
+       }
        return EXFAT_CLUSTER_END;
 }
 
        return EXFAT_CLUSTER_END;
 }