Hi,
> This unbreaks dfu mmc_file_op which is currently broken since using
> the load cmd on a buffer from heap is not allowed - added with
> commit aa3c609e2be5 ("fs: prevent overwriting reserved memory")
>
> Fixes: commit aa3c609e2be5 ("fs: prevent overwriting reserved memory")
> Reported-by: Stephen Warren <[email protected]>
> Signed-off-by: Simon Goldschmidt <[email protected]>
> Tested-by: Stephen Warren <[email protected]>
> ---Acked-by: Lukasz Majewski <[email protected]> > > Changes since RFC: > - decreased size of 'dev_part_str' to hold 'xxx:yyy' string > - removed now unused define 'DFU_CMD_BUF_SIZE' > > --- > drivers/dfu/dfu_mmc.c | 67 > ++++++++++++++++++++----------------------- include/dfu.h | > 1 - 2 files changed, 31 insertions(+), 37 deletions(-) > > diff --git a/drivers/dfu/dfu_mmc.c b/drivers/dfu/dfu_mmc.c > index b45e6dc54c..403fd5351d 100644 > --- a/drivers/dfu/dfu_mmc.c > +++ b/drivers/dfu/dfu_mmc.c > @@ -108,17 +108,17 @@ static int mmc_file_buffer(struct dfu_entity > *dfu, void *buf, long *len) static int mmc_file_op(enum dfu_op op, > struct dfu_entity *dfu, void *buf, u64 *len) > { > - const char *fsname, *opname; > - char cmd_buf[DFU_CMD_BUF_SIZE]; > - char *str_env; > + char dev_part_str[8]; > int ret; > + int fstype; > + loff_t size = 0; > > switch (dfu->layout) { > case DFU_FS_FAT: > - fsname = "fat"; > + fstype = FS_TYPE_FAT; > break; > case DFU_FS_EXT4: > - fsname = "ext4"; > + fstype = FS_TYPE_EXT; > break; > default: > printf("%s: Layout (%s) not (yet) supported!\n", > __func__, @@ -126,48 +126,43 @@ static int mmc_file_op(enum dfu_op > op, struct dfu_entity *dfu, return -1; > } > > + snprintf(dev_part_str, sizeof(dev_part_str), "%d:%d", > + dfu->data.mmc.dev, dfu->data.mmc.part); > + > + ret = fs_set_blk_dev("mmc", dev_part_str, fstype); > + if (ret) { > + puts("dfu: fs_set_blk_dev error!\n"); > + return ret; > + } > + > switch (op) { > case DFU_OP_READ: > - opname = "load"; > + ret = fs_read(dfu->name, (size_t)buf, 0, 0, &size); > + if (ret) { > + puts("dfu: fs_read error!\n"); > + return ret; > + } > + *len = size; > break; > case DFU_OP_WRITE: > - opname = "write"; > + ret = fs_write(dfu->name, (size_t)buf, 0, *len, > &size); > + if (ret) { > + puts("dfu: fs_write error!\n"); > + return ret; > + } > break; > case DFU_OP_SIZE: > - opname = "size"; > + ret = fs_size(dfu->name, &size); > + if (ret) { > + puts("dfu: fs_size error!\n"); > + return ret; > + } > + *len = size; > break; > default: > return -1; > } > > - sprintf(cmd_buf, "%s%s mmc %d:%d", fsname, opname, > - dfu->data.mmc.dev, dfu->data.mmc.part); > - > - if (op != DFU_OP_SIZE) > - sprintf(cmd_buf + strlen(cmd_buf), " %p", buf); > - > - sprintf(cmd_buf + strlen(cmd_buf), " %s", dfu->name); > - > - if (op == DFU_OP_WRITE) > - sprintf(cmd_buf + strlen(cmd_buf), " %llx", *len); > - > - debug("%s: %s 0x%p\n", __func__, cmd_buf, cmd_buf); > - > - ret = run_command(cmd_buf, 0); > - if (ret) { > - puts("dfu: Read error!\n"); > - return ret; > - } > - > - if (op != DFU_OP_WRITE) { > - str_env = env_get("filesize"); > - if (str_env == NULL) { > - puts("dfu: Wrong file size!\n"); > - return -1; > - } > - *len = simple_strtoul(str_env, NULL, 16); > - } > - > return ret; > } > > diff --git a/include/dfu.h b/include/dfu.h > index fbe978abdc..c671d8b04d 100644 > --- a/include/dfu.h > +++ b/include/dfu.h > @@ -80,7 +80,6 @@ struct sf_internal_data { > }; > > #define DFU_NAME_SIZE 32 > -#define DFU_CMD_BUF_SIZE 128 > #ifndef CONFIG_SYS_DFU_DATA_BUF_SIZE > #define CONFIG_SYS_DFU_DATA_BUF_SIZE > (1024*1024*8) /* 8 MiB */ #endif Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: [email protected]
pgpL07wOlFtSs.pgp
Description: OpenPGP digital signature
_______________________________________________ U-Boot mailing list [email protected] https://lists.denx.de/listinfo/u-boot

