From 19e6dd7e4106be79b824780c491e9445a9a45512 Mon Sep 17 00:00:00 2001 From: resver Date: Fri, 25 Jan 2013 17:46:10 +0000 Subject: [PATCH] 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. git-svn-id: http://exfat.googlecode.com/svn/trunk@336 60bc1c72-a15a-11de-b98f-4500b42dc123 --- fuse/main.c | 18 ++++++++++++------ libexfat/io.c | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/fuse/main.c b/fuse/main.c index 1527347..b939164 100644 --- a/fuse/main.c +++ b/fuse/main.c @@ -155,19 +155,25 @@ static int fuse_exfat_release(const char* path, struct fuse_file_info* fi) 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) diff --git a/libexfat/io.c b/libexfat/io.c index 1a555b9..4413aaa 100644 --- a/libexfat/io.c +++ b/libexfat/io.c @@ -341,7 +341,7 @@ ssize_t exfat_generic_pread(const struct exfat* ef, struct exfat_node* node, } 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, -- 2.11.0