Commit 1f92c074cbb53debc7ad31073dc7895d8a2aa44e

Authored by Simon Goldschmidt
Committed by Tom Rini
1 parent 552452f80c

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

Fixes: commit aa3c609e2be5 ("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>

Showing 2 changed files with 31 additions and 37 deletions Side-by-side Diff

drivers/dfu/dfu_mmc.c
... ... @@ -108,17 +108,17 @@
108 108 static int mmc_file_op(enum dfu_op op, struct dfu_entity *dfu,
109 109 void *buf, u64 *len)
110 110 {
111   - const char *fsname, *opname;
112   - char cmd_buf[DFU_CMD_BUF_SIZE];
113   - char *str_env;
  111 + char dev_part_str[8];
114 112 int ret;
  113 + int fstype;
  114 + loff_t size = 0;
115 115  
116 116 switch (dfu->layout) {
117 117 case DFU_FS_FAT:
118   - fsname = "fat";
  118 + fstype = FS_TYPE_FAT;
119 119 break;
120 120 case DFU_FS_EXT4:
121   - fsname = "ext4";
  121 + fstype = FS_TYPE_EXT;
122 122 break;
123 123 default:
124 124 printf("%s: Layout (%s) not (yet) supported!\n", __func__,
125 125  
126 126  
127 127  
128 128  
... ... @@ -126,46 +126,41 @@
126 126 return -1;
127 127 }
128 128  
  129 + snprintf(dev_part_str, sizeof(dev_part_str), "%d:%d",
  130 + dfu->data.mmc.dev, dfu->data.mmc.part);
  131 +
  132 + ret = fs_set_blk_dev("mmc", dev_part_str, fstype);
  133 + if (ret) {
  134 + puts("dfu: fs_set_blk_dev error!\n");
  135 + return ret;
  136 + }
  137 +
129 138 switch (op) {
130 139 case DFU_OP_READ:
131   - opname = "load";
  140 + ret = fs_read(dfu->name, (size_t)buf, 0, 0, &size);
  141 + if (ret) {
  142 + puts("dfu: fs_read error!\n");
  143 + return ret;
  144 + }
  145 + *len = size;
132 146 break;
133 147 case DFU_OP_WRITE:
134   - opname = "write";
  148 + ret = fs_write(dfu->name, (size_t)buf, 0, *len, &size);
  149 + if (ret) {
  150 + puts("dfu: fs_write error!\n");
  151 + return ret;
  152 + }
135 153 break;
136 154 case DFU_OP_SIZE:
137   - opname = "size";
  155 + ret = fs_size(dfu->name, &size);
  156 + if (ret) {
  157 + puts("dfu: fs_size error!\n");
  158 + return ret;
  159 + }
  160 + *len = size;
138 161 break;
139 162 default:
140 163 return -1;
141   - }
142   -
143   - sprintf(cmd_buf, "%s%s mmc %d:%d", fsname, opname,
144   - dfu->data.mmc.dev, dfu->data.mmc.part);
145   -
146   - if (op != DFU_OP_SIZE)
147   - sprintf(cmd_buf + strlen(cmd_buf), " %p", buf);
148   -
149   - sprintf(cmd_buf + strlen(cmd_buf), " %s", dfu->name);
150   -
151   - if (op == DFU_OP_WRITE)
152   - sprintf(cmd_buf + strlen(cmd_buf), " %llx", *len);
153   -
154   - debug("%s: %s 0x%p\n", __func__, cmd_buf, cmd_buf);
155   -
156   - ret = run_command(cmd_buf, 0);
157   - if (ret) {
158   - puts("dfu: Read error!\n");
159   - return ret;
160   - }
161   -
162   - if (op != DFU_OP_WRITE) {
163   - str_env = env_get("filesize");
164   - if (str_env == NULL) {
165   - puts("dfu: Wrong file size!\n");
166   - return -1;
167   - }
168   - *len = simple_strtoul(str_env, NULL, 16);
169 164 }
170 165  
171 166 return ret;
... ... @@ -80,7 +80,6 @@
80 80 };
81 81  
82 82 #define DFU_NAME_SIZE 32
83   -#define DFU_CMD_BUF_SIZE 128
84 83 #ifndef CONFIG_SYS_DFU_DATA_BUF_SIZE
85 84 #define CONFIG_SYS_DFU_DATA_BUF_SIZE (1024*1024*8) /* 8 MiB */
86 85 #endif