mtd: cmdlinepart: fix the overflow of big mtd partitions
When the kernel parses the following cmdline #mtdparts=gpmi-nand:16m(boot),16m(kernel),1g(home),4g(test),-(usr) for a big nand chip Micron MT29F64G08AFAAAWP(8GB), we got the following wrong result: ............................................. "mtd: partition size too small (0)" ............................................. We can not get any partition. The "4g(test)" partition triggers a overflow of the "size". The memparse() returns 4g to the "size", but the size is "unsigned long" type, so a overflow occurs, the "size" becomes zero in the end. This patch changes the "size"/"offset" to "unsigned long long" type, and replaces the UINT_MAX with ULLONG_MAX for macros SIZE_REMAINING and OFFSET_CONTINUOUS. Signed-off-by: Huang Shijie <b32955@freescale.com> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
This commit is contained in:
parent
3e9ce49e0e
commit
6f9f59ee2e
@ -56,8 +56,8 @@
|
|||||||
|
|
||||||
|
|
||||||
/* special size referring to all the remaining space in a partition */
|
/* special size referring to all the remaining space in a partition */
|
||||||
#define SIZE_REMAINING UINT_MAX
|
#define SIZE_REMAINING ULLONG_MAX
|
||||||
#define OFFSET_CONTINUOUS UINT_MAX
|
#define OFFSET_CONTINUOUS ULLONG_MAX
|
||||||
|
|
||||||
struct cmdline_mtd_partition {
|
struct cmdline_mtd_partition {
|
||||||
struct cmdline_mtd_partition *next;
|
struct cmdline_mtd_partition *next;
|
||||||
@ -89,7 +89,7 @@ static struct mtd_partition * newpart(char *s,
|
|||||||
int extra_mem_size)
|
int extra_mem_size)
|
||||||
{
|
{
|
||||||
struct mtd_partition *parts;
|
struct mtd_partition *parts;
|
||||||
unsigned long size, offset = OFFSET_CONTINUOUS;
|
unsigned long long size, offset = OFFSET_CONTINUOUS;
|
||||||
char *name;
|
char *name;
|
||||||
int name_len;
|
int name_len;
|
||||||
unsigned char *extra_mem;
|
unsigned char *extra_mem;
|
||||||
@ -104,7 +104,8 @@ static struct mtd_partition * newpart(char *s,
|
|||||||
} else {
|
} else {
|
||||||
size = memparse(s, &s);
|
size = memparse(s, &s);
|
||||||
if (size < PAGE_SIZE) {
|
if (size < PAGE_SIZE) {
|
||||||
printk(KERN_ERR ERRP "partition size too small (%lx)\n", size);
|
printk(KERN_ERR ERRP "partition size too small (%llx)\n",
|
||||||
|
size);
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -296,7 +297,7 @@ static int parse_cmdline_partitions(struct mtd_info *master,
|
|||||||
struct mtd_partition **pparts,
|
struct mtd_partition **pparts,
|
||||||
struct mtd_part_parser_data *data)
|
struct mtd_part_parser_data *data)
|
||||||
{
|
{
|
||||||
unsigned long offset;
|
unsigned long long offset;
|
||||||
int i, err;
|
int i, err;
|
||||||
struct cmdline_mtd_partition *part;
|
struct cmdline_mtd_partition *part;
|
||||||
const char *mtd_id = master->name;
|
const char *mtd_id = master->name;
|
||||||
|
Loading…
Reference in New Issue
Block a user