HI
On Tue, Dec 16, 2025 at 2:41 PM Peter Suti
<[email protected]> wrote:
>
> When the 'mtd read' command is issued with an offset but no size (argc=1),
> the length defaults to the full partition size ('mtd->size').
>
> This calculation is incorrect because reading 'mtd->size' bytes starting
> from a non-zero offset results in a read request that extends past the
> end of the partition. This causes the MTD layer to return error -22
> (EINVAL).
>
> Fix the default length calculation to be 'mtd->size - offset' so that
> reads starting from an offset effectively read "to the end of the
> partition" rather than attempting to read out of bounds.
>
> Signed-off-by: Peter Suti <[email protected]>
> [add {} for better readability]
> Signed-off-by: Radek Dostál <[email protected]>
> ---
> cmd/mtd.c | 10 +++++++++-
> 1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/cmd/mtd.c b/cmd/mtd.c
> index 1d1845bce44..9f6e3226c15 100644
> --- a/cmd/mtd.c
> +++ b/cmd/mtd.c
> @@ -519,7 +519,15 @@ static int do_mtd_io(struct cmd_tbl *cmdtp, int flag,
> int argc,
> goto out_put_mtd;
> }
>
> - default_len = dump ? mtd->writesize : mtd->size;
> + if (dump) {
> + default_len = mtd->writesize;
> + } else {
> + if (start_off < mtd->size)
> + default_len = mtd->size - start_off;
> + else
> + default_len = 0;
Should it fail if the requested offset is bigger than mtd->size
Michael
> + }
> +
> len = argc > 1 ? hextoul(argv[1], NULL) : default_len;
> if (!mtd_is_aligned_with_min_io_size(mtd, len)) {
> len = round_up(len, mtd->writesize);
> --
> 2.43.0
>
--
Michael Nazzareno Trimarchi
Co-Founder & Chief Executive Officer
M. +39 347 913 2170
[email protected]
__________________________________
Amarula Solutions BV
Joop Geesinkweg 125, 1114 AB, Amsterdam, NL
T. +31 (0)85 111 9172
[email protected]
www.amarulasolutions.com