Skip to content

Commit a2504cb

Browse files
committed
[CHG]增强MBR分区表加载的安全性
1 parent c7122a4 commit a2504cb

1 file changed

Lines changed: 34 additions & 0 deletions

File tree

  • components/drivers/block/partitions

components/drivers/block/partitions/dfs.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,21 @@ rt_err_t dfs_partition(struct rt_blk_disk *disk)
3434
return res;
3535
}
3636

37+
/* check MBR signature at offset 0x1FE-0x1FF */
38+
if (sector[0x1FE] != 0x55 || sector[0x1FF] != 0xAA)
39+
{
40+
rt_free(sector);
41+
return -RT_ERROR;
42+
}
43+
44+
/* get disk total capacity */
45+
rt_ssize_t disk_capacity = rt_blk_disk_get_capacity(disk);
46+
if (disk_capacity <= 0)
47+
{
48+
rt_free(sector);
49+
return disk_capacity < 0 ? disk_capacity : -RT_ERROR;
50+
}
51+
3752
for (rt_size_t i = 0; i < disk->max_partitions; ++i)
3853
{
3954
res = dfs_filesystem_get_partition(&part, sector, i);
@@ -43,6 +58,25 @@ rt_err_t dfs_partition(struct rt_blk_disk *disk)
4358
break;
4459
}
4560

61+
/* check if partition start and size are within disk capacity */
62+
off_t part_start = part.offset;
63+
size_t part_size = part.size;
64+
off_t part_end = part_start + (off_t)part_size;
65+
66+
if (part_start >= (off_t)disk_capacity)
67+
{
68+
LOG_W("Partition %d: start sector %ld >= disk capacity %ld, skipped",
69+
i, part_start, disk_capacity);
70+
continue;
71+
}
72+
73+
if (part_size == 0 || part_end > (off_t)disk_capacity)
74+
{
75+
LOG_W("Partition %d: size %lu or end sector %ld > disk capacity %ld, skipped",
76+
i, part_size, part_end, disk_capacity);
77+
continue;
78+
}
79+
4680
if (blk_put_partition(disk, "dfs", part.offset, part.size, i) == -RT_ENOMEM)
4781
{
4882
break;

0 commit comments

Comments
 (0)