aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/md.c
diff options
context:
space:
mode:
authorAndre Noll <maan@systemlinux.org>2008-07-21 00:42:07 -0400
committerNeilBrown <neilb@suse.de>2008-07-21 00:42:07 -0400
commitd07bd3bcc456228b56a790897162a634691fed9b (patch)
treecabb0feee45a7b3383fff4202adc35793c8bdbb1 /drivers/md/md.c
parentd7027458d68b2f1752a28016dcf2ffd0a7e8f567 (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.c5
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 }