fs: Remove mathematically impossible overflow checks
diff --git a/common/fs/fat32.s2.c b/common/fs/fat32.s2.c
index b0a9eb4f..60c24ed9 100644
--- a/common/fs/fat32.s2.c
+++ b/common/fs/fat32.s2.c
@@ -157,26 +157,12 @@ bytes_per_sector_valid:;
// The following mess to identify the FAT type is from the FAT spec
// at paragraph 3.5
- uint64_t root_dir_bytes;
- if (__builtin_mul_overflow((uint64_t)bpb.root_entries_count, 32ULL, &root_dir_bytes)) {
- return 1;
- }
- size_t root_dir_sects = (root_dir_bytes + (bpb.bytes_per_sector - 1)) / bpb.bytes_per_sector;
+ size_t root_dir_sects = ((bpb.root_entries_count * 32) + (bpb.bytes_per_sector - 1)) / bpb.bytes_per_sector;
// Calculate total sectors and metadata sectors separately to check for underflow
uint64_t total_sects = bpb.sectors_count_16 ? bpb.sectors_count_16 : bpb.sectors_count_32;
uint64_t sectors_per_fat = bpb.sectors_per_fat_16 ? bpb.sectors_per_fat_16 : bpb.sectors_per_fat_32;
- uint64_t fat_total_sects;
- if (__builtin_mul_overflow((uint64_t)bpb.fats_count, sectors_per_fat, &fat_total_sects)) {
- return 1;
- }
- uint64_t metadata_sects;
- if (__builtin_add_overflow((uint64_t)bpb.reserved_sectors, fat_total_sects, &metadata_sects)) {
- return 1;
- }
- if (__builtin_add_overflow(metadata_sects, root_dir_sects, &metadata_sects)) {
- return 1;
- }
+ uint64_t metadata_sects = (uint64_t)bpb.reserved_sectors + ((uint64_t)bpb.fats_count * sectors_per_fat) + root_dir_sects;
// Check for underflow before subtraction
if (metadata_sects >= total_sects) {
@@ -208,14 +194,7 @@ bytes_per_sector_valid:;
context->root_entries = bpb.root_entries_count;
// Calculate root_start with overflow check
- uint64_t fat_sectors_64;
- if (__builtin_mul_overflow((uint64_t)context->number_of_fats, (uint64_t)context->sectors_per_fat, &fat_sectors_64)) {
- return 1;
- }
- uint64_t root_start_64;
- if (__builtin_add_overflow((uint64_t)context->reserved_sectors, fat_sectors_64, &root_start_64)) {
- return 1;
- }
+ uint64_t root_start_64 = (uint64_t)context->reserved_sectors + (uint64_t)context->number_of_fats * context->sectors_per_fat;
if (root_start_64 > UINT32_MAX) {
return 1; // Overflow in root_start calculation
}
@@ -265,14 +244,8 @@ bytes_per_sector_valid:;
}
static int read_cluster_from_map(struct fat32_context *context, uint32_t cluster, uint32_t *out) {
- uint64_t fat_base;
- if (__builtin_mul_overflow((uint64_t)context->fat_start_lba, (uint64_t)context->bytes_per_sector, &fat_base)) {
- return -1;
- }
- uint64_t fat_size;
- if (__builtin_mul_overflow((uint64_t)context->sectors_per_fat, (uint64_t)context->bytes_per_sector, &fat_size)) {
- return -1;
- }
+ uint64_t fat_base = (uint64_t)context->fat_start_lba * context->bytes_per_sector;
+ uint64_t fat_size = (uint64_t)context->sectors_per_fat * context->bytes_per_sector;
switch (context->type) {
case 12: {
@@ -378,10 +351,7 @@ static bool read_cluster_chain(struct fat32_context *context,
uint32_t *cluster_chain,
size_t chain_len,
void *buf, uint64_t loc, uint64_t count) {
- uint64_t block_size;
- if (__builtin_mul_overflow((uint64_t)context->sectors_per_cluster, (uint64_t)context->bytes_per_sector, &block_size)) {
- return false;
- }
+ uint64_t block_size = (uint64_t)context->sectors_per_cluster * (uint64_t)context->bytes_per_sector;
for (uint64_t progress = 0; progress < count;) {
uint64_t block = (loc + progress) / block_size;
@@ -401,19 +371,7 @@ static bool read_cluster_chain(struct fat32_context *context,
if (chunk > block_size - offset)
chunk = block_size - offset;
- // Calculate base offset with overflow checks
- uint64_t cluster_offset;
- if (__builtin_mul_overflow((uint64_t)(cluster - 2), (uint64_t)context->sectors_per_cluster, &cluster_offset)) {
- return false;
- }
- uint64_t sector_offset;
- if (__builtin_add_overflow((uint64_t)context->data_start_lba, cluster_offset, §or_offset)) {
- return false;
- }
- uint64_t base;
- if (__builtin_mul_overflow(sector_offset, (uint64_t)context->bytes_per_sector, &base)) {
- return false;
- }
+ uint64_t base = ((uint64_t)context->data_start_lba + (uint64_t)(cluster - 2) * context->sectors_per_cluster) * context->bytes_per_sector;
if (!volume_read(context->part, buf + progress, base + offset, chunk)) {
return false;
}
@@ -465,10 +423,7 @@ static bool fat32_filename_to_8_3(char *dest, const char *src) {
}
static int fat32_open_in(struct fat32_context* context, struct fat32_directory_entry* directory, struct fat32_directory_entry* file, const char* name) {
- size_t block_size;
- if (__builtin_mul_overflow((size_t)context->sectors_per_cluster, (size_t)context->bytes_per_sector, &block_size)) {
- return -1;
- }
+ size_t block_size = context->sectors_per_cluster * context->bytes_per_sector;
char current_lfn[FAT32_LFN_MAX_FILENAME_LENGTH] = {0};
size_t dir_chain_len;
@@ -512,12 +467,7 @@ static int fat32_open_in(struct fat32_context* context, struct fat32_directory_e
directory_entries = ext_mem_alloc(alloc_size);
- uint64_t root_offset;
- if (__builtin_mul_overflow((uint64_t)context->root_start, (uint64_t)context->bytes_per_sector, &root_offset)) {
- pmm_free(directory_entries, alloc_size);
- return -1;
- }
- if (!volume_read(context->part, directory_entries, root_offset, context->root_entries * sizeof(struct fat32_directory_entry))) {
+ if (!volume_read(context->part, directory_entries, (uint64_t)context->root_start * context->bytes_per_sector, context->root_entries * sizeof(struct fat32_directory_entry))) {
pmm_free(directory_entries, alloc_size);
return -1;
}
diff --git a/common/fs/iso9660.s2.c b/common/fs/iso9660.s2.c
index 3e8f22c7..56196b93 100644
--- a/common/fs/iso9660.s2.c
+++ b/common/fs/iso9660.s2.c
@@ -115,10 +115,7 @@ static void iso9660_find_PVD(struct iso9660_primary_volume *desc, struct volume
uint32_t max_lba = ISO9660_FIRST_VOLUME_DESCRIPTOR + ISO9660_MAX_VOLUME_DESCRIPTORS;
while (lba < max_lba) {
- uint64_t offset;
- if (__builtin_mul_overflow((uint64_t)lba, (uint64_t)ISO9660_SECTOR_SIZE, &offset)) {
- panic(false, "ISO9660: volume descriptor offset overflow");
- }
+ uint64_t offset = (uint64_t)lba * ISO9660_SECTOR_SIZE;
if (!volume_read(vol, desc, offset, sizeof(struct iso9660_primary_volume))) {
panic(false, "ISO9660: failed to read volume descriptor");
}
@@ -151,10 +148,7 @@ static void iso9660_cache_root(struct volume *vol,
}
*root = ext_mem_alloc(*root_size);
- uint64_t offset;
- if (__builtin_mul_overflow((uint64_t)pv.root.extent.little, (uint64_t)ISO9660_SECTOR_SIZE, &offset)) {
- panic(false, "ISO9660: root extent offset overflow");
- }
+ uint64_t offset = (uint64_t)pv.root.extent.little * ISO9660_SECTOR_SIZE;
if (!volume_read(vol, *root, offset, *root_size)) {
panic(false, "ISO9660: failed to read root directory");
}
@@ -488,12 +482,7 @@ struct file_handle *iso9660_open(struct volume *vol, const char *path) {
first = false;
- uint64_t dir_offset;
- if (__builtin_mul_overflow((uint64_t)next_sector, (uint64_t)ISO9660_SECTOR_SIZE, &dir_offset)) {
- pmm_free(current, current_size);
- pmm_free(ret, sizeof(struct iso9660_file_handle));
- return NULL;
- }
+ uint64_t dir_offset = (uint64_t)next_sector * ISO9660_SECTOR_SIZE;
if (!volume_read(vol, current, dir_offset, current_size)) {
pmm_free(current, current_size);
pmm_free(ret, sizeof(struct iso9660_file_handle));
@@ -543,14 +532,7 @@ static void iso9660_read(struct file_handle *file, void *buf, uint64_t loc, uint
uint64_t bytes_available = extent_size - offset_in_extent;
uint64_t to_read = (count < bytes_available) ? count : bytes_available;
- uint64_t base_offset;
- if (__builtin_mul_overflow((uint64_t)f->extents[i].LBA, (uint64_t)ISO9660_SECTOR_SIZE, &base_offset)) {
- panic(false, "iso9660: offset calculation overflow");
- }
- uint64_t disk_offset;
- if (__builtin_add_overflow(base_offset, offset_in_extent, &disk_offset)) {
- panic(false, "iso9660: offset calculation overflow");
- }
+ uint64_t disk_offset = (uint64_t)f->extents[i].LBA * ISO9660_SECTOR_SIZE + offset_in_extent;
if (!volume_read(f->context->vol, buf, disk_offset, to_read)) {
panic(false, "iso9660: failed to read file data");
