From 20b71340bce49b85f5bbaf4393ce0adcbd704fbc Mon Sep 17 00:00:00 2001 From: Alasdair Kergon Date: Fri, 28 Apr 2006 17:25:54 +0000 Subject: [PATCH] validate region size against page size --- tools/lvconvert.c | 10 +++++++++- tools/lvcreate.c | 8 ++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/tools/lvconvert.c b/tools/lvconvert.c index 10c9f9567..2d57eccff 100644 --- a/tools/lvconvert.c +++ b/tools/lvconvert.c @@ -102,6 +102,7 @@ static int _read_params(struct lvconvert_params *lp, struct cmd_context *cmd, int argc, char **argv) { int region_size; + int pagesize = getpagesize(); memset(lp, 0, sizeof(*lp)); @@ -188,13 +189,20 @@ static int _read_params(struct lvconvert_params *lp, struct cmd_context *cmd, lp->region_size = region_size; } + if (lp->region_size % (pagesize >> SECTOR_SHIFT)) { + log_error("Region size (%" PRIu32 ") must be " + "a multiple of machine memory " + "page size (%d)", + lp->region_size, pagesize >> SECTOR_SHIFT); + return 0; + } + if (lp->region_size & (lp->region_size - 1)) { log_error("Region size (%" PRIu32 ") must be a power of 2", lp->region_size); return 0; } - if (!lp->region_size) { log_error("Non-zero region size must be supplied."); return 0; diff --git a/tools/lvcreate.c b/tools/lvcreate.c index 414987241..f19117458 100644 --- a/tools/lvcreate.c +++ b/tools/lvcreate.c @@ -235,6 +235,7 @@ static int _read_mirror_params(struct lvcreate_params *lp, { int argc = *pargc; int region_size; + int pagesize = getpagesize(); if (argc && (unsigned) argc < lp->mirrors) { log_error("Too few physical volumes on " @@ -266,6 +267,13 @@ static int _read_mirror_params(struct lvcreate_params *lp, return 0; } + if (lp->region_size % (pagesize >> SECTOR_SHIFT)) { + log_error("Region size (%" PRIu32 ") must be a multiple of " + "machine memory page size (%d)", + lp->region_size, pagesize >> SECTOR_SHIFT); + return 0; + } + if (!lp->region_size) { log_error("Non-zero region size must be supplied."); return 0;