mtd: mtdpart: fix uninitialized erasesize on MTDPART_OFS_RETAIN error path
PATCH 1/1 mtd: mtdpart: fix uninitialized erasesize on MTDPART_OFS_RETAIN error path
When parsing partition layouts, if a partition requested with MTDPART_OFS_RETAIN runs out of space, the allocator jumps directly to 'out_register' to preserve partition numbering.
However, this jump bypasses child->erasesize initialization, leaving it at zero. When add_mtd_device() is later called on this child, the registration fails and triggers a WARN_ON() due to the zero ->erasesize.
Fix this by zeroing out child->part.offset and child->part.size, and initializing child->erasesize to parent->erasesize. This is the exact same pattern already used just a few lines below in the "out of reach" error check (child->part.offset >= parent_size) to safely register a disabled partition.
--- drivers/mtd/mtdpart.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/mtd/mtdpart.c +3 -0
@@ -118,6 +118,9 @@ static struct mtd_info *allocate_partition(struct mtd_info *parent, part->name, parent_size - child->part.offset, child->part.size);/* register to preserve ordering */ + child->part.offset =0 ; + child->part.size =0 ; + child->erasesize = parent->erasesize; goto out_register; } }
Signature · 1 line
2.43.0
Quoted 9 lines · Nikolay Ivchenko
When parsing partition layouts, if a partition requested with
MTDPART_OFS_RETAINruns out of space, the allocator jumps directly to 'out_register' to preserve partition numbering.However, this jump bypasses
child->erasesizeinitialization, leaving it at zero. Whenadd_mtd_device()is later called on this child, the registration fails and triggers aWARN_ON()due to the zero ->erasesize.[...]
Applied to mtd/fixes, thanks!
[1/1] mtd: mtdpart: fix uninitialized erasesize on MTDPART_OFS_RETAIN error path
commit: ae9d8058f13238cad5f5d16f676da91187684581
Patche(s) should be available on mtd/linux.git and will be part of the next PR (provided that no robot complains by then).
Kind regards,
Miquèl