]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
udf: Avoid excessive partition lengths
authorJan Kara <jack@suse.cz>
Thu, 20 Jun 2024 10:52:17 +0000 (12:52 +0200)
committerJan Kara <jack@suse.cz>
Wed, 26 Jun 2024 10:54:11 +0000 (12:54 +0200)
Avoid mounting filesystems where the partition would overflow the
32-bits used for block number. Also refuse to mount filesystems where
the partition length is so large we cannot safely index bits in a
block bitmap.

Link: https://patch.msgid.link/20240620130403.14731-1-jack@suse.cz
Signed-off-by: Jan Kara <jack@suse.cz>
fs/udf/super.c

index 92d47705390563ab83fc9921d6514878cf61b4fe..3460ecc826d16233bd1a2a8e230b3b76de12a289 100644 (file)
@@ -1111,12 +1111,19 @@ static int udf_fill_partdesc_info(struct super_block *sb,
        struct udf_part_map *map;
        struct udf_sb_info *sbi = UDF_SB(sb);
        struct partitionHeaderDesc *phd;
+       u32 sum;
        int err;
 
        map = &sbi->s_partmaps[p_index];
 
        map->s_partition_len = le32_to_cpu(p->partitionLength); /* blocks */
        map->s_partition_root = le32_to_cpu(p->partitionStartingLocation);
+       if (check_add_overflow(map->s_partition_root, map->s_partition_len,
+                              &sum)) {
+               udf_err(sb, "Partition %d has invalid location %u + %u\n",
+                       p_index, map->s_partition_root, map->s_partition_len);
+               return -EFSCORRUPTED;
+       }
 
        if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_READ_ONLY))
                map->s_partition_flags |= UDF_PART_FLAG_READ_ONLY;
@@ -1172,6 +1179,14 @@ static int udf_fill_partdesc_info(struct super_block *sb,
                bitmap->s_extPosition = le32_to_cpu(
                                phd->unallocSpaceBitmap.extPosition);
                map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_BITMAP;
+               /* Check whether math over bitmap won't overflow. */
+               if (check_add_overflow(map->s_partition_len,
+                                      sizeof(struct spaceBitmapDesc) << 3,
+                                      &sum)) {
+                       udf_err(sb, "Partition %d is too long (%u)\n", p_index,
+                               map->s_partition_len);
+                       return -EFSCORRUPTED;
+               }
                udf_debug("unallocSpaceBitmap (part %d) @ %u\n",
                          p_index, bitmap->s_extPosition);
        }