Re: [PATCH] mtd: part: reject MTDPART_OFS_RETAIN in mtd_add_partition()

Zhihao Cheng <[email protected]>
Newsgroups org.infradead.lists.linux-mtd,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
在 2026/7/16 21:14, zhouminqiang 写道:
> mtd_add_partition() does not reject the special offset value
> MTDPART_OFS_RETAIN (-3), which leads to a WARN_ON in
> add_mtd_device() when called through the BLKPG ioctl on NAND
> devices. The RETAIN value depends on cur_offset being the end of
> the previous partition, but in the dynamic partition path
> cur_offset equals the offset argument itself, causing undefined
> behavior.
> 
> Commit 5daa7b21496a ("mtd: prepare partition add and del functions
> for ioctl requests") introduced mtd_add_partition() and correctly
> rejected MTDPART_OFS_APPEND (-1) and MTDPART_OFS_NXTBLK (-2),
> since those special offsets rely on cur_offset tracking the
> previous partition's end. However, commit 1a31368bf92e ("mtd: add a flags
> for partitions which should just leave smth. after them")
> later added MTDPART_OFS_RETAIN (-3) for the static
> partition table path without updating mtd_add_partition() to
> also reject this value.
> 
> With offset=-3 passed via BLKPG, the RETAIN size calculation in
> allocate_partition() underflows (parent_size - 0xFFFFFFFFFFFFFFFD
> = parent_size + 3). If the underflow result does not appear to
> leave enough space, allocate_partition() jumps to out_register via
> goto, skipping erasesize initialization. This results in
> erasesize=0, which triggers:
> 
> WARN_ON((!mtd->erasesize || !master->_erase) &&
> 		!(mtd->flags & MTD_NO_ERASE))
> 
> in add_mtd_device(). If the underflow result appears to leave
> enough space, a bogus partition size is calculated, but the
> "out of reach" sanity check catches the invalid offset and
> creates a disabled empty partition (offset=0, size=0) instead
> of returning an error.
> 
> Fix this by adding MTDPART_OFS_RETAIN to the rejection list in
> mtd_add_partition(), consistent with the existing handling of
> APPEND and NXTBLK.
> 
> Fixes: 1a31368bf92e ("mtd: add a flags for partitions which should just leave smth. after them")
> 
> Signed-off-by: zhouminqiang <[email protected]>
> ---
>   drivers/mtd/mtdpart.c | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)

Reviewed-by: Zhihao Cheng <[email protected]>
> 
> diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
> index 795a94e6b482..11cab777a1ac 100644
> --- a/drivers/mtd/mtdpart.c
> +++ b/drivers/mtd/mtdpart.c
> @@ -255,7 +255,8 @@ int mtd_add_partition(struct mtd_info *parent, const char *name,
>   
>   	/* the direct offset is expected */
>   	if (offset == MTDPART_OFS_APPEND ||
> -	    offset == MTDPART_OFS_NXTBLK)
> +	    offset == MTDPART_OFS_NXTBLK ||
> +	    offset == MTDPART_OFS_RETAIN)
>   		return -EINVAL;
>   
>   	if (length == MTDPART_SIZ_FULL)
> 


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.