diff options
author | Andre Noll <maan@systemlinux.org> | 2008-07-21 00:42:07 -0400 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2008-07-21 00:42:07 -0400 |
commit | d07bd3bcc456228b56a790897162a634691fed9b (patch) | |
tree | cabb0feee45a7b3383fff4202adc35793c8bdbb1 /drivers/md/md.c | |
parent | d7027458d68b2f1752a28016dcf2ffd0a7e8f567 (diff) |
md: Fix check for overlapping devices.
The checks in overlaps() expect all parameters either in block-based
or sector-based quantities. However, its single caller passes two
rdev->data_offset arguments as well as two rdev->size arguments, the
former being sector counts while the latter are measured in 1K blocks.
This could cause rdev_size_store() to accept an invalid size from user
space. Fix it by passing only sector-based quantities to overlaps().
Signed-off-by: Andre Noll <maan@systemlinux.org>
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r-- | drivers/md/md.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 95466bb089ab..a2813fa06b7c 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -2143,8 +2143,9 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
2143 | if (test_bit(AllReserved, &rdev2->flags) || | 2143 | if (test_bit(AllReserved, &rdev2->flags) || |
2144 | (rdev->bdev == rdev2->bdev && | 2144 | (rdev->bdev == rdev2->bdev && |
2145 | rdev != rdev2 && | 2145 | rdev != rdev2 && |
2146 | overlaps(rdev->data_offset, rdev->size, | 2146 | overlaps(rdev->data_offset, rdev->size * 2, |
2147 | rdev2->data_offset, rdev2->size))) { | 2147 | rdev2->data_offset, |
2148 | rdev2->size * 2))) { | ||
2148 | overlap = 1; | 2149 | overlap = 1; |
2149 | break; | 2150 | break; |
2150 | } | 2151 | } |