X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/Ventoy.git/blobdiff_plain/05a1b863a66bf72b26e5d87570c4e0e61b9736cd..84c500666addc8378fb03c3844bf6d25faf54a87:/GRUB2/grub-2.04/grub-core/fs/fat.c diff --git a/GRUB2/grub-2.04/grub-core/fs/fat.c b/GRUB2/grub-2.04/grub-core/fs/fat.c index 2b26a8c..439ec41 100644 --- a/GRUB2/grub-2.04/grub-core/fs/fat.c +++ b/GRUB2/grub-2.04/grub-core/fs/fat.c @@ -558,7 +558,7 @@ grub_fat_read_data (grub_disk_t disk, grub_fshelp_node_t node, 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); @@ -964,6 +964,10 @@ grub_fat_dir (grub_device_t device, const char *path, grub_fs_dir_hook_t hook, 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; @@ -1270,54 +1274,6 @@ GRUB_MOD_FINI(fat) #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; @@ -1409,7 +1365,7 @@ int grub_fat_get_file_chunk(grub_uint64_t part_start, grub_file_t file, ventoy_i 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; @@ -1427,7 +1383,7 @@ int grub_fat_get_file_chunk(grub_uint64_t part_start, grub_file_t file, ventoy_i 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++; @@ -1445,4 +1401,3 @@ END: } #endif -