+++ /dev/null
-Fixed "Operation not permitted" error on reading an empty file: FUSE read/write
-ops should return a number of bytes actually read/written or -errno on error.
-Picked from upstream svn r336.
-Index: fuse-exfat/fuse/main.c
-===================================================================
---- fuse-exfat.orig/fuse/main.c 2013-01-25 22:26:15.309086812 +0100
-+++ fuse-exfat/fuse/main.c 2013-01-25 22:26:20.093086638 +0100
-@@ -155,19 +155,25 @@
- static int fuse_exfat_read(const char* path, char* buffer, size_t size,
- off_t offset, struct fuse_file_info* fi)
- {
-+ ssize_t ret;
-+
- exfat_debug("[%s] %s (%zu bytes)", __func__, path, size);
-- if (exfat_generic_pread(&ef, get_node(fi), buffer, size, offset) != size)
-- return EOF;
-- return size;
-+ ret = exfat_generic_pread(&ef, get_node(fi), buffer, size, offset);
-+ if (ret < 0)
-+ return -EIO;
-+ return ret;
- }
-
- static int fuse_exfat_write(const char* path, const char* buffer, size_t size,
- off_t offset, struct fuse_file_info* fi)
- {
-+ ssize_t ret;
-+
- exfat_debug("[%s] %s (%zu bytes)", __func__, path, size);
-- if (exfat_generic_pwrite(&ef, get_node(fi), buffer, size, offset) != size)
-- return EOF;
-- return size;
-+ ret = exfat_generic_pwrite(&ef, get_node(fi), buffer, size, offset);
-+ if (ret < 0)
-+ return -EIO;
-+ return ret;
- }
-
- static int fuse_exfat_unlink(const char* path)
-Index: fuse-exfat/libexfat/io.c
-===================================================================
---- fuse-exfat.orig/libexfat/io.c 2013-01-25 22:26:15.309086812 +0100
-+++ fuse-exfat/libexfat/io.c 2013-01-25 22:26:20.093086638 +0100
-@@ -341,7 +341,7 @@
- }
- if (!ef->ro && !ef->noatime)
- exfat_update_atime(node);
-- return size - remainder;
-+ return MIN(size, node->size - offset) - remainder;
- }
-
- ssize_t exfat_generic_pwrite(struct exfat* ef, struct exfat_node* node,
+++ /dev/null
-Fixed unexpected removal of a directory if it is moved into itself: return
-EINVAL in this situation. It also happens when trying to change directory name
-case.
-Picked from upstream svn r337.
-Index: fuse-exfat/libexfat/node.c
-===================================================================
---- fuse-exfat.orig/libexfat/node.c 2013-01-25 22:12:09.529117673 +0100
-+++ fuse-exfat/libexfat/node.c 2013-01-25 22:22:56.473094067 +0100
-@@ -905,6 +905,23 @@
- exfat_put_node(ef, node);
- return rc;
- }
-+
-+ /* check that target is not a subdirectory of the source */
-+ if (node->flags & EXFAT_ATTRIB_DIR)
-+ {
-+ struct exfat_node* p;
-+
-+ for (p = dir; p; p = p->parent)
-+ if (node == p)
-+ {
-+ if (existing != NULL)
-+ exfat_put_node(ef, existing);
-+ exfat_put_node(ef, dir);
-+ exfat_put_node(ef, node);
-+ return -EINVAL;
-+ }
-+ }
-+
- if (existing != NULL)
- {
- /* remove target if it's not the same node as source */