@@ -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