dfu: mmc: call fs functions instead of run_command

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 aa3c609e2b ("fs: prevent overwriting reserved memory")

Fixes: commit aa3c609e2b ("fs: prevent overwriting reserved memory")
Reported-by: Stephen Warren <swarren@wwwdotorg.org>
Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com>
Tested-by: Stephen Warren <swarren@nvidia.com>
Acked-by: Lukasz Majewski <lukma@denx.de>
This commit is contained in:
Simon Goldschmidt 2019-01-25 19:58:01 +01:00 committed by Tom Rini
parent 552452f80c
commit 1f92c074cb
2 changed files with 34 additions and 40 deletions

View File

@ -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, static int mmc_file_op(enum dfu_op op, struct dfu_entity *dfu,
void *buf, u64 *len) void *buf, u64 *len)
{ {
const char *fsname, *opname; char dev_part_str[8];
char cmd_buf[DFU_CMD_BUF_SIZE];
char *str_env;
int ret; int ret;
int fstype;
loff_t size = 0;
switch (dfu->layout) { switch (dfu->layout) {
case DFU_FS_FAT: case DFU_FS_FAT:
fsname = "fat"; fstype = FS_TYPE_FAT;
break; break;
case DFU_FS_EXT4: case DFU_FS_EXT4:
fsname = "ext4"; fstype = FS_TYPE_EXT;
break; break;
default: default:
printf("%s: Layout (%s) not (yet) supported!\n", __func__, printf("%s: Layout (%s) not (yet) supported!\n", __func__,
@ -126,46 +126,41 @@ static int mmc_file_op(enum dfu_op op, struct dfu_entity *dfu,
return -1; return -1;
} }
switch (op) { snprintf(dev_part_str, sizeof(dev_part_str), "%d:%d",
case DFU_OP_READ: dfu->data.mmc.dev, dfu->data.mmc.part);
opname = "load";
break;
case DFU_OP_WRITE:
opname = "write";
break;
case DFU_OP_SIZE:
opname = "size";
break;
default:
return -1;
}
sprintf(cmd_buf, "%s%s mmc %d:%d", fsname, opname, ret = fs_set_blk_dev("mmc", dev_part_str, fstype);
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) { if (ret) {
puts("dfu: Read error!\n"); puts("dfu: fs_set_blk_dev error!\n");
return ret; return ret;
} }
if (op != DFU_OP_WRITE) { switch (op) {
str_env = env_get("filesize"); case DFU_OP_READ:
if (str_env == NULL) { ret = fs_read(dfu->name, (size_t)buf, 0, 0, &size);
puts("dfu: Wrong file size!\n"); if (ret) {
return -1; puts("dfu: fs_read error!\n");
return ret;
} }
*len = simple_strtoul(str_env, NULL, 16); *len = size;
break;
case DFU_OP_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:
ret = fs_size(dfu->name, &size);
if (ret) {
puts("dfu: fs_size error!\n");
return ret;
}
*len = size;
break;
default:
return -1;
} }
return ret; return ret;

View File

@ -80,7 +80,6 @@ struct sf_internal_data {
}; };
#define DFU_NAME_SIZE 32 #define DFU_NAME_SIZE 32
#define DFU_CMD_BUF_SIZE 128
#ifndef CONFIG_SYS_DFU_DATA_BUF_SIZE #ifndef CONFIG_SYS_DFU_DATA_BUF_SIZE
#define CONFIG_SYS_DFU_DATA_BUF_SIZE (1024*1024*8) /* 8 MiB */ #define CONFIG_SYS_DFU_DATA_BUF_SIZE (1024*1024*8) /* 8 MiB */
#endif #endif