1818#include "udfdecl.h"
1919
2020#include <linux/bitops.h>
21+ #include <linux/overflow.h>
2122
2223#include "udf_i.h"
2324#include "udf_sb.h"
@@ -64,14 +65,18 @@ static int read_block_bitmap(struct super_block *sb,
6465 }
6566
6667 for (i = 0 ; i < count ; i ++ )
67- if (udf_test_bit (i + off , bh -> b_data ))
68+ if (udf_test_bit (i + off , bh -> b_data )) {
69+ bitmap -> s_block_bitmap [bitmap_nr ] =
70+ ERR_PTR (- EFSCORRUPTED );
71+ brelse (bh );
6872 return - EFSCORRUPTED ;
73+ }
6974 return 0 ;
7075}
7176
72- static int __load_block_bitmap (struct super_block * sb ,
73- struct udf_bitmap * bitmap ,
74- unsigned int block_group )
77+ static int load_block_bitmap (struct super_block * sb ,
78+ struct udf_bitmap * bitmap ,
79+ unsigned int block_group )
7580{
7681 int retval = 0 ;
7782 int nr_groups = bitmap -> s_nr_groups ;
@@ -81,8 +86,15 @@ static int __load_block_bitmap(struct super_block *sb,
8186 block_group , nr_groups );
8287 }
8388
84- if (bitmap -> s_block_bitmap [block_group ])
89+ if (bitmap -> s_block_bitmap [block_group ]) {
90+ /*
91+ * The bitmap failed verification in the past. No point in
92+ * trying again.
93+ */
94+ if (IS_ERR (bitmap -> s_block_bitmap [block_group ]))
95+ return PTR_ERR (bitmap -> s_block_bitmap [block_group ]);
8596 return block_group ;
97+ }
8698
8799 retval = read_block_bitmap (sb , bitmap , block_group , block_group );
88100 if (retval < 0 )
@@ -91,23 +103,6 @@ static int __load_block_bitmap(struct super_block *sb,
91103 return block_group ;
92104}
93105
94- static inline int load_block_bitmap (struct super_block * sb ,
95- struct udf_bitmap * bitmap ,
96- unsigned int block_group )
97- {
98- int slot ;
99-
100- slot = __load_block_bitmap (sb , bitmap , block_group );
101-
102- if (slot < 0 )
103- return slot ;
104-
105- if (!bitmap -> s_block_bitmap [slot ])
106- return - EIO ;
107-
108- return slot ;
109- }
110-
111106static void udf_add_free_space (struct super_block * sb , u16 partition , u32 cnt )
112107{
113108 struct udf_sb_info * sbi = UDF_SB (sb );
@@ -129,7 +124,6 @@ static void udf_bitmap_free_blocks(struct super_block *sb,
129124{
130125 struct udf_sb_info * sbi = UDF_SB (sb );
131126 struct buffer_head * bh = NULL ;
132- struct udf_part_map * partmap ;
133127 unsigned long block ;
134128 unsigned long block_group ;
135129 unsigned long bit ;
@@ -138,19 +132,9 @@ static void udf_bitmap_free_blocks(struct super_block *sb,
138132 unsigned long overflow ;
139133
140134 mutex_lock (& sbi -> s_alloc_mutex );
141- partmap = & sbi -> s_partmaps [bloc -> partitionReferenceNum ];
142- if (bloc -> logicalBlockNum + count < count ||
143- (bloc -> logicalBlockNum + count ) > partmap -> s_partition_len ) {
144- udf_debug ("%u < %d || %u + %u > %u\n" ,
145- bloc -> logicalBlockNum , 0 ,
146- bloc -> logicalBlockNum , count ,
147- partmap -> s_partition_len );
148- goto error_return ;
149- }
150-
135+ /* We make sure this cannot overflow when mounting the filesystem */
151136 block = bloc -> logicalBlockNum + offset +
152137 (sizeof (struct spaceBitmapDesc ) << 3 );
153-
154138 do {
155139 overflow = 0 ;
156140 block_group = block >> (sb -> s_blocksize_bits + 3 );
@@ -380,7 +364,6 @@ static void udf_table_free_blocks(struct super_block *sb,
380364 uint32_t count )
381365{
382366 struct udf_sb_info * sbi = UDF_SB (sb );
383- struct udf_part_map * partmap ;
384367 uint32_t start , end ;
385368 uint32_t elen ;
386369 struct kernel_lb_addr eloc ;
@@ -389,16 +372,6 @@ static void udf_table_free_blocks(struct super_block *sb,
389372 struct udf_inode_info * iinfo ;
390373
391374 mutex_lock (& sbi -> s_alloc_mutex );
392- partmap = & sbi -> s_partmaps [bloc -> partitionReferenceNum ];
393- if (bloc -> logicalBlockNum + count < count ||
394- (bloc -> logicalBlockNum + count ) > partmap -> s_partition_len ) {
395- udf_debug ("%u < %d || %u + %u > %u\n" ,
396- bloc -> logicalBlockNum , 0 ,
397- bloc -> logicalBlockNum , count ,
398- partmap -> s_partition_len );
399- goto error_return ;
400- }
401-
402375 iinfo = UDF_I (table );
403376 udf_add_free_space (sb , sbi -> s_partition , count );
404377
@@ -673,6 +646,17 @@ void udf_free_blocks(struct super_block *sb, struct inode *inode,
673646{
674647 uint16_t partition = bloc -> partitionReferenceNum ;
675648 struct udf_part_map * map = & UDF_SB (sb )-> s_partmaps [partition ];
649+ uint32_t blk ;
650+
651+ if (check_add_overflow (bloc -> logicalBlockNum , offset , & blk ) ||
652+ check_add_overflow (blk , count , & blk ) ||
653+ bloc -> logicalBlockNum + count > map -> s_partition_len ) {
654+ udf_debug ("Invalid request to free blocks: (%d, %u), off %u, "
655+ "len %u, partition len %u\n" ,
656+ partition , bloc -> logicalBlockNum , offset , count ,
657+ map -> s_partition_len );
658+ return ;
659+ }
676660
677661 if (map -> s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP ) {
678662 udf_bitmap_free_blocks (sb , map -> s_uspace .s_bitmap ,
0 commit comments