summaryrefslogtreecommitdiffstats
path: root/0005-fs-fix-generic-save-command-implementation.patch
diff options
context:
space:
mode:
Diffstat (limited to '0005-fs-fix-generic-save-command-implementation.patch')
-rw-r--r--0005-fs-fix-generic-save-command-implementation.patch90
1 files changed, 90 insertions, 0 deletions
diff --git a/0005-fs-fix-generic-save-command-implementation.patch b/0005-fs-fix-generic-save-command-implementation.patch
new file mode 100644
index 0000000..a145969
--- /dev/null
+++ b/0005-fs-fix-generic-save-command-implementation.patch
@@ -0,0 +1,90 @@
+From df7441a7de1a5702c4deed9195c24c8803b7508c Mon Sep 17 00:00:00 2001
+From: Stephen Warren <swarren@nvidia.com>
+Date: Thu, 23 Jan 2014 12:56:56 -0700
+Subject: [PATCH 05/13] fs: fix generic save command implementation
+
+Fix a few issues with the generic "save" shell command, and fs_write()
+function.
+
+1) fstypes[].write wasn't filled in for some file-systems, and isn't
+ checked when used, which could cause crashes/... if executing save
+ on e.g. fat/ext filesystems.
+
+2) fs_write() requires the length argument to be non-zero, since it needs
+ to know exactly how many bytes to write. Adjust the comments and code
+ according to this.
+
+3) fs_write() wasn't prototyped in <fs.h> like other generic functions;
+ other code should be able to call this directly rather than invoking
+ the "save" shell command.
+
+Cc: Simon Glass <sjg@chromium.org>
+Signed-off-by: Stephen Warren <swarren@nvidia.com>
+Acked-by: Simon Glass <sjg@chromium.org>
+---
+ fs/fs.c | 9 +++------
+ include/fs.h | 10 ++++++++++
+ 2 files changed, 13 insertions(+), 6 deletions(-)
+
+diff --git a/fs/fs.c b/fs/fs.c
+index be1855d..9c2ef6b 100644
+--- a/fs/fs.c
++++ b/fs/fs.c
+@@ -75,6 +75,7 @@ static struct fstype_info fstypes[] = {
+ .close = fat_close,
+ .ls = file_fat_ls,
+ .read = fat_read_file,
++ .write = fs_write_unsupported,
+ },
+ #endif
+ #ifdef CONFIG_FS_EXT4
+@@ -84,6 +85,7 @@ static struct fstype_info fstypes[] = {
+ .close = ext4fs_close,
+ .ls = ext4fs_ls,
+ .read = ext4_read_file,
++ .write = fs_write_unsupported,
+ },
+ #endif
+ #ifdef CONFIG_SANDBOX
+@@ -212,16 +214,11 @@ int fs_write(const char *filename, ulong addr, int offset, int len)
+ void *buf;
+ int ret;
+
+- /*
+- * We don't actually know how many bytes are being read, since len==0
+- * means read the whole file.
+- */
+ buf = map_sysmem(addr, len);
+ ret = info->write(filename, buf, offset, len);
+ unmap_sysmem(buf);
+
+- /* If we requested a specific number of bytes, check we got it */
+- if (ret >= 0 && len && ret != len) {
++ if (ret >= 0 && ret != len) {
+ printf("** Unable to write file %s **\n", filename);
+ ret = -1;
+ }
+diff --git a/include/fs.h b/include/fs.h
+index 7d9403e..97b0094 100644
+--- a/include/fs.h
++++ b/include/fs.h
+@@ -55,6 +55,16 @@ int fs_ls(const char *dirname);
+ int fs_read(const char *filename, ulong addr, int offset, int len);
+
+ /*
++ * Write file "filename" to the partition previously set by fs_set_blk_dev(),
++ * from address "addr", starting at byte offset "offset", and writing "len"
++ * bytes. "offset" may be 0 to write to the start of the file. Note that not
++ * all filesystem types support offset!=0.
++ *
++ * Returns number of bytes read on success. Returns <= 0 on error.
++ */
++int fs_write(const char *filename, ulong addr, int offset, int len);
++
++/*
+ * Common implementation for various filesystem commands, optionally limited
+ * to a specific filesystem type via the fstype parameter.
+ */
+--
+1.8.5.3
+