Skip to content

Commit 13bc62d

Browse files
mauelshasnitm
authored andcommitted
dm raid: fix parse_raid_params() variable range issue
parse_raid_params() compares variable "int value" with INT_MAX. E.g. related Coverity report excerpt: CID 1364818 (#2 of 3): Operands don't affect result (CONSTANT_EXPRESSION_RESULT) [select issue] 1433 if (value > INT_MAX) { Fix by changing checks to avoid INT_MAX. Whilst on it, avoid unnecessary checks against constants and add check for sane recovery speed min/max. Signed-off-by: Heinz Mauelshagen <[email protected]> Signed-off-by: Mike Snitzer <[email protected]>
1 parent d4b1aaf commit 13bc62d

File tree

1 file changed

+19
-8
lines changed

1 file changed

+19
-8
lines changed

drivers/md/dm-raid.c

+19-8
Original file line numberDiff line numberDiff line change
@@ -1370,19 +1370,18 @@ static int parse_raid_params(struct raid_set *rs, struct dm_arg_set *as,
13701370
* In device-mapper, we specify things in sectors, but
13711371
* MD records this value in kB
13721372
*/
1373-
value /= 2;
1374-
if (value > COUNTER_MAX) {
1373+
if (value < 0 || value / 2 > COUNTER_MAX) {
13751374
rs->ti->error = "Max write-behind limit out of range";
13761375
return -EINVAL;
13771376
}
13781377

1379-
rs->md.bitmap_info.max_write_behind = value;
1378+
rs->md.bitmap_info.max_write_behind = value / 2;
13801379
} else if (!strcasecmp(key, dm_raid_arg_name_by_flag(CTR_FLAG_DAEMON_SLEEP))) {
13811380
if (test_and_set_bit(__CTR_FLAG_DAEMON_SLEEP, &rs->ctr_flags)) {
13821381
rs->ti->error = "Only one daemon_sleep argument pair allowed";
13831382
return -EINVAL;
13841383
}
1385-
if (!value || (value > MAX_SCHEDULE_TIMEOUT)) {
1384+
if (value < 0) {
13861385
rs->ti->error = "daemon sleep period out of range";
13871386
return -EINVAL;
13881387
}
@@ -1424,27 +1423,33 @@ static int parse_raid_params(struct raid_set *rs, struct dm_arg_set *as,
14241423
return -EINVAL;
14251424
}
14261425

1426+
if (value < 0) {
1427+
rs->ti->error = "Bogus stripe cache entries value";
1428+
return -EINVAL;
1429+
}
14271430
rs->stripe_cache_entries = value;
14281431
} else if (!strcasecmp(key, dm_raid_arg_name_by_flag(CTR_FLAG_MIN_RECOVERY_RATE))) {
14291432
if (test_and_set_bit(__CTR_FLAG_MIN_RECOVERY_RATE, &rs->ctr_flags)) {
14301433
rs->ti->error = "Only one min_recovery_rate argument pair allowed";
14311434
return -EINVAL;
14321435
}
1433-
if (value > INT_MAX) {
1436+
1437+
if (value < 0) {
14341438
rs->ti->error = "min_recovery_rate out of range";
14351439
return -EINVAL;
14361440
}
1437-
rs->md.sync_speed_min = (int)value;
1441+
rs->md.sync_speed_min = value;
14381442
} else if (!strcasecmp(key, dm_raid_arg_name_by_flag(CTR_FLAG_MAX_RECOVERY_RATE))) {
14391443
if (test_and_set_bit(__CTR_FLAG_MAX_RECOVERY_RATE, &rs->ctr_flags)) {
14401444
rs->ti->error = "Only one max_recovery_rate argument pair allowed";
14411445
return -EINVAL;
14421446
}
1443-
if (value > INT_MAX) {
1447+
1448+
if (value < 0) {
14441449
rs->ti->error = "max_recovery_rate out of range";
14451450
return -EINVAL;
14461451
}
1447-
rs->md.sync_speed_max = (int)value;
1452+
rs->md.sync_speed_max = value;
14481453
} else if (!strcasecmp(key, dm_raid_arg_name_by_flag(CTR_FLAG_REGION_SIZE))) {
14491454
if (test_and_set_bit(__CTR_FLAG_REGION_SIZE, &rs->ctr_flags)) {
14501455
rs->ti->error = "Only one region_size argument pair allowed";
@@ -1490,6 +1495,12 @@ static int parse_raid_params(struct raid_set *rs, struct dm_arg_set *as,
14901495
return -EINVAL;
14911496
}
14921497

1498+
if (rs->md.sync_speed_max &&
1499+
rs->md.sync_speed_min > rs->md.sync_speed_max) {
1500+
rs->ti->error = "Bogus recovery rates";
1501+
return -EINVAL;
1502+
}
1503+
14931504
if (validate_region_size(rs, region_size))
14941505
return -EINVAL;
14951506

0 commit comments

Comments
 (0)