@@ -127,7 +127,7 @@ static int blk_ioctl_discard(struct block_device *bdev, blk_mode_t mode,
127
127
return - EINVAL ;
128
128
129
129
filemap_invalidate_lock (inode -> i_mapping );
130
- err = truncate_bdev_range (bdev , mode , start , start + len - 1 );
130
+ err = truncate_bdev_range (bdev , mode , start , end - 1 );
131
131
if (err )
132
132
goto fail ;
133
133
@@ -164,7 +164,7 @@ static int blk_ioctl_discard(struct block_device *bdev, blk_mode_t mode,
164
164
static int blk_ioctl_secure_erase (struct block_device * bdev , blk_mode_t mode ,
165
165
void __user * argp )
166
166
{
167
- uint64_t start , len ;
167
+ uint64_t start , len , end ;
168
168
uint64_t range [2 ];
169
169
int err ;
170
170
@@ -179,11 +179,12 @@ static int blk_ioctl_secure_erase(struct block_device *bdev, blk_mode_t mode,
179
179
len = range [1 ];
180
180
if ((start & 511 ) || (len & 511 ))
181
181
return - EINVAL ;
182
- if (start + len > bdev_nr_bytes (bdev ))
182
+ if (check_add_overflow (start , len , & end ) ||
183
+ end > bdev_nr_bytes (bdev ))
183
184
return - EINVAL ;
184
185
185
186
filemap_invalidate_lock (bdev -> bd_inode -> i_mapping );
186
- err = truncate_bdev_range (bdev , mode , start , start + len - 1 );
187
+ err = truncate_bdev_range (bdev , mode , start , end - 1 );
187
188
if (!err )
188
189
err = blkdev_issue_secure_erase (bdev , start >> 9 , len >> 9 ,
189
190
GFP_KERNEL );
0 commit comments