@@ -115,7 +115,7 @@ static int blk_ioctl_discard(struct block_device *bdev, fmode_t mode,
115
115
return - EINVAL ;
116
116
117
117
filemap_invalidate_lock (inode -> i_mapping );
118
- err = truncate_bdev_range (bdev , mode , start , start + len - 1 );
118
+ err = truncate_bdev_range (bdev , mode , start , end - 1 );
119
119
if (err )
120
120
goto fail ;
121
121
err = blkdev_issue_discard (bdev , start >> 9 , len >> 9 , GFP_KERNEL );
@@ -127,7 +127,7 @@ static int blk_ioctl_discard(struct block_device *bdev, fmode_t mode,
127
127
static int blk_ioctl_secure_erase (struct block_device * bdev , fmode_t mode ,
128
128
void __user * argp )
129
129
{
130
- uint64_t start , len ;
130
+ uint64_t start , len , end ;
131
131
uint64_t range [2 ];
132
132
int err ;
133
133
@@ -142,11 +142,12 @@ static int blk_ioctl_secure_erase(struct block_device *bdev, fmode_t mode,
142
142
len = range [1 ];
143
143
if ((start & 511 ) || (len & 511 ))
144
144
return - EINVAL ;
145
- if (start + len > bdev_nr_bytes (bdev ))
145
+ if (check_add_overflow (start , len , & end ) ||
146
+ end > bdev_nr_bytes (bdev ))
146
147
return - EINVAL ;
147
148
148
149
filemap_invalidate_lock (bdev -> bd_inode -> i_mapping );
149
- err = truncate_bdev_range (bdev , mode , start , start + len - 1 );
150
+ err = truncate_bdev_range (bdev , mode , start , end - 1 );
150
151
if (!err )
151
152
err = blkdev_issue_secure_erase (bdev , start >> 9 , len >> 9 ,
152
153
GFP_KERNEL );
0 commit comments