if (next_cluster >= node->data->cluster_eof_mark)
return ret;
- if (next_cluster < 2 || next_cluster >= node->data->num_clusters)
+ if (next_cluster < 2 || (next_cluster - 2) >= node->data->num_clusters)
{
grub_error (GRUB_ERR_BAD_FS, "invalid cluster %u",
next_cluster);
info.dir = !! (ctxt.dir.attr & GRUB_FAT_ATTR_DIRECTORY);
info.case_insensitive = 1;
+
+ if (!info.dir)
+ info.size = ctxt.dir.file_size;
+
#ifdef MODE_EXFAT
if (!ctxt.dir.have_stream)
continue;
#ifdef MODE_EXFAT
-static int grub_fat_add_chunk(ventoy_img_chunk_list *chunk_list, grub_uint64_t sector, grub_uint64_t size, grub_uint32_t log_sector_size)
-{
- ventoy_img_chunk *last_chunk;
- ventoy_img_chunk *new_chunk;
-
- if (chunk_list->cur_chunk == 0)
- {
- chunk_list->chunk[0].img_start_sector = 0;
- chunk_list->chunk[0].img_end_sector = (size >> 11) - 1;
- chunk_list->chunk[0].disk_start_sector = sector;
- chunk_list->chunk[0].disk_end_sector = sector + (size >> log_sector_size) - 1;
- chunk_list->cur_chunk = 1;
- return 0;
- }
-
- last_chunk = chunk_list->chunk + chunk_list->cur_chunk - 1;
- if (last_chunk->disk_end_sector + 1 == sector)
- {
- last_chunk->img_end_sector += (size >> 11);
- last_chunk->disk_end_sector += (size >> log_sector_size);
- return 0;
- }
-
- if (chunk_list->cur_chunk == chunk_list->max_chunk)
- {
- new_chunk = grub_realloc(chunk_list->chunk, chunk_list->max_chunk * 2 * sizeof(ventoy_img_chunk));
- if (NULL == new_chunk)
- {
- return -1;
- }
- chunk_list->chunk = new_chunk;
- chunk_list->max_chunk *= 2;
-
- /* issue: update last_chunk */
- last_chunk = chunk_list->chunk + chunk_list->cur_chunk - 1;
- }
-
- new_chunk = chunk_list->chunk + chunk_list->cur_chunk;
- new_chunk->img_start_sector = last_chunk->img_end_sector + 1;
- new_chunk->img_end_sector = new_chunk->img_start_sector + (size >> 11) - 1;
- new_chunk->disk_start_sector = sector;
- new_chunk->disk_end_sector = sector + (size >> log_sector_size) - 1;
-
- chunk_list->cur_chunk++;
-
- return 0;
-}
-
int grub_fat_get_file_chunk(grub_uint64_t part_start, grub_file_t file, ventoy_img_chunk_list *chunk_list)
{
grub_size_t size;
return 0;
}
- if (next_cluster < 2 || next_cluster >= node->data->num_clusters)
+ if (next_cluster < 2 || (next_cluster - 2) >= node->data->num_clusters)
{
grub_error (GRUB_ERR_BAD_FS, "invalid cluster %u", next_cluster);
return -1;
if (size > len)
size = len;
- grub_fat_add_chunk(chunk_list, sector, size, disk->log_sector_size);
+ grub_disk_blocklist_read(chunk_list, sector, size, disk->log_sector_size);
len -= size;
logical_cluster++;
}
#endif
-