mtd: mtdpart: break it as soon as we parse out the partitions
We may cause a memory leak when the @types has more then one parser. Take the `default_mtd_part_types` for example. The default_mtd_part_types has two parsers now: `cmdlinepart` and `ofpart`. Assume the following case: The kernel command line sets the partitions like: #gpmi-nand:20m(boot),20m(kernel),1g(rootfs),-(user) But the devicetree file(such as arch/arm/boot/dts/imx28-evk.dts) also sets the same partitions as the kernel command line does. In the current code, the partitions parsed out by the `ofpart` will overwrite the @pparts which has already set by the `cmdlinepart` parser, and the the partitions parsed out by the `cmdlinepart` is missed. A memory leak occurs. So we should break the code as soon as we parse out the partitions, In actually, this patch makes a priority order between the parsers. If one parser has already parsed out the partitions successfully, it's no need to use another parser anymore. Signed-off-by: Huang Shijie <shijie8@gmail.com> Cc: stable@vger.kernel.org Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
parent
d0788ce492
commit
c51803ddba
|
@ -711,6 +711,8 @@ static const char *default_mtd_part_types[] = {
|
||||||
* partition parsers, specified in @types. However, if @types is %NULL, then
|
* partition parsers, specified in @types. However, if @types is %NULL, then
|
||||||
* the default list of parsers is used. The default list contains only the
|
* the default list of parsers is used. The default list contains only the
|
||||||
* "cmdlinepart" and "ofpart" parsers ATM.
|
* "cmdlinepart" and "ofpart" parsers ATM.
|
||||||
|
* Note: If there are more then one parser in @types, the kernel only takes the
|
||||||
|
* partitions parsed out by the first parser.
|
||||||
*
|
*
|
||||||
* This function may return:
|
* This function may return:
|
||||||
* o a negative error code in case of failure
|
* o a negative error code in case of failure
|
||||||
|
@ -735,11 +737,12 @@ int parse_mtd_partitions(struct mtd_info *master, const char **types,
|
||||||
if (!parser)
|
if (!parser)
|
||||||
continue;
|
continue;
|
||||||
ret = (*parser->parse_fn)(master, pparts, data);
|
ret = (*parser->parse_fn)(master, pparts, data);
|
||||||
|
put_partition_parser(parser);
|
||||||
if (ret > 0) {
|
if (ret > 0) {
|
||||||
printk(KERN_NOTICE "%d %s partitions found on MTD device %s\n",
|
printk(KERN_NOTICE "%d %s partitions found on MTD device %s\n",
|
||||||
ret, parser->name, master->name);
|
ret, parser->name, master->name);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
put_partition_parser(parser);
|
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue