summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Kagstrom <simon.kagstrom@netinsight.net>2009-11-03 07:08:41 +0100
committerDavid Woodhouse <David.Woodhouse@intel.com>2009-11-30 13:02:02 +0100
commit1114e3d00f539ecb7a8415663f2a47a80e00a537 (patch)
tree34f384aa267d9e31eee029bf9061cf148907ea7d
parentmtd: mtdoops: keep track of used/unused pages in an array (diff)
downloadlinux-1114e3d00f539ecb7a8415663f2a47a80e00a537.tar.xz
linux-1114e3d00f539ecb7a8415663f2a47a80e00a537.zip
mtd: mtdoops: limit the maximum mtd partition size
Make the maximum mtdoops partition size to be 8MiB. Indeed, it does not make sense to use anything larger than that anyway. This limit makes it possible to catch stupid mistakes where the user gives e.g., a rootfs partition to mtdoops (which will happily erase it). Signed-off-by: Simon Kagstrom <simon.kagstrom@netinsight.net> Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
-rw-r--r--drivers/mtd/mtdoops.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/drivers/mtd/mtdoops.c b/drivers/mtd/mtdoops.c
index 06c538249455..b016eee18657 100644
--- a/drivers/mtd/mtdoops.c
+++ b/drivers/mtd/mtdoops.c
@@ -33,6 +33,9 @@
#include <linux/interrupt.h>
#include <linux/mtd/mtd.h>
+/* Maximum MTD partition size */
+#define MTDOOPS_MAX_MTD_SIZE (8 * 1024 * 1024)
+
#define MTDOOPS_KERNMSG_MAGIC 0x5d005d00
#define OOPS_PAGE_SIZE 4096
@@ -310,6 +313,12 @@ static void mtdoops_notify_add(struct mtd_info *mtd)
return;
}
+ if (mtd->size > MTDOOPS_MAX_MTD_SIZE) {
+ printk(KERN_ERR "mtdoops: mtd%d is too large (limit is %d MiB)\n",
+ mtd->index, MTDOOPS_MAX_MTD_SIZE / 1024 / 1024);
+ return;
+ }
+
/* oops_page_used is a bit field */
cxt->oops_page_used = vmalloc(DIV_ROUND_UP(mtdoops_pages,
BITS_PER_LONG));
@@ -317,14 +326,10 @@ static void mtdoops_notify_add(struct mtd_info *mtd)
printk(KERN_ERR "Could not allocate page array\n");
return;
}
- cxt->mtd = mtd;
- if (mtd->size > INT_MAX)
- cxt->oops_pages = INT_MAX / OOPS_PAGE_SIZE;
- else
- cxt->oops_pages = (int)mtd->size / OOPS_PAGE_SIZE;
+ cxt->mtd = mtd;
+ cxt->oops_pages = (int)mtd->size / OOPS_PAGE_SIZE;
find_next_position(cxt);
-
printk(KERN_INFO "mtdoops: Attached to MTD device %d\n", mtd->index);
}