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